Делаем навигационное меню рубрикатор для блога на 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".
- 7881 просмотр

Комментарии
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. Это само-собой подразумевалось
вопрос, что лучше: ваш код
вопрос, что лучше: ваш код или views со включенным кешем?
Если использовать
Если использовать кэширование блоков, то в принципе должно быть без разницы - вьюзы использовать или свой сниппет. Я обычно стараюсь вьюзы не ставить, всегда можно обойтись без них - а кэширование все равно будет с помощью специализированных модулей/инструментов.
не использовать views ?
не использовать views ? O_o
ну-ну...
Как пример - http://balado.fr - 24 блока вьюсов на главной + порядка 150 для остальных страниц. Плюс ко всему этому порядка 50 хэндлеров переписано.
Боюсь, что с вьюсами вы погорячились.
Вы просто не умеете их готовить
Погорячилась в чем? В том,
Погорячилась в чем? В том, что без вьюзов всегда можно обойтись? Если я не использую CCK, все специализированные типы контента задаю в коде, весь вывод определяю также на уровне кода, зачем мне вьюз? Вьюз это всего лишь инструмент, то что он делает не является чем-то уникальным.
Вьюзы я поставлю в том случае, если управляющий сайтом будет сам создавать новые представления и у него не будет возможности воспользоваться для этого услугами программиста. Собственно это основной юзкейс вьюзов.
Отправить комментарий