Появилось желание — при просмотре записи в блоге, выводить похожие материалы. Беглый поиск показал наличие 4-х модулей для решения этой задачи (в действительности может и больше). Плюсы и минусы всех четырёх можно посмотреть в сводной табличке на drupal.org — Comparison of Similiar / Relevant by term block modules.
Всё бы хорошо, бери и пользуйся Relevant Content или Similar By Terms, как самыми живыми, но моя дотошность не позволила мне установить модуль в 43 kb (Relevant Content) только ради вывода трёх ссылок =) Решил написать самостоятельно. Получилось довольно просто:
Drupal 6:
function phptemplate_preprocess_node(&$vars) {
if (!$vars['page'] || !$vars['node'] || !isset($vars['node']->taxonomy) || !count($vars['node']->taxonomy)) {
return;
}
$node = $vars['node'];
$tids = array_keys($node->taxonomy);
$items = array();
$nodes = db_query_range("
SELECT n.nid, n.title, COUNT(*) AS hits FROM {node} n
LEFT JOIN {term_node} tn ON n.nid = tn.nid AND n.vid = tn.vid
WHERE
n.type = '%s' AND
n.status = 1 AND
tn.tid IN (" . db_placeholders($tids) . ") AND
n.nid <> %d
GROUP BY n.nid
ORDER BY hits DESC, n.created DESC
", array_merge(array($node->type), $tids, array($node->nid)), 0, 3);
while ($node = db_fetch_object($nodes)) {
$items[] = l($node->title, 'node/' . $node->nid);
}
$vars['content'] .= theme('item_list', $items, 'Похожие материалы');
}
Drupal 7:
function [THEMENAME]_preprocess_node(&$vars) {
if (!$vars['page'] || !$vars['node'] || !isset($vars['field_tags']) || !count($vars['field_tags'])) {
return;
}
$tids = array();
foreach ($vars['field_tags'] as $tag) {
$tids[] = $tag['tid'];
}
$query = db_select('node', 'n');
$query->fields('n', array('nid', 'title'));
$query->addExpression('COUNT(*)', 'hits');
$query->leftJoin('taxonomy_index', 'ti', 'n.nid = ti.nid');
$query->condition('n.type', $vars['type']);
$query->condition('n.status', NODE_PUBLISHED);
$query->condition('ti.tid', $tids, 'IN');
$query->condition('n.nid', $vars['nid'], '<>');
$query->groupBy('n.nid');
$query->orderBy('hits', 'DESC');
$query->orderBy('n.created', 'DESC');
$query->range(0, 3);
$vars['content']['similar'] = node_title_list($query->execute(), 'Похожие материалы');
$vars['content']['similar']['#weight'] = 2;
}
Код добавляет 3 ссылки на похожие материалы при просмотре полной версии ноды. Похожесть определяется с помощью таксономии (поле field_tags в Drupal 7).
Написанное актуально для
Drupal 6, Drupal 7