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

Прислано: Dan

пн, 12/03/2007 - 13: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;
?>

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано koyra (гостевой логин) в пн, 12/03/2007 - 17:01.

спасибо,
как раз то что искал.


Опубликовано Moon Fan в ср, 14/03/2007 - 15:04.

А где можно увидеть в работе?


Опубликовано Dan в ср, 14/03/2007 - 23:00.

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

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


Опубликовано kiev1 в ср, 09/05/2007 - 04:41.

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


Опубликовано Dan в ср, 09/05/2007 - 06:31.

Не у всех стоит views


Опубликовано Kulibin в ср, 25/07/2007 - 07:27.

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


Опубликовано Shelendor в ср, 25/07/2007 - 17:48.

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


Опубликовано vadbars@drupal.org в ср, 25/07/2007 - 19:03.

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


Опубликовано Valeratal в ср, 26/12/2007 - 21:14.

спасибо, реально полезная штука :)


Опубликовано run в чт, 27/12/2007 - 13:23.

Спасибо.

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


Опубликовано andypost@drupal.org в чт, 27/12/2007 - 13:21.

проще по тагу http://www.drupal.ru/taxonomy/term/693 собирать все сниппеты, вот только не все они им помечены


Опубликовано run в чт, 27/12/2007 - 13:44.

Смотрел по тегам, всего 5 материалов :(.

Вот есть http://setegnom.com/node/751

Может еще есть где руководство по сниппет?


Опубликовано vadbars@drupal.org в чт, 27/12/2007 - 13:43.

Довольно много есть на setegnom.com и, конечно, на офсайте - http://drupal.org/handbook/customization/snippets


Опубликовано Sergey1917 в сб, 02/02/2008 - 11:35.

А как сделать сортировку не по дате, а по алфавиту?


Опубликовано Dan в сб, 02/02/2008 - 17:53.

ORDER BY n.created --> ORDER BY n.title


Опубликовано Redhotdog в ср, 29/07/2009 - 20:42.

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


Опубликовано Dan в ср, 29/07/2009 - 21:32.

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