[Решено] Ошибка Notice: Trying to get property of non-object в функции _block_render_blocks()

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

Аватар пользователя _Maxim_ _Maxim_ 14 августа 2016 в 17:45

Здравствуйте!

После обновления Drupal стала появляться ошибка Notice: Trying to get property of non-object в функции _block_render_blocks() (строка 912 в файле /var/www/html/modules/block/block.module).
Подскажите, пожалуйста, из-за чего она возникает?
Как исправить?

Комментарии

Аватар пользователя Studio VIZA Studio VIZA 14 августа 2016 в 18:02

Я нашел хак, чтобы решить эту проблему (я уверен, что есть более удобный способ, если кто-то потрудился проследить через файл block.module и найти корень проблемы). Мое решение:

1. Перейдите в файл block.module и найти линии 245 , которая должна быть внутри функции , вызываемой 2. Добавьте строку "print_r ($ дельта". ");" к этой функции , так что становится
function block_block_view($delta = '')

В вашем случае это строка 912

Аватар пользователя _Maxim_ _Maxim_ 14 августа 2016 в 19:16

Извините, что-то я не пойму.

Вот код этой функции:

<?php  function _block_render_blocks($region_blocks) {
  
$cacheable TRUE;

  

// We preserve the submission of forms in blocks, by fetching from cache only
  // 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;
  }

  

// Proceed to loop over all blocks in order to compute their respective cache
  // 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]);

      

$cid = empty($cids[$key]) ? NULL $cids[$key];

      

// Try fetching the block from the previously loaded cache entries.
      
if (isset($cached_blocks[$cid])) {
        
$array $cached_blocks[$cid]->data;
      }
      else {
        
$array module_invoke($block->module'block_view'$block->delta);

        

// Valid PHP function names cannot contain hyphens.
        
$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 ($ дельта". ");?>

Аватар пользователя Studio VIZA Studio VIZA 14 августа 2016 в 19:31

block_block_view($delta
Ищите по файлу Ctrl+f
Если ничего не найдено, внимательно посмотрите стр https://www.drupal.org/node/1128936

Там несколько вариантов решений должно быть. я ваши файлы не вижу полностью, поэтому мне лениво вникать. Суббота всёж

Аватар пользователя Mihail.space Mihail.space 14 августа 2016 в 19:35

Notice говорит о том, что ошибка выше указанной в нём строчки. В этом вся паскудность предупреждений, так как ошибка выше может быть и перед ней, и выше, и дебажить этот трип то еще развлечение..
print_r выполняет почти тоже самое, что и var_dump, только более читабельно, но менее полно, то есть распечатывает в поток сведения о переменной, из чего она состоит, что бывает удобно, если нужно вывести вложенную переменную по ключу.
Сам Notice просто предупреждает о том, что что- то неоппределено или где то пусто и т.д., но работу скрипта не останавливает.

Аватар пользователя _Maxim_ _Maxim_ 19 августа 2016 в 12:53

Большое спасибо всем, кто отозвался и пришел на помощь!

Видимо, мой случай отличается от приведенного на этой странице https://www.drupal.org/node/1128936 . Я пробовал то, что там предлагается, но ни один способ не решил мою проблему.

После детального изучения кода block.module (приведен вверху), я пришел к выводу, что проблема связана с кэшированием блоков. Очистка кэша ничего не дала. А вот после отключения кэширования блоков ошибка исчезла. Что именно работает неправильно я пока не понял...

Временное решение - отключить кэширование блоков. Протестировав сайт, я увидел, что это не отразилось на скорости работы.

Но все-таки я хочу понять в чем проблема. В свободное время планирую еще детальнее изучить кэширование Drupal (Что откуда берется, как формируется, куда записывается...). Если найду решение - напишу. Может быть кому пригодится.

Если вам не трудно, дайте, пожалуйста, ссылки на подходящую информацию о кэшировании блоков. Чтобы меньше "воды", а просто и по существу.