Вы здесь

Notice: Trying to get property of non-object при добавлении ноды

0

Господа, имею блок, в котором для ноды типа "article" вывожу список людей, оценивших этот материал.
К работе блока претензий нет, выводит все правильно, на при создании новой ноды (путь node/add) появляется ошибка:

При отключении блока ошибка пропадает, значит дело в нем.
Где я накосячил? Заранее спасибо всем неравнодушным :)

<?php
global $base_url; //Адрес сайта.

//Получаю id ноды.
if (arg(1) != 'ajax') {
  $nid = $form_state['storage']['nid'] = arg(1);
}
else {
  $nid = $form_state['storage']['nid'];
}

//Загружаю ноду.
$node = node_load($nid);
if (isset($node) && $node->type == 'article') //Если тип "article", формирую блок.
{
$header = array( 
array('data' => 'Редактор', 'field'=>'name'),
array('data' => 'Средняя оценка', 'field'=>'rating')); 

$query = db_select('votingapi_vote','vv')->extend('PagerDefault')->element(0)->extend('TableSort'); 
$query->innerJoin('node', 'n', 'vv.entity_id = n.nid');
$query->innerJoin('users', 'usr', 'vv.uid = usr.uid');
$query->addExpression('ROUND(SUM(vv.value * 5 / 100)/COUNT(vv.value), 1)', 'rating');
$query->fields('usr', array('name'));
$query->fields('vv', array('uid'));
$query->condition('n.nid', $nid, '=');
$query->groupBy('usr.name');
$query->orderBy('vv.timestamp', 'DESC'); //Сортировка по дате оценки.
$query->limit(5);
$result = $query->execute()->fetchAll();

    foreach ($result as $res)
    {
        $rows[] = array(
        l($res->name, $base_url . "/user/".$res->uid),//Ссылка, указывающая на материал.
        check_plain($res->rating)
        );
    }

$table = theme('table',array( 
               // шапка таблицы находится в $header 
              'header' => $header,   
              // тело таблицы (все ее строки) в $rows 
              'rows'     => $rows,  
            ) );

$table .= theme('pager'); //Выводим пагинатор.
return $table;
}
Версия Drupal: 
7.x
Вопрос задан 01.05.2017 - 23:25

Сниппет, который использую в блоке. Вывожу его только на страницах с нодой типа "article" и отображаю в нем список пользователей, проголосовавших за эту ноду через fivestar. Работает правильно, на на странице node/add вызывает ошибку.

Комментарий оставлен 02.05.2017 - 13:35

Переменной $form_state не существует.
isset($node) в любому случае возвращает TRUE.
Сниппет должен выводить данные, а не возвращать их.

Комментарий оставлен 02.05.2017 - 16:05

Спасибо за хорошие замечания, но дело выло в другом.
Если мы находимся на странице с нодой, то адрес имеет такой вид node/№, а если мы добавляем ноду, то адрес такой node/add/ее тип, так вот во 2-м случае и ловил ошибку, так как использую arg(1) для получения nid ноды.
Решил просто проверять является ли arg(1) числом.
Вот код, может кому понадобится:

<?php
global $base_url; //Адрес сайта.

if (is_numeric(arg(1))) //Проверяем, является ли arg(1) числом
{
$nid = arg(1);
$node = node_load($nid);
if ($node->type == 'article')
{
$header = array( 
array('data' => 'Редактор', 'field'=>'name'),
array('data' => 'Средняя оценка', 'field'=>'rating')); 

$query = db_select('votingapi_vote','vv')->extend('PagerDefault')->element(0)->extend('TableSort'); 
$query->innerJoin('node', 'n', 'vv.entity_id = n.nid');
$query->innerJoin('users', 'usr', 'vv.uid = usr.uid');
$query->addExpression('ROUND(SUM(vv.value * 5 / 100)/COUNT(vv.value), 1)', 'rating');
$query->fields('usr', array('name'));
$query->fields('vv', array('uid'));
$query->condition('n.nid', $nid, '=');
$query->groupBy('usr.name');
$query->orderBy('vv.timestamp', 'DESC'); //Сортировка по дате оценки.
$query->limit(5);
$result = $query->execute()->fetchAll();

    foreach ($result as $res)
    {
        $rows[] = array(
        l($res->name, $base_url . "/user/".$res->uid),//Ссылка, указывающая на материал.
        check_plain($res->rating)
        );
    }

$table = theme('table',array( 
               // шапка таблицы находится в $header 
              'header' => $header,   
              // тело таблицы (все ее строки) в $rows 
              'rows'     => $rows,  
            ) );

$table .= theme('pager'); //Выводим пагинатор.
print $table;
}
}

Комментарий оставлен 02.05.2017 - 17:31

Во первых, странный Вы человек - сначала выдаете непонятный код, типа:

//Получаю id ноды.
if (arg(1) != 'ajax') {
$nid = $form_state['storage']['nid'] = arg(1);
}
else {
$nid = $form_state['storage']['nid'];
}

а потом:

if (is_numeric(arg(1))) //Проверяем, является ли arg(1) числом
{
$nid = arg(1);

А во вторых:

Вот код, может кому понадобится:

не нужно так, не делайте так.... Забудьте про php_filter вообще.
Все, что можно сделать с его помощью, можно сделать из без него...

Комментарий оставлен 20.05.2017 - 07:54

Ответы

0

Сделайте блок через модуль http://xandeadx.ru/blog/drupal/255
и получите нормальное сообщение об ошибке с номером строки.

Ответ дан 08.05.2017 - 08:37
Аватар пользователя shu
shu
159