оригинал http://sherskov.ru/node/255
Суть проблемы
После обновления блога до Drupal 6, возникли неприятные проблемы при опубликации статей или комментариев. В логах были найдены такие строки:
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...
Комментарии
Господа. У меня "белый экран" появлятся, когда я меняю что-то в template.php ! Мне там надо по-русски написать, да ещё стили поменять. Что же делать? Ведь поменять надо там, но появляется этот "белый экран".
Там файлы в utf-8? Может нужен какой-то редактор, который сразу в utf-8 печатает, а то я в блокноте всё исправлял... Помогите!