Вверх

Блог
RSS лента

Warning: Parameter 4 to JHTMLMenu::treerecurse() expected to be a reference, value given in ...

И так очередные баги в джумле при работе на PHP 5.3.x
Вы заходите в админке в управление каким то меню и видите красоту:

  1. Warning: Parameter 4 to JHTMLMenu::treerecurse() expected to be a reference, value given in /libraries/joomla/html/html.php on line 88
  2.  
  3. Warning: array_slice() expects parameter 1 to be array, null given in/administrator/components/com_menus/models/list.php on line 143
  4.  
  5. Warning: Invalid argument supplied for foreach() in /administrator/components/com_menus/models/list.php on line 147
  6.  
  7. Warning: Invalid argument supplied for foreach() in /administrator/components/com_menus/views/list/view.php on line 65
  8. Фильтр: Перейти Сбросить   Максимальные уровни
  9.  
  10. Warning: Invalid argument supplied for foreach() in /administrator/components/com_menus/views/list/tmpl/default.php on line 69

И думаете вот блин где же мое меню, которое кстати не отображаеться, только выше приведеные варнинги.
Не бойтесь примем пилюлю и все вылечим :)

Лечиться легко, если делать всё правильно.
Вам нужно перейти по адрессу .../libraries/joomla/html/html.php
Открыть файлик html.php
И примерно на 88-й строке вы должны увидеть следующее

return call_user_func_array( array( $className, $func ), $args );

Нужно заменить на:

return call_user_func_array( array( $className, $func ), &$args );

Вообще вам нужно искать условие:
if (is_callable( array( $className, $func ) ))

Которое содержит:

  1. if (is_callable( array( $className, $func ) ))
  2.                 {                        
  3.                   $args = func_get_args();
  4.                   array_shift( $args );
  5.                   return call_user_func_array( array( $className, $func ), $args );                    
  6.                 }
  7.                 else

Но вполне может выглядеть и вот так:

  1. if (is_callable( array( $className, $func ) ))
  2.                 {
  3.                  $args = func_get_args();
  4.                  array_shift( $args );
  5.                  $temp = func_get_args();
  6.                  array_shift( $temp );
  7.                  $args = array();
  8.                  foreach ($temp as $k => $v) {
  9.                   $args[] = &$temp[$k];
  10.                  }
  11.                  return call_user_func_array( array( $className, $func ), $args );
  12.                 }
  13.                 else

В этом случае вам нужно его заменить на:

  1. if (is_callable( array( $className, $func ) ))
  2.                 {                        
  3.                  $args = func_get_args();
  4.                  array_shift( $args );
  5.                   return call_user_func_array( array( $className, $func ), &$args );                   
  6.                 }
  7.                 else

Если не поможет то в старом коде (я имею в веду код который был до замены) поставить перед $args значок амперсанда & (вот так &$args)
С выздоровлением, надеюсь мое лечение вам помогло :)

Ваша оценка: Пусто Средняя: 4.7 (19 votes)

Комментарии

В PHP 5.5 исправляется иначе

Большое спасибо за Ваше решение.

Однако в версиях PHP 5.5.x проблема исправляется иначе.
Приведенное решение в PHP 5.5.x приведет к: “Fatal error: Call-time pass-by-reference has been removed” (или к пустой странице как описала выше Светлана, поскольку в ее случае отключен вывод ошибок в браузер).
Таком образом, что бы исправить проблему в файле .../libraries/joomla/html/html/menu.php находим и меняем строку:

function treerecurse( $id, $indent, $list, &$children, $maxlevel=9999, $level=0, $type=1 )

на:

function treerecurse( $id, $indent, $list, $children, $maxlevel=9999, $level=0, $type=1 )

То есть удаляем амперсанд перед &$children -> $children.

Найдено здесь: http://www.itoctopus.com/menu-item-manager-empty-in-joomla

Спасибо!

Огромное спасибо!

Огромное спасибо!

Помогло!

5

Спасибо, Просто и эффективно! В самый раз, для новичка, осваивающего сайтостроение))

ОГРОМНОЕ СПАСИБО!!!

Заменил на
if (is_callable( array( $className, $func ) ))
{
$args = func_get_args();
array_shift( $args );
return call_user_func_array( array( $className, $func ), &$args );
}
else

И все заработало!
СПАСИБО!!!

Спасибо!

Спасибо!

Светлана

3

Отличная статья!
Вот только при попытке осуществить написанное здесь, почему-то столкнулась с новой проблемой. При открытии %имясайта%/libraries/joomla/html/html.php загружается пустая страничка. Что это может быть, или просто я туплю?))
Заранее спасибо за ответ!

Скажем так второй из

Скажем так второй из предложенных вами материалов.
Открывать нужно в каком не будь редакторе, хотя бы в блокноте. Вам же нужно изменить в файле строки, значит его нужно редактировать, а не пытаться открыть через браузер.

Thanks

Thank you, It really helped me :)

Warning: Parameter 4 to JHTMLMenu::treerecurse() ...

Большое спасибо! Помогло.

Ура

Помогло

Спасибо!

Спасибо Ваша статья очень помогла!

Спасибо! Помогла замена $args

Спасибо! Помогла замена $args на &$args.
В главном меню не выводится пункт "Что нового в 1.5?".
Если возможно, то подскажите где искать?
С уважением, Игорь.

Вот чего не знаю того не

Вот чего не знаю того не знаю. Нужно проводить вскрытие.

Спасибо! Помогла замена $args на &$args.

Большое спасибо! Блин, полдня код ковырял, не мог понять почему!? Вроде правильно все написано...

Большое спасибо за помощь!

Большое спасибо за помощь!

Отправить комментарий

 

Подробнее о форматировании

CAPTCHA
Если вы человек, то тогда введите символы изображенные на картинке ниже
Введите символы, изображенные на картинке.
Главная | Портфолио | Услуги | Контакты | Блог