Joomla 3 и magic_quotes_gpc

По долгу службы автор работает с популярными CMS, использующими php. Некоторое время назад автор столкнулся с проблемой: Joomla третьей версии не хотела инсталлироваться на виртуальном хостинге. Ругалась она на magic_quotes_gpc.

После тридцати минут бдения в гугле и над кодами Jooml’ы, временное решение было найдено.

Изначально подозрение пало на неверную настройку веб-сервера, но через две минуты подозрение не подтвердилось.

На странице сайта, которая выводила результат отработки функции phpinfo по поиску «magic_quotes_gpc» можно было заметить значение «Off» для «Local Value» переменной magic_quotes_gpc. Учитывая факт приоритета «Local Value» над «Master Value», можно сделать вывод: Joomla третьей версии не совсем корректно обрабатывает данные php-переменных.

То есть, это проблема внутри инсталлятора CMS. Чтобы она была исправлена, нужно обратиться к разработчикам Joomla и указать на ошибку. В случае автора последнее не представлялось возможным, поэтому проблему было решено устранить собственноручным вмешательством в код Joomla.

Гугл подсказал верное направление для копания.

В файле installation/models/setup.php закомментировать код
// Check for magic quotes gpc.
$option = new stdClass;
$option->label = JText::_(‘INSTL_MAGIC_QUOTES_GPC’);
$option->state = (ini_get(‘magic_quotes_gpc’) == false);
$option->notice = null;
$options[] = $option;

Это действие не даст joomla проверять параметр magic_quotes_gpc вообще. Но, из-за этого
могут случиться различные казусы, типа двойных кавычек при добавлении какой-либо
информации на сайт. Поэтому далее нужно внести некоторые изменения в ядро joomla.

В файле libraries/joomla/filter/input.php нужно найти функцию:
public function clean($source, $type = ‘string’)
{
// Handle the type constraint
switch (strtoupper($type))
{…
}

И добавить перед return в самом конце функции слудующий код:
// Handle magic quotes compatibility
if(get_magic_quotes_gpc()) $result = self::_stripSlashesRecursive($result);

Теперь в конце этого же файла добавляем описание функции _stripSlashesRecursive:

protected static function _stripSlashesRecursive($value)
{
$value = is_array($value) ? array_map(array(‘JFilterInput’, ‘_stripSlashesRecursive’),
$value) : stripslashes($value);
return $value;
}

После выполнения этих действий, инсталляция будет возможна. Это, конечно, «костыль», но на текущий момент иного решения проблемы найдено не было.