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

Приветствую! У нас сегодня рекорд! 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-х анонсов документов этого термина и ссылка на остальные). При большем количестве терминов работает аналогично.

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

Александр Зданчук

Приветствую!

Хочу сказать, что ваш блог очень хорош. Это не спам и не сео/смо.

Время от времени, я проглядываю взглядом разные сайтики, которые светятся, то там, то сям. К вам пришел после того, как наткнулся на НаноГрабрскую тему в его группе. Очень обрадовало, что еще не все перевелись начинающие блогеры, да еще и разбирающиеся в технической стороне вопроса. Пишите чаще, больше, а я буду вас читать (время-от-времени) по RSS.

sa_bo_nim

Да, согласна, с частотой постов не очень у меня. Как-то слишком ответственно подхожу к публикации здесь материалов, хотя пишу их быстро и легко. Ну что ж. Буду исправляться.
Все равно спасибо за теплые слова и за то что читаете.

Гость

Спасибо за решение, благодаря ему сделал первый шаг в друпале. Только не кажется ли вам, что циклические запросы для таких вещей - это слишком?
Для своего случая (он проще, правда) я сделал с одним запросом. Быть может, и тут можно что-то придумать?

sa_bo_nim

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

Гость

У меня не работает (использую Друпал 6)

Дмитрий

Привет! Очень понравился Ваш блог. Желаю дальнейших статей и развития блога. Очень полезно для начинающих изучть Друпал!