Коллекция материалов и статей для веб разработчиков


Модуль вывода терминов таксономии с использование блоков 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.

Tags: 

Комментарии

Кто бы ты ни был, спасибо тебе. Запарился уже по справке лазить))

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

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA