Joomla 1.0.х и PHP 5.3.3 (5.4) — решение проблем совместимости

Уже многие заметили, что при переходе хостеров на PHP 5.3.3 упали сайты на Joomla 1.0.х.
И так, начинаем лечить:

1. Конечно же в первую очередь нужно вылечить com_content, чтобы отображались материалы. Для этого:

В файлике /includes/Cache/Lite/Function.php   находим строчку

Код: $arguments = func_get_args();
и заменяем её на

Код: $arguments = func_get_args();
$numargs = func_num_args();
for($i=1; $i < $numargs; $i++){
$arguments[$i] = &$arguments[$i];
}
Для ленивых уже пропатченый файл [ссылка]

2. Лечим com_contact. Для этого:

находим файл /includes/vcard.class.php и внем ф-ию

Код:  function quoted_printable_encode($input, $line_max=76, $space_conv=false)
  {
    /* … */
  }
заменяем на

Код: if(!function_exists(‘quoted_printable_encode’))
{
  function quoted_printable_encode($input, $line_max=76, $space_conv=false)
  {
    /* … */
  }
}
Для ленивых уже пропатченый файл [ссылка]

3. Решение проблем с ereg*()

В PHP 5.3.3 были депрекнуты (больше не поддерживаются)  функции ereg*()
Если вы в конфиге включите error_reporting нарпимер на max левел, то увидите множество сообщений типа

Deprecated: Function eregi() is deprecated in /home/siteroot/….

Ман по этой проблеме можете прочитать здесь: [ссылка]

В кратце, решение проблема с ereg*() заключается в замене этой функции на preg_match() по следующим алгоритмам:

Код: ereg(«.([^.]*$)», $this->file_src_name, $extension);
заменить на
preg_match(«/.([^.]*$)/», $this->file_src_name, $extension);

$this->file_dst_name_body = ereg_replace(«[^A-Za-z0-9_]», «», $this->file_dst_name_body);
заменить на
$this->file_dst_name_body = preg_replace(«/[^A-Za-z0-9_]/», «», $this->file_dst_name_body);

eregi(«.([^.]*$)», $this->file_src_name, $extension);
заменить на
preg_match(«/.([^.]*$)/i», $this->file_src_name, $extension);

split (string pattern, string string [, int limit])
заменить на
preg_split ( string pattern, string subject [, int limit [, int flags]] )

NB: первый аргумент (паттерн) почти всегда должен начинаться  и заканчиваться на «/»

P.S. Переходите на Joomla 1.5

« Последнее редактирование: 10.11.2010, 15:23:32 от gorunov » Записан gorunov Осваиваюсь на форуме

Репутация: +10/-0
Offline

Сообщений: 38

Re: Joomla 1.0.х и PHP 5.3.3 — решение проблем совместимости « Ответ #1 : 27.10.2010, 13:35:50 »

Пока коснулся только двух компонент jos_content и jos_contact. Предлагаю всем коллегам кто решит проблемы с другими компонентами ен лениться и отписаться о ходе решения. Записан gorunov Осваиваюсь на форуме

Репутация: +10/-0
Offline

Сообщений: 38

Re: Joomla 1.0.х и PHP 5.3.3 — решение проблем совместимости « Ответ #2 : 27.10.2010, 14:58:56 »

Понемножку фиксим проблемму с ereg*

1. Начнем с ядра /includes/joomla.php

Строку:
Код: if ( $date && ereg( «([0-9]{4})-([0-9]{2})-([0-9]{2})[ ]([0-9]{2}):([0-9]{2}):([0-9]{2})», $date, $regs ) ) {
заменяем на

Код:      if ( $date && preg_match( «/([0-9]{4})-([0-9]{2})-([0-9]{2})[ ]([0-9]{2}):([0-9]{2}):([0-9]{2})/», $date, $regs ) ) { Записан Aleks_El_Dia Moderator

Репутация: +312/-7
Offline

Пол:
Сообщений: 4140

AEDStudio Joomla! Direction

Re: Joomla 1.0.х и PHP 5.3.3 — решение проблем совместимости « Ответ #3 : 24.11.2011, 11:01:55 »

Здесь немного расширенная статья с несколькими решениями — Совместимость Joomla 1.0 и PHP 5.3

Источник: http://joomlaforum.ru/index.php?topic=135614

————

И еще информация по теме с http://live-co.com/viewtopic.php?id=14938

Движок — Joomla

Ошибка: Warning: Parameter 1 to modMainMenuHelper::buildXML() expected to be a reference
Не отображается главное меню
Решение:
Ищем файл: modules/mod_mainmenu/helper.php
Меняем это:
function buildXML(&$params)
на это:
function buildXML($params)

Fatal error: Cannot redeclare quoted_printable_encode() in C:hometest.ruwwwindex.php on line 60

Функция с именем quoted_printable_encode уже есть в PHP 5.3+ . Если Вы хотите написать свою заглушку для PHP ниже 5.3, тогда:

if (!function_exists(‘quoted_printable_encode’)) {
function quoted_printable_encode(…) {

}
}

Warning: Parameter 3 to showItem() expected to be a reference, value given in /home/…/…/…/includes/Cache/Lite/Function.php on line 100

Исправление, меняем
1.
это: $result = call_user_func_array(array($class, $method), $arguments);
на это:$result = call_user_func_array(array($class, $method), &$arguments);

2.
это: $result = call_user_func_array(array($$object_123456789, $method), $arguments);
на это: $result = call_user_func_array(array($$object_123456789, $method), &$arguments);

3.
это: $result = call_user_func_array($target, $arguments);
на это: $result = call_user_func_array($target, &$arguments);

Еще одна распространенная ошибка
Warning: call_user_func_array() expects parameter 2 to be array, null given in /home/user/domain.ru/libraries/joomla/cache/cache.php on line 143
Warning: call_user_func_array() expects parameter 2 to be array, null given in /home/user/domain.ru/libraries/joomla/session/session.php on line 272
В обоих файлах исправляется одинакого:
это: if(call_user_func_array( array( trim($class), ‘test’ ), null))
на это: if(call_user_func_array( array( trim($class), ‘test’ ), array()))

Отредактированно admiral (2013-06-16 21:48:54)

 

 

сегодня столкнулся еще с такой ошибкой
движок joomla
компонент — Savant

Warning: Parameter 1 to Savant2_Plugin_ahrefreview::plugin() expected to be a reference, value given in /home/…/…/…/components/com_mtree/Savant2.php on line 1127

решение
идет в /components/com_mtree/Savant2/
там есть файлы с началом — Savant2_Plugin_***
открываем файл и находим параметр — function plugin( &$link, ………… )
удаляем символ &
и так пробегаем все файлы  Savant2_Plugin_***

Заменяем ereg на preg_match

Теперь разработчики в срочном порядке исправляют свой код заменяя функции ereg, eregi, ereg_replace, ereg_replacei соответствующими PCRE аналогами, благо замена получилась довольно простой:

1. заменить ereg и eregi на preg_match, ereg_replace и ereg_replacei на preg_replace;
2. добавить // разделители в начало и конец регулярного выражения;
3. если POSIX функция кончается на i (eregi, ereg_replacei) то добавить i в конец регулярного выражения после разделителя.
4. заменить POSIX спецсимволы соответствуюущими PCRE аналогами: [:alnum:] — w или [0-9a-z], [:digit:] — d или [0-9], [:space:] — s, [:alpha:] — [a-z]

примеры:

ereg(‘expression’) -> preg_match(‘/expression/’)

eregi(‘expression’) -> preg_match(‘/expression/i’)

eregi(‘^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+.[a-z]{2,4}$’) -> preg_match(‘/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+.[a-z]{2,4}$/i’)

eregi(«/», $val) -> preg_match(«///i», $val)
или лучше такой вариант:
eregi(«/», $val) -> substr_count($val,»/»)

eregi_replace(‘/filter/([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+)’, », url::current()) -> preg_replace(‘//filter/([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+)/i’, », url::current())
eregi(‘finance/pincode’, url::current()) -> preg_match(‘/finance/code/i’, url::current()) — Deprecated: Function set_magic_quotes_runtime()

находим в вашем скрипте строку:
set_magic_quotes_runtime(0);

и заменяем её на:
ini_set(«magic_quotes_runtime», 0); — Функция split() устарела.
Решение
вместо split напишите explode —

Ошибка Joomla 1.5 + на php 5.3:
Warning: Parameter 1 to JHTMLGrid::access() expected to be a reference, value given in /home/user/site.ru/libraries/joomla/html/html.php on line 87
Открываем файл librariesjoomlahtmlhtml.php и начиная со строки 87 заменяем эту часть кода:

1 2 3 4 5 6 7 8 9 10 11 if (is_callable( array( $className, $func ) )) { $args = func_get_args(); array_shift( $args ); return call_user_func_array( array( $className, $func ), $args ); } else { JError::raiseWarning( 0, $className.’::’.$func.’ not supported.’ ); return false; }

На это:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if (is_callable( array( $className, $func ) )) { $temp = func_get_args(); array_shift( $temp ); $args = array(); foreach ($temp as $k => $v) { $args[] = &$temp[$k]; } return call_user_func_array( array( $className, $func ), $args ); } else { JError::raiseWarning( 0, $className.’::’.$func.’ not supported.’ ); return false; } — Если в функции split() используются регулярные выражения, то можно попробовать заменить её на preg_split а не на explode, в некоторых случаях помогает исправить ошибки —

Часто при установки старых скриптов на php5.3 можно увидить предупреждения начинающиеся с:

Deprecated: …

Что такок депрекация читаем тут — http://ru.wikipedia.org/wiki/Депрекация
Самое простое решение это скрыть эти предупреждения в файле .htaccess, добавив где нибудь в верху этого файла пару строк:

php_flag display_errors off
php_flag log_errors off

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

PS незабывайте обновлять скрипты, если они поддерживаются разработчиками.

joomla

Deprecated: Assigning the return value of new by reference is deprecated in /home/LOGIN/DOMAIN/lib/kernel.php on line 94

открывает файл в текстовом редакторе
находим строку 94
TClasses::$instances[$ClassName] = &new $ClassName ();
удаляем символ &

получается так
TClasses::$instances[$ClassName] = new $ClassName ();
сохраняем

PS это касается всех предупреждений типа Deprecated: Assigning the return value of new by reference is deprecated

Избавляемся от сообщений вида:
1. Deprecated: Assigning the return value of new by reference is deprecated in /home/user/путь_до_файла.php on line 42
Ищем файл /home/user/путь_до_файла.php, строку в нем — on line 42 и удаляем в этой строку знак &

2. Deprecated: Function call_user_method() is deprecated in /home/user/путь_до_файла.php on line 101
Смотрим строку на которую выдается сообщение — on line 101 и заменяем в ней функцию call_user_method на аналогичную для php5.3 — call_user_func c соблюдением синтаксиса, например:
elseif($this->isAction(index)) call_user_method(index,$this);
заменяем на:
elseif($this->isAction(index)) call_user_func(array(&$this, index));
Тут перед первой переменной ($this) ставится &, переменная пишется впереди, параметр (index) должен быть после переменных

Еще один пример:
if($this->isAction($method_name)) $this->set($method_name,call_user_method($method_name,$this));
Заменяем на:
if($this->isAction($method_name)) $this->set($method_name,call_user_func(array(&$this, $method_name)));

—-

Проблема с php 5.4

Strict Standards: Only variables should be assigned by reference in /home/логин/папка-домена/engine/aApplication.php on line 22

Решение

открываем engine/aApplication.php  строки 22, 23, 24

1 2 3 $this->page =& Page::getInstance(); $this->user =& $this->page->getUser(); $this->cache =& Cache::getInstance();

удаляем &

Проблема в скриптах Magento

Находим файл: lib/Zend/Db/Select.php

ЗАМЕНЯЕМ:

1 $correlationName = current(array_keys($this->_parts[self::FROM]));

НА:

1 2 $arrayKeys = array_keys($this->_parts[self::FROM]); $correlationName = current($arrayKeys); — Проблема php5.4

Fatal error: ‘continue’ operator with non-constant operand is no longer supported in /home/USER/DOMAIN.ru/wp-content/themes/ШАБЛОН/functions.php on line 67

Был

foreach( $_POST[‘extra’] as $key=>$value ){ 
if( empty($value) ) 
continue delete_post_meta($post_id, $key);

update_post_meta($post_id, $key, $value);

Исправляем

foreach( $_POST[‘extra’] as $key=>$value ){ 
if( empty($value) )  {delete_post_meta($post_id, $key); continue; }
update_post_meta($post_id, $key, $value);
} —

Проблема php5.4

Strict Standards: Declaration of JParameter::loadSetupFile() should be compatible with JRegistry::loadSetupFile() in /home/user/domain.ru/libraries/joomla/html/parameter.php on line 0

Находим в файле /home/user/domain.ru/libraries/joomla/html/parameter.php функцию function loadSetupFile и исправляем:

public function loadSetupFile($path)

на:

public function loadSetupFile($path=null)

Проблема php5.4

Плагин wp-pagenavi в cms WordPress выдаёт ошибку:
Strict Standards: Declaration of PageNavi_Options_Page::validate() should be compatible with scbAdminPage::validate($new_data, $old_data) in /home/user/domain.ru/wp-content/plugins/wp-pagenavi/admin.php on line 0

в файле /home/user/domain.ru/wp-content/plugins/wp-pagenavi/admin.php

function validate( $options ) {

заменить на

function validate( $new_data, $old_data ) {
$options = wp_parse_args($new_data, $old_data);

Проблема php5.4

Ошибка в старых версиях DLE < 10.
Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162

Находим в файле строки

function safesql( $source )
{
if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return mysql_escape_string($source);
}

заменяем на

function safesql( $source )
{
if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return mysql_real_escape_string($source);
}

в случае если после замены появляется ошибка:

Warning: mysql_real_escape_string(): Access denied for user »@’localhost’ (using password: NO) in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162 Warning: mysql_real_escape_string(): A link to the server could not be established in /home/user/domain.ru/engine/classes/mysqli.class.php on line 162

заменить тогда на

function safesql( $source ) {
if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST);

if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source);
else return addslashes($source);
}

Проблема php5.4

Fatal error: Call-time pass-by-reference has been removed in /home/user/domain.ru/plugins/content/jw_disqus/jw_disqus.php on line 40

Открываем файл /home/user/domain.ru/plugins/content/jw_disqus/jw_disqus.php находим строку 40

1 $this->onContentPrepare(‘com_content.article’, &$row, &$params, $limitstart );

Удаляем символ &

1 $this->onContentPrepare(‘com_content.article’, $row, $params, $limitstart ); —

Источник: lred.ru

Оцените статью
новости для мужчин