Возникла задача: выводить в блоке новости, имеющие отношение к определённой части сайта (к определённой группе материала).
Решение следующее:
- каждая группа материала привязана к одному из терминов словаря с 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;
?>
Комментарии
спасибо,
как раз то что искал.
А где можно увидеть в работе?
> А где можно увидеть в работе?
А смымл смотреть на другом сайте? Просто блок со ссылками. Если включены path и pathauto (а они, как правило, включены), то и системные адреса (типа taxonomy/term/4) тоже видны не будут.
Лучше сделай сам и поиграйся
что-то я не пойму - views делает и так уже готовый блок который можно вставить в любую зону через админку, зачем что-то программировать?
Не у всех стоит views
А что правильнее использовать (идеологически + в плане производительности) - снипеты или же с views разбираться?
и всё же хотелось бы посмотреть в работе, чтобы понять как это выглядит не у всех стоит views, да, но и не все по коду всё понимают
Так вставьте текст сниппета в блок, включите его и зайдите на страницу какой-нибудь статьи (имеющей таксономию, т.е. отнесенную к каким-нибудь категориям).
спасибо, реально полезная штука
Спасибо.
Может где есть централезованое хранилище сниппетов?
проще по тагу http://www.drupal.ru/taxonomy/term/693 собирать все сниппеты, вот только не все они им помечены
Смотрел по тегам, всего 5 материалов :(.
Вот есть http://setegnom.com/node/751
Может еще есть где руководство по сниппет?
Довольно много есть на setegnom.com и, конечно, на офсайте - http://drupal.org/handbook/customization/snippets
А как сделать сортировку не по дате, а по алфавиту?
ORDER BY n.created --> ORDER BY n.title
Было бы супер, если бы сниппет еще выводил дату создания нод. Может быть кто-нибудь подскажет?
в запросе дата есть:
$query = "SELECT DISTINCT(n.nid), n.title, n.created <--- вот
Это дата в формате UNIXTIME преобразуйте её в строку и цепляйте куда хотите, например после заголовка:
$items[]= l($item->title.'('.$date.')', "node/".$item->nid);
где $date - ваша строка даты