Настройка блока модуля Views для текущей просматриваемой ноды

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

Аватар пользователя beliy_snow beliy_snow 10 марта 2007 в 11:22

Столкнулся я с такой проблемкой: есть у меня блок в модуле Views, называется "About this article". Из названия понятно, что он должен (по идее) показывать информацию о конкретной статье, при её просмотре. Но вот незадача - среди фильтров этого модуля нет такого, который бы выбирал ноды так, как например работает фильтр "Node: Author is Current user", т.е. показывать те ноды, автором которых является текущий (просматривающий) залогиненный пользователь. Чтож, изголяемся...

Идем в настройки блока, раздел "Arguments", ищем закладку "Argument Handling Code" пишем в неё следующий код.

<?php
if ('node' == arg(0) && is_numeric(arg(1)))
{
$node = node_load(arg(1));
$view->filter = array (
array (
'tablename' => 'node',
'field' => 'node.nid',
'operator' => '=',
'options' => '',
'value' => $node->nid,
),
);
$view->query = '';
}?>

Теперь по порядку.
<?php if ($node = node_load(arg(1)))?> Когда мы просматриваем ноду - у нас параметр 1 (arg(1)) - это либо ID ноды, либо её Алиас. Если функция node_load() загрузит нам ноду, то в следующем коде мы добавляем новый фильтр, в котором указываем имя таблицы, поле, оператор и собственно ID ноды, которую нужно загрузить.
<?php $view->query = '';?> Делается для того, чтобы каждый раз на SQL запрос строился заново, а не брался из кеша, а то просмотрели одну страницу, записали запрос в кеш, например, с нодой ID = 33, пошли на другую ноду ID = 44, а инфа показывается для ноды 33...

Чтобы быть вабще уверенным, что инфа будет показываться для одной ноды в настройках блока, в разделе "Block" пишем в поле "Nodes per Block" цифру 1, чтобы лимитировать наш запрос одной записью.

Если вы тут же остановитесь и побежите тестировать то, что я тут понаписал - получите ошибку в SQL запросе, типа '.nid= '33'... Я обходил это следующим образом. Шел в файлик modules/views/views_query.php, искал функцию "_views_view_build_filters", прокручивал в самый низ и писал следующее

<?php
... // ищем последний else
else {
$query->ensure_table("$table");
if (!$query->use_alias_prefix) $table = $query->primary_table;
$query->add_where("%s.%s %s '%s'", $table, $field, $filter['operator'], $filter['value']);
}
?>
Проблема тут в том, что изначально было вот так <?php $query->add_where("%s.%s %s '%s'", $query->use_alias_prefix . $table, $field, $filter['operator'], $filter['value']);?>, а где задается $query->use_alias_prefix - я как-то не нашел...

Вот, вроде и все... Если есть более правильное/легкое/логичное решение проблемы - буду только рад.

TODO: В этом блоке будет такой элемент, как Hits (количество просмотров ноды). Вроде бы все с ним понятно, но стандартный Друпаловский функционал считает все просмотры статьи от любого пользователя, т.е. сколько раз я нажму F5 - столько и просмотров, что не катит. Собственно задача состоит в том, чтобы считать посещения уникального пользователя раз в сутки... Идеи уже есть, пойду реализовывать, ждите...

Комментарии

Аватар пользователя ultraboy@drupal.org ultraboy@drupal.org 16 марта 2007 в 13:56

Вот так сразу - не могу понять, зачем исп. вьюс для выводы информ. об одной ноде? Вьюс предназначем для вывода списков...
Чем писать код И *патчить* вьюс, не проще ли сделать то же самое одним "кастом" кодом?..

P.S. Прочитал вторую статью из этой "серии"... LOL просто. Рад, что Вы пришли к тому же мнению что и я Smile