Функции Drupal 7 API для работы с таксономией
В Drupal 7 API имеется ряд полезных функций для таксономии, позволяющих получить ноды, классифицированные по определенному термину, узнать родительские или дочерние термины и т.п.
Загружаем объект термина по его tid
Функция taxonomy_term_load() (внешняя ссылка) по аналогии с node_load() возвращает объект термина по tid:
<?php $term = taxonomy_term_load(1); print $term->name; // Название термина print $term->vid; // Идентификатор словаря таксономии, к которому принадлежит данный термин ?>
Также по аналогии с node_load_multiple() в Drupal API имеется функция taxonomy_term_load_multiple() (внешняя ссылка)
Находим термины по названию
Для загрузки терминов по их названиям служит функция taxonomy_get_term_by_name() (внешняя ссылка), которая возвращает массив объектов терминов с заданным именем.
Получаем все термины словаря
Чтобы получить все термины словаря с учетом иерархии, можно воспользоваться функцией taxonomy_get_tree() (внешняя ссылка), в которую нужно передать значение vid - идентификатора словаря таксономии. При этом функция вернет объекты терминов с дополнительными свойствами "depth" (глубина термина в иерархии) и "parents" - массив значений tid родительских терминов. Примеры кода для вывода "дерева" словаря вы найдете на странице описания данной функции.
Получаем дочерние термины
Довольно распространенная задача - получить дочерние термины заданного термина. Для ее решения служит функция taxonomy_get_children() (внешняя ссылка). Обратите внимание, что данная функция принимает tid термина, а возвращает полные объекты дочерних терминов (если они есть). Т.е. данную функцию нецелесообразно использовать, если нам нужны, например, только значения tid или name дочерних терминов. В таких ситуациях с точки зрения быстродействия стоит написать запрос к базе данных сайта, используя db_select() (внешняя ссылка) (за основу можно взять запрос из тела функции taxonomy_get_children()).
Получаем родительские термины
Для получения предков заданного термина в API Drupal 7 предусмотрено две функции - taxonomy_get_parents() (внешняя ссылка) и taxonomy_get_parents_all() (внешняя ссылка).
Несмотря на почти идентичные названия, эти функции отличаются существенно. Первая вернет только «родителей» заданного термина. Предположим у нас есть словарь «Электроника», в нем родительские термины Sony и Panasonic и термин «Телевизоры», который сделан дочерним как для Sony, так и для Panasonic. Тогда в результате вызова функции taxonomy_get_parents() при подстановке в нее значения tid термина «Телевизоры» мы получим объекты терминов Sony и Panasonic.
Вторая функция возвращает объекты всех «предков» термина, а не только его родителей, т.е. с учетом всей глубины словаря.
Загружаем все ноды термина
Для получения содержимого, классифицированного по определенному термину, служит функция taxonomy_select_nodes() (внешняя ссылка). При всей очевидности ее назначения у новичков иногда возникают проблемы, связанные с непринятием во внимание всех аргументов данной функции. Поэтому давайте рассмотрим пример. Допустим, к термину с tid = 1 отнесено 25 нод. Тогда вполне логично предположить, что строка кода:
<?php $nids = taxonomy_select_nodes(1); ?>
вернет массив из 25 элементов - nid этих нод. Однако это не так. Обратите внимание на второй аргумент функции, а именно переменную булева типа $pager, установленную по умолчанию в TRUE. Это значит, что выборка наших будет разбита постранично. Если же мы хотим получить все ноды термина на одной странице, нам нужно преобразовать строку кода в:
<?php $nids = taxonomy_select_nodes(1, false); ?>
Также при использовании функции taxonomy_select_nodes() можно задать лимит на количество загружаемых нод и установить порядок сортировки через параметры $limit и $order.
В заключение стоит упомянуть такие полезные функции, как taxonomy_get_vocabularies() (внешняя ссылка) - для загрузки всех словарей таксономии и ее упрощенный вариант taxonomy_vocabulary_get_names() (внешняя ссылка), которая возвращает массив объектов, свойствами которых являются названия, машинные имена и идентификаторы vid словарей.