Делаем навигационное меню рубрикатор для блога на Drupal
Расскажу о наиболее простом, на мой взгляд, способе создания вертикального меню рубрикатора для блога на Drupal с отображением количества постов в каждой из категорий (такой рубрикатор можно наблюдать на нашем блоге справа). Вам не понадобится ставить ни одного дополнительного модуля. Метод основан на использовании базового модуля Taxonomy, иначе говоря, на стандартных тегах.
Заходим в раздел администрирования "Конструкция сайта->Блоки" ("Site Building->Blocks"). Там нажимаем на вкладку добавления нового блока. В поле "Описание блока" вводим понятное нам название для отображение в админке, например, "Рубрикатор". Задаем заголовок блока, видимый для пользователей, и вставляем следующий код в текст блока:
<?php
$node_type = "blog"; //тип ноды
$vocabulary_id = 1 ; //номер словаря тегов
$number=10; //количество разделов в рубрикаторе
$result = db_query_range("SELECT d.tid, d.name, MAX(n.created) AS updated,
COUNT(*) AS count FROM {term_data} d INNER JOIN {term_node} USING (tid)
INNER JOIN {node} n USING (nid) WHERE d.vid = %d AND
n.status = 1 AND n.type = '%s' GROUP BY d.tid, d.name ORDER BY
COUNT DESC ", $vocabulary_id, $node_type, 0, $number);
$items = array();
while ($category = db_fetch_object($result)) {
$items[] = l($category->name , 'taxonomy/term/'. $category->tid).' ('. $category->count .')' ;
}
print theme('item_list', $items);
?>
</div>
Небольшой комментарий к коду: переменная $node отвечает за тип ноды, для записей блога необходимо оставить ей значение "blog", как в примере. $vocabulary_id - это номер словаря тегов, который будет использован для нашего рубрикатора. Посмотреть этот номер можно в разделе админки "Содержание->Таксономия" ("Content->Taxonomy") - наведите мышкой на словарь и в конце ссылке увидете его номер. Если вы не создавали больше одного словаря, то скорее всего его номер "1".
Ну и переменная $number отвечает за количество разделов в создаваемом меню, в примере, как видим, их 10.
Далее надо не забыть выставить правильный фильтр в подразделе "Формат ввода", иначе введенный код не будет интерпретироваться Drupal-ом. Нам необходимо указать "PHP Code" фильтр. Если у вас его нет в списке, то следует зайти на страничку модулей и включить стандартный модуль "PHP Filter".
Теперь жмём "Сохранить блок", указываем его местоположение на странице управления блоками и, собственно, готово. У нас получился блок, отображающий разделы, основанные на ваших тегах, прикрепленных к статьям, и количество постов в этих разделах. Можно применить к нему стили, использовав класс div-а контейнера "rubricator".
- 3636 просмотров

Комментарии
taxonomy_menu may be?
taxonomy_menu may be?
Можно и через Taxonomy Menu.
Можно и через Taxonomy Menu. Можно и через Views. Мне нравится описанный метод тем, что не требует никаких сторонних модулей - просто создаёшь блок и копипастишь туда код.
а чего db_query так
а чего db_query так по-детски неправильно оформлен? может переменные лучше в аргументы переместить?
Это всё от лени и
Это всё от лени и безответственности! Долой раздолбайство! Поправила.
Во-первых ошибка: есть --
Во-первых ошибка:
есть -- COUNT DESC LIMIT %d", $vocabulary_id, $node_type,$node_type);
надо -- COUNT DESC LIMIT %d", $vocabulary_id, $node_type,$number);
Во-вторых, если уж мы тут педантами заделались, надо вместо LIMIT юзать db_query_range:
SELECT
d.tid, d.name,
MAX(n.created) AS updated,
COUNT(*) AS count
FROM {term_data} d
INNER JOIN {term_node} USING (tid)
INNER JOIN {node} n USING (nid)
WHERE
d.vid = %d
AND n.status = 1
AND n.type = '%s'
GROUP BY d.tid, d.name
ORDER BY COUNT DESC";
$result = db_query_range(db_rewrite_sql($sql), $vocabulary_id, $node_type, 0, $number);
Всё верно, спасибо за
Всё верно, спасибо за поправки. db_query_range вообще очень правильная вещь - Александр, например, её постоянно использует, и меня, когда забываю, обычно пинает
+1. Это само-собой
+1. Это само-собой подразумевалось
Отправить комментарий