Модуль вывода терминов таксономии с использование блоков 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, для вывода данных. В итоге у нас получился следующий шаблон:


<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.
Теги: Drupal 7
Новости