Данная статья носит более поучительный характер, в ней описано использование 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, для вывода данных. В итоге у нас получился следующий шаблон:
<div id="block-catalog-catalog">
<ul class="catalog menu">
<?php foreach($parent as $item) : ?>
<li class="catalog-parent parent-<?php print $item->tid . ' ' . $item->name; ?>">
<?php print '<span class="catalog-parent-term">' . $item->name . '</span>'; ?>
<?php if (isset($child[$item->tid])) : ?>
<ul class="child-item">
<?php foreach($child[$item->tid] as $child_item) : ?>
<li class="child-item-li">
<?php print l($child_item->name, 'taxonomy/term/' . $child_item->tid); ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</div>
Ну вот и все, данную статью можно рассматривать, как пример работы с блоками в Drupal 7.