Вывод анонсов из одного типа документа по категориям

Вывод анонсов из одного типа документа по категориям

Приветствую! У нас сегодня рекорд! 14 подписчиков! Спасибо что подписываетесь и читаете. Для блоггера лучшая награда - когда его читают и на него подписываются))) Ну и конечно когда комментируют Подмигивающий

Теперь к делу. Иногда на небольшом сайте требуется как-то по-хитрому вывести анонсы (имеется ввиду - тизеры - в переводе на терминологию Drupal) определенного типа материалов, причем указать категорию, посчитать количество в каждой, вывести описание этой категории и дать ссылку на остальные документы этой категории. Вот это и делает сниппет, который я представляю вашему вниманию.

Он не требует дополнительных модулей. Достаточно подключить модуль Taxonomy из стандартной поставки, создать словарь или даже несколько и привязать документы определенного типа (можно уже существующих типов page или story) к терминам из словарей. Сниппет выбирает все документы определенного типа, рассовывает их по категориям и выводит по 3 тизера в каждой.

Этот код вставляется в обычную страницу (без визуального редактора типа FCKEditor или TinyMCE) и выбирается формат ввода PHP. Вы можете настроить свой тип документа и число тизеров в каждой категории. Впоследствии ничего в ней редактировать не нужно - она сама создается с помощью запросов к базе данных, содержащей ваши материалы и словари.

<?php
$node_type
= "story";//тип материала
$number=3;//число показанных тизеров
$result = db_query(db_rewrite_sql("SELECT term_data.tid, term_data.description, term_data.name,  COUNT(*) AS count FROM {vocabulary_node_types} INNER JOIN  {term_data} USING (vid) INNER JOIN {term_node} USING (tid) INNER JOIN {node} USING (nid) WHERE node.status = 1 AND vocabulary_node_types.type = '$node_type' GROUP BY term_data.tid, term_data.name ORDER BY term_data.name"));

while ($term = db_fetch_object($result)) {
  print
'<p><h2>'.$term->name.' ('.$term->count.')</h2></p><p>'.$term->description.'</p>';
 
$result1 = db_query(db_rewrite_sql("SELECT n.nid, n.teaser, n.title FROM {node_revisions} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ($term->tid) ORDER BY n.title DESC LIMIT $number"));
  print
'<ul>';
  while (
$node = db_fetch_object($result1)){
      print(
'<li>'.l($node->title, 'node/'.$node->nid).'</li>');
      print
'<p>'._filter_html($node->teaser, 1).'</p>';
   }
  print
'</ul><p>'.l('Другие документы из категории "'.$term->name.'"', 'taxonomy/term/'. $term->tid).'</p>';
  }
?>

Демонстрация → (вывод названия термина, описания термина, 3-х анонсов документов этого термина и ссылка на остальные). При большем количестве терминов работает аналогично.

Замечание: Сниппет не тестировался при древовидной структуре терминов и не претендует на полную правильность и валидность. Я только учусь)))