Drupal. Исправление проблемы "белого экрана".

Главные вкладки

Аватар пользователя E-Will E-Will 11 февраля 2009 в 13:49

оригинал http://sherskov.ru/node/255

Суть проблемы

После обновления блога до Drupal 6, возникли неприятные проблемы при опубликации статей или комментариев. В логах были найдены такие строки:

Fatal error: Unsupported operand types in [...]/drupal/includes/common.inc on line 1376
Fatal error: Unsupported operand types in [...]/drupal/includes/common.inc on line 1546

В Drupal опять поменялся API, поздравляю. API меняется часто, уверен что в лучшую сторону, но некоторые части кода за этими изменениями не поспевают. Итак, проблема в функциях <?php l() ?> и <?php url() ?>, точнее в каких то модулях, использующих эти функции, которые, видимо, не успевают за прогрессом.

<?php// Старый способ формирования ссылки на изображения.
l('<img src="foo.png"/>', 'node/1', array(), null, null, null, TRUE);
 
// И новый способ.
l('<img src="foo.png"/>', 'node/1', array('html' => TRUE));
?>

Проблема возникает когда вызывается функция со старыми параметрами.

Три варианта решения проблемы "белого экрана"

1 вариант
Сделать "костыли" для проблемных функций. Этот способ категорически не рекомендуется, если вы разрабатываете модули, но вполне подойдет для быстрого решения проблемы. Просто вставьте этот код в файле [path-to-site]/includes/common.inc .

<?php  /**
   * Добавить следующий код после этой определения этой функции:
   *
   * `function url($path = NULL, $options = array()) {`
   *
   * (строка 1368)
   */
  // Преобразование аргументов
  
if (!is_array($options)) {
    
$options = array();
    
$args func_get_args();
    if (isset(
$args[1])) $options['query'] = $args[1];
    if (isset(
$args[2])) $options['fragment'] = $args[2];
    if (isset(
$args[3])) $options['absolute'] = $args[3];
  }
?>
<?php  /**
   * Добавить следующий код после этой определения этой функции:
   *
   * `function l($text, $path, $options = array()) {`
   *
   * (строка 1541)
   */
  // Преобразование аргументов
  
if (!is_array($options)) {
    
$options = array();
    
$args func_get_args();
    if (isset(
$args[2])) $options['attributes'] = $args[2];
    if (isset(
$args[3])) $options['query'] = $args[3];
    if (isset(
$args[4])) $options['fragment'] = $args[4];
    if (isset(
$args[5])) $options['absolute'] = $args[5];
    if (isset(
$args[6])) $options['html'] = $args[6];
  }
?>

Этого хака для многих уже достаточно, но он только устранит симптомы, но не решит проблему.

2 вариант. Логируем ошибки.
Дополняем 1 вариант логированием ошибок. Таким образом можно будет узнать что причина именно в неверном вызове этих функций. После строки <?phpif ( isset ( $args [ 6 ] ) )?> в функции <?php l() ?> добавьте вызов <?php trigger_error() ?>.

<?php    trigger_error("Deprecated url formatter call");
?>

Итак, если данная ошибка начала появляться в логах и на экране (в зависимости от настроек), можно переходить к 3 варианту и найти конкретный фрагмент ошибочного кода.

3 вариант. Поиск и исправление ошибки.
Для этого можно использовать функцию <?php debug_print_backtrace() ?>, которая покажет из какого именно файла, функции и строки был вызван ошибочный код. Для этого надо в те же функции добавить код:

<?php  // Die.
  
if (!is_array($options)) {
    
$args func_get_args();
    echo 
"<pre>";
    
print_r($args);
    echo 
"</pre>";
    echo 
"<hr/>";
    echo 
"<pre>";
    
debug_print_backtrace();
    die();
  }
?>

Итак, теперь известны конкретные строки кода, приводящие к ошибке. Значит проблема решена!


вольный перевод с http://justinhileman.info/blog/2009/02/unsupported-operand-types-in-drup...

Комментарии

Аватар пользователя cascad cascad 23 марта 2009 в 20:32

Господа. У меня "белый экран" появлятся, когда я меняю что-то в template.php ! Мне там надо по-русски написать, да ещё стили поменять. Что же делать? Ведь поменять надо там, но появляется этот "белый экран".

Там файлы в utf-8? Может нужен какой-то редактор, который сразу в utf-8 печатает, а то я в блокноте всё исправлял... Помогите!