Вывод списка модулем views в блоке, с учётом термина. Сниппет

Аватар пользователя Dan Dan 12 марта 2007 в 16:43

Возникла задача: выводить в блоке новости, имеющие отношение к определённой части сайта (к определённой группе материала).
Решение следующее:
- каждая группа материала привязана к одному из терминов словаря с vid= 3
- создан вид, показывающий несколько новостей с фильтром по одному из терминов словаря 3
- добавлен новый блок со следующим кодом:

<?php
$view_name = 'view_name';
$view = views_get_view($view_name);
$view->query = $view->countquery = "";

$tid = array_shift(taxonomy_node_get_terms_by_vocabulary(arg(1), 3));

foreach($view->filter as $num => $item )
if($item['id'] === 'term_node_3.tid')
$view->filter[$num]['value'][0]=$tid->tid;

$limit = 20;

print views_build_view('embed', $view, array(), FALSE, $limit);
?>

Внимание! Код переработан!

Решил отказаться от модуля views. Теперь это снипет, использующий только таксономию (без неё совсем никак).

<?php
/**
* Сниппет блока для отображения статей с терминами, аналогичными
* отображаемой статьи. Статьи отсортированы по времени создания.
* Текущая статья из списка удаляется.
*
* Если необходимо не отображать блок при отсутствии статей, надо
* задать $no_items_text = '';
*
*/

// номера словарей для поиска терминов
$vids = array('2','4');
// количество ссылок на статьи
$list_length = 10;
// текст при отсутствии найденых статей
$no_items_text = 'Статей нет';

$tids = array();

foreach($vids as $vid)
foreach(taxonomy_node_get_terms_by_vocabulary(arg(1), $vid) as $tid)
$tids[] = $tid->tid;

if(!count($tids))
return $no_items_text;

$tids = join($tids, ',');

$list_length++;
$query = "SELECT DISTINCT(n.nid), n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid in ($tids) AND n.status = 1 ORDER BY n.created DESC LIMIT $list_length";
$sql = db_rewrite_sql($query);
$result = db_query($sql);
$items = array();
$current_find = false;
while ($item = db_fetch_object($result))
if($item->nid == arg(1))
$current_find = true;
else
$items[]= l($item->title, "node/".$item->nid);

if(!$current_find)
array_pop($items);

return (count($items))? theme('item_list',$items) : $no_items_text;
?>

Комментарии

Аватар пользователя Dan Dan 15 марта 2007 в 2:00

> А где можно увидеть в работе?
А смымл смотреть на другом сайте? Просто блок со ссылками. Если включены path и pathauto (а они, как правило, включены), то и системные адреса (типа taxonomy/term/4) тоже видны не будут.

Лучше сделай сам и поиграйся Smile

Аватар пользователя kiev1 kiev1 9 мая 2007 в 8:41

что-то я не пойму - views делает и так уже готовый блок который можно вставить в любую зону через админку, зачем что-то программировать?

Аватар пользователя Kulibin Kulibin 25 июля 2007 в 11:27

А что правильнее использовать (идеологически + в плане производительности) - снипеты или же с views разбираться?

Аватар пользователя Shelendor Shelendor 25 июля 2007 в 21:48

и всё же хотелось бы посмотреть в работе, чтобы понять как это выглядит Smile не у всех стоит views, да, но и не все по коду всё понимают Lol

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 25 июля 2007 в 23:03

Так вставьте текст сниппета в блок, включите его и зайдите на страницу какой-нибудь статьи (имеющей таксономию, т.е. отнесенную к каким-нибудь категориям).

Аватар пользователя run run 27 декабря 2007 в 16:23

Спасибо.

Может где есть централезованое хранилище сниппетов?

Аватар пользователя Redhotdog Redhotdog 30 июля 2009 в 0:42

Было бы супер, если бы сниппет еще выводил дату создания нод. Может быть кто-нибудь подскажет?

Аватар пользователя Dan Dan 30 июля 2009 в 1:32

в запросе дата есть:
$query = "SELECT DISTINCT(n.nid), n.title, n.created <--- вот
Это дата в формате UNIXTIME преобразуйте её в строку и цепляйте куда хотите, например после заголовка:
 $items[]= l($item->title.'('.$date.')', "node/".$item->nid);
где $date - ваша строка даты