Здравствуйте!
После обновления Drupal стала появляться ошибка Notice: Trying to get property of non-object в функции _block_render_blocks() (строка 912 в файле /var/www/html/modules/block/block.module).
Подскажите, пожалуйста, из-за чего она возникает?
Как исправить?
Комментарии
https://www.drupal.org/node/1128936
Я нашел хак, чтобы решить эту проблему (я уверен, что есть более удобный способ, если кто-то потрудился проследить через файл block.module и найти корень проблемы). Мое решение:
1. Перейдите в файл block.module и найти линии 245 , которая должна быть внутри функции , вызываемой 2. Добавьте строку "print_r ($ дельта". ");" к этой функции , так что становится
function block_block_view($delta = '')
В вашем случае это строка 912
Извините, что-то я не пойму.
Вот код этой функции:
<?php function _block_render_blocks($region_blocks) {
// We preserve the submission of forms in blocks, by fetching from cache only
// Proceed to loop over all blocks in order to compute their respective cache
$cid = empty($cids[$key]) ? NULL : $cids[$key];
// Try fetching the block from the previously loaded cache entries.
// Valid PHP function names cannot contain hyphens.
$cacheable = TRUE;
// if the request method is 'GET' (or 'HEAD').
if ($_SERVER['REQUEST_METHOD'] != 'GET' && $_SERVER['REQUEST_METHOD'] != 'HEAD') {
$cacheable = FALSE;
}
// Block caching is not usually compatible with node access modules, so by
// default it is disabled when node access modules exist. However, it can be
// allowed by using the variable 'block_cache_bypass_node_grants'.
elseif (!variable_get('block_cache_bypass_node_grants', FALSE) && count(module_implements('node_grants'))) {
$cacheable = FALSE;
}
// identifiers; this allows us to do one single cache_get_multiple() call
// instead of doing one cache_get() call per block.
$cached_blocks = array();
$cids = array();
if (
$cacheable) {foreach ($region_blocks as $key => $block) {
if (!isset($block->content)) {
if (($cid = _block_get_cache_id($block))) {
$cids[$key] = $cid;
}
}
}
if (
$cids) {// We cannot pass $cids in directly because cache_get_multiple() will
// modify it, and we need to use it later on in this function.
$cid_values = array_values($cids);
$cached_blocks = cache_get_multiple($cid_values, 'cache_block');
}
}
foreach (
$region_blocks as $key => $block) {// Render the block content if it has not been created already.
if (!isset($block->content)) {
// Erase the block from the static array - we'll put it back if it has
// content.
unset($region_blocks[$key]);
if (isset($cached_blocks[$cid])) {
$array = $cached_blocks[$cid]->data;
}
else {
$array = module_invoke($block->module, 'block_view', $block->delta);
$delta = str_replace('-', '_', $block->delta);
// Allow modules to modify the block before it is viewed, via either
// hook_block_view_alter() or hook_block_view_MODULE_DELTA_alter().
drupal_alter(array('block_view', "block_view_{$block->module}_{$delta}"), $array, $block);
if (isset(
$cid)) {cache_set($cid, $array, 'cache_block', CACHE_TEMPORARY);
}
}
if (isset(
$array) && is_array($array)) {foreach ($array as $k => $v) {
$block->$k = $v;
}
}
if (isset($block->content) && $block->content) {
// Normalize to the drupal_render() structure.
if (is_string($block->content)) {
$block->content = array('#markup' => $block->content);
}
// Override default block title if a custom display title is present.
if ($block->title) {
// Check plain here to allow module generated titles to keep any
// markup.
$block->subject = $block->title == '<none>' ? '' : check_plain($block->title);
}
if (!isset($block->subject)) {
$block->subject = '';
}
$region_blocks["{$block->module}_{$block->delta}"] = $block;
}
}
}
return $region_blocks;
} ?>
Строка 912 :
<?php$array = $cached_blocks[$cid]->data; ?>
Куда ставить
<?php print_r ($ дельта". ");?>
block_block_view($delta
Ищите по файлу Ctrl+f
Если ничего не найдено, внимательно посмотрите стр https://www.drupal.org/node/1128936
Там несколько вариантов решений должно быть. я ваши файлы не вижу полностью, поэтому мне лениво вникать. Суббота всёж
Notice говорит о том, что ошибка выше указанной в нём строчки. В этом вся паскудность предупреждений, так как ошибка выше может быть и перед ней, и выше, и дебажить этот трип то еще развлечение..
print_r выполняет почти тоже самое, что и var_dump, только более читабельно, но менее полно, то есть распечатывает в поток сведения о переменной, из чего она состоит, что бывает удобно, если нужно вывести вложенную переменную по ключу.
Сам Notice просто предупреждает о том, что что- то неоппределено или где то пусто и т.д., но работу скрипта не останавливает.
Поставьте devel. Он при ошибке весь стек вызова выводит. И вместо принт эра и вар дампа там есть dpm
Большое спасибо всем, кто отозвался и пришел на помощь!
Видимо, мой случай отличается от приведенного на этой странице https://www.drupal.org/node/1128936 . Я пробовал то, что там предлагается, но ни один способ не решил мою проблему.
После детального изучения кода block.module (приведен вверху), я пришел к выводу, что проблема связана с кэшированием блоков. Очистка кэша ничего не дала. А вот после отключения кэширования блоков ошибка исчезла. Что именно работает неправильно я пока не понял...
Временное решение - отключить кэширование блоков. Протестировав сайт, я увидел, что это не отразилось на скорости работы.
Но все-таки я хочу понять в чем проблема. В свободное время планирую еще детальнее изучить кэширование Drupal (Что откуда берется, как формируется, куда записывается...). Если найду решение - напишу. Может быть кому пригодится.
Если вам не трудно, дайте, пожалуйста, ссылки на подходящую информацию о кэшировании блоков. Чтобы меньше "воды", а просто и по существу.