Похожие статьи

Исправление JA Comment для совеместимости с PHP 8 и Joomla 4

Обновление на PHP 8 ( поддержка PHP7 уже завершена) и Joomla 4 (та же причина) приперли к стене многих, но многие сталкиваются с проблемой несовместимости старых расширений для Joomla с новой версией, а многие и вовсе уже не поддерживаются и не обновляются. К таким и относится JA Comment - расширение...

Исправляем ошибку ja_comment с PHP 7.2

После перехода на PHP 7.2, при администрировании ja_comment в Joomla появляется ошибка в строке 1157 Warning: count(): Parameter must be an array or an object that implements Countable ошибка проявилась из-за изменения поведения функции count() для неисчислимых элементов, в том числе пустых или несуществующих

[Hack] Один материал в нескольких категориях для Joomla 2.5 (мультикатегории)

Обратились ко мне в очередной раз помощью на тему мультикатегорий для Joomla 2.5, также как и в случае с мультикатегориями для Joomla 1.5, только заказчик...

Последние обновления

Монтируем EXT2, EXT3, EXT4 в Mac OS

Mac OS самостоятельно работать с файловой системой Linux, таких как EXT2, EXT3, EXT4, не может. Для решения этой проблемы есть платное решение extFS от Paragon, но есть и бесплатный вариант для тех кто не боится командной строки. Для этого нам понадобиться приложение fuse-ext2.

Установка Windows 11 без интернета или без учетной записи Microsoft

Windows 11 при первичном запуске требует подключения интернета и учётной записи Microsoft, но на практике бывают ситуации когда нет интернета или нет желания использовать учетную запись Microsoft. Например, в моём случае при подключении WiFi выдавало сообщение "oops you've lost internet connection".

Автоматизация получения бесплатных SSL сертификатов на хостинге RUCENTER

Можно долго ругаться на RUCENTER за нежелание дать клиентам виртуального хостинга бесплатные SSL сертификаты, но воз и ныне  там. В связи с этим пользователям остается либо уходить на другой хостинг, либо оставаться без HTTPS протокола и наблюдать неприятные пометки о небезопасности...

Адаптация сайта под PHP 5.4 и выше

Проблема перехода на последние версии PHP в том, что они решили упразднить большую кучу старого кода, который ради совместимости тянули много лет. Но, не смотря на потерю совместимости с большим количеством старых движком, PHP стал работать в разы быстрее и это очень большой плюс для многих. Я же попробую описать основные проблемы, с которыми столкнётся большинство при переносе своего сайта на новые версии PHP.

Для начала, нам надо включить отображение ошибок, чтобы мы знали что вообще надо исправлять, тем более, что довольно часто, мы вместо картинки будем видеть белый экран. Для этого находим в корне нашего сайта файл .htaccess добавим следующую строку

php_value display_errors 1

А если и после этого будете видеть белий лист без ошибок, то добавьте в ваш стартовый файл следующий PHP код:

error_reporting  (E_ALL);

Теперь посмотрим на типовые ошибки, которые мы можем получить и как их исправлять:

Strict Standards: Non-static method CModule::_GetCache()

для решения этой проблемы нам надо объявить функцию _GetCache() статичной. Для этого лучше всего воспользоваться поиском файлов по содержимому и искать нам придется, в данном случае, следующее:

function _GetCache

когда найдём данную функцию, надо её заменить на

static function _GetCache

Function ereg_replace() is deprecated

меняем подобные функции

ereg_replace("lang=[^&]*&*", "", $QUERY_STRING);

на

preg_replace("/lang=[^&]*&*/", "", $QUERY_STRING);

Function eregi_replace() is deprecated

аналогично предыдущему, но с модификатором "i"

preg_replace("/lang=[^&]*&*/i", "", $QUERY_STRING);

Function ereg() is deprecated

меняем подобные функции

ereg("<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>", $src);

на

preg_match("/<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>/", $src);

Function eregi() is deprecated

меняем

eregi('<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>', $src)

на preg_match с модификатором "i"

preg_match('/<script[[:space:]]+language[[:space:]]*=[[:space:]]*["\']*php["\']*[[:space:]]*>/i', $src)

Strict Standards: Only variables should be passed by reference

Ищем в указаном файле нужную строчку

CCurrency::GetList(($by="SORT"), ($order="ASC"));

и оставляем только сами переменные, а значение выносим выше

$by="SORT"; $order="ASC";
 CCurrency::GetList($by, $order);

Strict Standards: mktime()

ну тут всё просто, меняем везде функцию

mktime()

на

 time() 

Fatal error: Call-time pass-by-reference has been removed

здесь всё дело комбинации"&$". Суть в том, что использовать такую функцию при создании функции можно, а вот при обращении к функции нельзя.

То бишь амперсанды тут

function GetFilterTypeList(&$arrUSER)

мы оставляем, а вот тут

return CFormField::GetFilterTypeList(&$arrUSER);

надо убрать

preg_replace(): The /e modifier is deprecated

это, наверное, самая противная проблема, поскольку придется вместо прямой передачи в функцию, писать ещё одну функцию делающую это... таким образом все функции preg_replace с модификатором "e":

$str = preg_replace("#\x03([^\n\x03]+?)\x03#ies", "convert_to_mailto('\\1', '$link_class')", $str);

надо менять на

$str = preg_replace_callback("#\x03([^\n\x03]+?)\x03#is", function( $t ) use ($link_class) { return convert_to_mailto( $t[1], $link_class ); }, $str);

Отсутствие русского текста

С данной проблемой столкнутся все, у кого сайт работает в кодировке cp1251. Проблема тут в том, что начиная с PHP 5.4 функция htmlspecialchars() по умолчанию стала работать в кодировке UTF-8. Выходов в данной ситуации два:

1 - если почти все тексты сайта находятся в БД, а интерфейс сайта использует языковые файлы, то лучше всего перевести БД и языковые файлы интерфейса в utf8.

2 - заменить в коде сайта все функции  htmlspecialchars(), на свою  собственную htmlspecialchars1251()

 function htmlspecialchars1251($string, $flags=ENT_COMPAT)
{
return htmlspecialchars($string, $flags, "cp1251");
}

Статья обновляемая...