Модуль вывода терминов таксономии с использование блоков Drupal 7
Данная статья носит более поучительный характер, в ней описано использование hook_block() в drupal 7, и вывода блока с помощью шаблона. Напишем модуль который будет выводить блок словаря терминов таксономии, с вложенной глубиной равной еденице. Родительские термины будут являтся элементами, при нажатии на которые, будут выдвигатся/сворачиваться дочерние элементы, которые будут являться ссылками на материалы терминов таксономии.
Назавем наш модуль catalog_menu. Для создания будем использовать следующий файлы.
catalog_menu.module - основной файл модуля. catalog_menu.js - js - файл, содержащий функции для сворачивания меню. catalog_menu.info - файл с описанием модуля. catalog-menu.block.inc - файл для реализации функций блока (я его не использовал, но для расширения функционала можно) catalog-menu-block.tpl.php - файл шаблона для вывода блока
Для начала создаем .info файл с описанием модуля. Я думаю с этим проблем не возникнет)
name = Catalog menu description = Catalog menu dependencies[] = taxonomy version = 7.x-1.x-dev core = 7.x
Далее создаем файл модуля. Для начала подключаем файл со скриптом, используя hook_init(), затем объявляем блок, используя hook_block_info()
function catalog_menu_init(){ drupal_add_js(drupal_get_path('module', 'catalog_menu') . '/catalog_menu.js'); } function catalog_menu_block_info(){ $blocks = array(); $blocks[0]['info'] = t('Catalog menu'); $blocks[0]['cache'] = DRUPAL_NO_CACHE; return $blocks; }
Далее используем 2 функции, первая выбирает из базы родительские термины таксономии из словаря с ид = 2, а вторая функция, сапоставляет каждому родительскому термину полученному из прошлой функции, дочерние термины.
function catalog_menu_create_menu() { $tids = db_query("select ttd.name, ttd.tid from taxonomy_term_hierarchy tth inner join taxonomy_term_data ttd on tth.tid = ttd.tid where ttd.vid = 2 and tth.parent = 0 order by ttd.weight")->fetchAll(); return $tids; } function catalog_menu_create_children_menu($parent) { $child = array(); $i = 0; foreach($parent as $value) { $children = taxonomy_get_children($value->tid); foreach($children as $val) { $child[$value->tid][$i] = new stdClass(); $child[$value->tid][$i]->tid = $val->tid; $child[$value->tid][$i]->name = $val->name; $i++; } } return $child; }
Далее используем hook_block_view() который возвращает содержимое блока (заголовок и контент).
function catalog_menu_block_view($delta = '') { $parent = catalog_menu_create_menu(); $child = catalog_menu_create_children_menu($parent); $blocks = array(); $blocks['subject'] = null; $blocks['content'] = theme('catalog_menu_block', array('parent' => $parent, 'child' => $child)); return $blocks; }
здесь мы передаем переменные $parent и $child для их последующего использования в шаблоне. Теперь нам осталось вызвать hook_theme() для указания файла шаблона.
function catalog_menu_theme() { return array( 'catalog_menu_block' => array( 'variables' => array( 'parent' => NULL, 'child' => NULL, ), 'file' => 'catalog-menu.block.inc', 'template' => 'catalog-menu-block', ) ); }
Затем создаем файл с именем "catalog-menu-block.tpl.php" это и будет наш файл шаблона где мы можем использовать наши переменные $parent и $child, для вывода данных.
В итоге у нас получился следующий шаблон:

Ну вот и все, данную статью можно рассматривать, как пример работы с блоками в Drupal 7.
Комментарии
Кто бы ты ни был, спасибо
Кто бы ты ни был, спасибо тебе. Запарился уже по справке лазить))
Не за что
На самом деле на данный момент есть модуль https://www.drupal.org/project/taxonomy_block
он справляется со стандартным выводом таксономии, но если надо что-то кастомное, то конечно лучше воспользоваться статьей и еще допилить по необходимости)
Добавить комментарий