Функции Drupal API для работы с таксономией

12 февраля 2014 - 12:20

Аналогично функциями для работы с нодами в Drupal 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 словарей.