Многие из вас наверняка, при создании сайта не раз использовали таксономию. С помощью таксономии можно организовать не только связку по категориям материалов, но и также реализовать сложнейшую иерархию. Но не многие знаю (не используют) функции, которые Drupal предоставляет из коробки для работы с таксономией. Как вы можете заметить следующая информация в большей степени касается разработчиков. Итак, по традиции будем разбираться на конкретных примерах, допустим у нас есть некая структура таксономии:

Для примера создадим ноду, привязанную к одному из дочерних терминов таксономии:

С исходными данными разобрались, теперь переходим непосредственно к самим функциям.
Список разбираемых функций для работы с таксономией:- taxonomy_get_parents()
- taxonomy_get_parents_all()
- taxonomy_get_children()
- taxonomy_get_tree()
- taxonomy_term_load()
- taxonomy_get_term_by_name()
- taxonomy_vocabulary_get_names()
- taxonomy_vocabulary_machine_name_load()
- taxonomy_vocabulary_load()
- taxonomy_get_vocabularies()
Хочу заметить, что я для примера буду использовать непосредственно файл node.tpl.php текущей темы, я же вам не рекомендую делать этого, а все необходимые вам действия производить либо в файле template.php или же в своем модуле.
Функция taxonomy_get_parents($tid) – возвращает массив родительского термина, где:
- $tid – id текущего термина (обязательный параметр)
<?php $tid = $node->field_hierarchy['und'][0]['tid']; // получили текущий термин ноды $parent = taxonomy_get_parents($tid); // получили массив с родительским термином ?>

Если вы сравните с нашей иерархией, то можете увидеть, что родительским термином термина «More children 2» является «Children 3».
Функция taxonomy_get_parents_all($tid) – возвращает массив со всеми родительскими терминами, включая текущий термин, где
- $tid – id текущего термина (обязательный параметр)
<?php $tid = $node->field_hierarchy['und'][0]['tid']; // получили текущий термин ноды $parent = taxonomy_get_parents_all($tid); // получили массив со всеми родительскими терминами ?>

Функция taxonomy_get_children($tid, $vid) – возвращает массив с дочерними терминами таксономии, где
- $tid – id текущего термина (обязательный параметр)
- $vid – id словаря, для ограничения поиска (не обязательный параметр)
Хочу заметить, что данная функция возвращает лишь первый уровень иерархии, т.е. дочерние термины дочерних терминов не попадут в массив
Пример:
<?php $tid = $node->field_hierarchy['und'][0]['tid']; // получили текущий термин ноды $parent = taxonomy_get_children($tid, $vid = 2); // получили массив с дочерними терминами таксономии ?>

Функция taxonomy_get_tree($vid, $parent, $max_depth, $load_entities) – возвращает массив с иерархией указанного словаря, где:
- $vid – id словаря таксономии (обязательный параметр)
- $parent – id термина таксономии, именного для данного термина и будет построена иерархия (не обязательный параметр), по умолчанию равно 0, что выводит всю иерархию таксономии указанного словаря
- $max_depth – указывает на число уровней иерархии, по умолчанию принимает NULL, что соответствует не ограниченному уровню иерархии (не обязательный параметр)
- $load_entities – булевское значение, по умолчанию FALSE, значения забираются из таблицы taxonomy_term_date, для экономии памяти и время выполнения (не обязательный параметр)
<?php $vid = 2; // id словаря таксономии $parent = 7; //id термина таксономии, для которого необходимо построить иерархию $max_depth = 1; // уровень для формирования иерархии $parent = taxonomy_get_tree($vid, $parent, $max_depth); ?>

Функция taxonomy_term_load($tid) – возвращает объект указанного термина таксономии, где:
- $tid – id термина таксономии (обязательный параметр)
<?php $tid = 8; // id термина таксономии $parent = taxonomy_term_load($tid); ?>

Функция taxonomy_get_term_by_name($name, $vocabulary) – возвращает массив с указанным именем термина таксономии, где:
- $name - имя термина таксономии (обязательный параметр)
- $vocabulary – имя словаря таксономии для ограничения поиска, по умолчанию NULL (не обязательный параметр)
<?php $name = 'Children 2'; // имя термина таксономии $vocabulary = 'hierarchy'; // имя словаря таксономии $parent = taxonomy_get_term_by_name($name, $vocabulary); ?>

Функция taxonomy_vocabulary_get_names() – возвращает массив со списком всех словарей таксономии, где в качестве ключей передаются следующие параметры:
- name –имя словаря таксономии
- machine_name – машинное имя словаря таксономии
- vid – id словаря таксономии
<?php $parent = taxonomy_vocabulary_get_names(); ?>

Функция taxonomy_vocabulary_machine_name_load($name) – возвращает объект со всеми метаданными указанного словаря таксономии, где:
- $name – машинное имя словаря таксономии (обязательный параметр)
<?php $name = 'hierarchy'; // машинное имя словаря таксономии $parent = taxonomy_vocabulary_machine_name_load($name); ?>

Функция taxonomy_vocabulary_load($vid) – возвращает объект со всеми метаданными указанного словаря, где:
- $vid – id словаря таксономии (обязательный параметр)
<?php $vid = 2; $parent = taxonomy_vocabulary_load($vid); ?>

Функция taxonomy_get_vocabularies() – возвращает массив объектов словарей таксономии.
Пример:
<?php $parent = taxonomy_get_vocabularies(); ?>

Наверное на этом можно закончить, это список тех популярных функций, которые я сам использую для своих проектов, если вы считаете, что какой-то функции не хватает в данном списке – то просьба писать в комментариях.
P.S - подсчитать количество нод для термина
/** * @param tid * Term ID * @param child_count * TRUE - Also count all nodes in child terms (if they exists) - Default * FALSE - Count only nodes related to Term ID */ function term_nc($tid, $child_count = TRUE) { if ($child_count) { } global $language; $langs[] = 'und'; $query = db_select('taxonomy_index', 't'); $query->condition('tid', $tids, 'IN'); $query->condition('n.status', 1, '='); $query->condition('n.language', $langs, 'IN'); $count = $query->countQuery()->execute()->fetchField(); return $count; } /** * Retrieve ids of term children . * * @param $tid * The term's ID. * @param $tids * An array where ids of term children will be added */ function term_get_children_ids($tid) { $children = taxonomy_get_children($tid); foreach($children as $child) { $tids[] = $child->tid; } } return $tids; }
Оригинал на github
где:
- $tid - tid термина
- $child_count - булевское значение. Определяет подсчитывать или нет ноды дочерних терминов. По умолчанию TRUE
Обновление: 25.07.2015
Функция taxonomy_select_nodes() – возвращает массив с именем термина и привязанных к нему NID нод.
<?php taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = array('t.sticky' => 'DESC', 't.created' => 'DESC')); ?>
где:
- $tid - tid термина
- $pager - булевское значение. Определяет использовать ли пейджер.
- $limit - булевское значение. Определяет лимит NID нод. Если не указать выберет 10 NID.
- $order - задает критерии сортировки для NID
Комментарии (20)
А подобный список функций будет для материала и пользователей?
Не могу обратиться к [i] элементу.
В views делаю хлебные крошки.
И вот с получением родительского термина запнулся.
Кусок моего кода:
Выдается следующее:
Получается чтобы добраться до name, мне надо обратиться так:
но [85] меняется и равняется $tid. И если я пишу так:
то ничего не выводится.
Как правильно вписать туда $tid?
пропустить через foreach
Спасибо большое. Такой способ работает, погуглил, нашел еще пару способов. Но не буду изощряться.
Подскажите как реализовать следующее:
Арбузы:
-красные
-желтые
Персики
-красные
-желтые
Как при нажатии на термин красные показывались и арбузы и персики.
Может быть есть какая то сложная таксономия, где можно указывать взаимосвязь терминов не по иерархии. Надеюсь понятно написал
Легкого способа нет. Я с подобной задачей тоже сталкивался. Очень долго ломал голову. Вот здесь http://www.drupal.ru/node/111072 обсуждал свою проблему. И худо-бедно решил.
Подумал еще, может у тебя и проще задача, и решить можно просто связав термины через Entity reference/
Прочитал тему. Именно это мне и нужно было. Спасибо большое, буду делать.
Нашел один модуль пока лопатил интернет Term Relations попробую его.
Переопределяю хлебные крошки в template.php
Как получить id термина в template.php?
зависит от того, где вы хотите получить id термина ? на странице термина таксономии или в полном описании ноды ?
Я хочу на странице ноды переопределить хлебные крошки, передать туда родительские термины.
Спасибо. Но не получается.
$array_tid это объект? Не чистый id?
Если пишу dsm($array_tid); страница не открывается.
Без него ошибка "Notice: Undefined index: field_type в функции at_universal_preprocess_page()"
Хотя мое поле с термином называется field_type.
Что все-таки передавать сюда:
покажите ваш код.
Страшновато выглядит конечно, но работает.
Для проверки подставил в качестве аргумента - 5.
жесть...
в примере я вам написал какой использовать хук... сравните с вашим.
Через него получаете TID термина таксономии и далее через ф-ю
получаете все родительские термины в виде массива и далее через цикл выводите как вам нужно...
Спасибо.
Но используя хук hook_preprocess_node, не устанавливаются хлебные крошки:
Если заменить его на hook_preprocess_page, то крошки устанавливаются. Зато при этом не работает этот кусок:
Спасибо большое.
Не рассчитывал на полностью готовое решение. Огромное спасибо.