Drupal 7 поддерживает работу с таксономией на уровне ядра (модуль taxonomy), предоставляя богатый арсенал функций.
Здесь мы рассмотрим только функции, связанные с работой непосредственно с данными. Описание taxonomy hooks (программных зацепок) вы можете посмотреть на api.drupal.org.
Полный перечень функций вы найдете там же — taxonomy module api.
Итак, первое что может оказать полезным в работе — это получение списков таксономий и описаний словарей.
Список всех словарей
Этот перечень может быть получен функцией taxonomy_get_vocabularies(). Вы получите массив объектов, описывающих все словари.
Вот пример возвращаемых данных:
Более краткую информацию можно получить функцией taxonomy_vocabulary_get_names(). Она возвращает только системные имена (machine_name) и названия существующих словарей сайта.
Пример данных:
CRUD операции для словарей
По аналогии с терминологией, используемой для баз данных, со словарем можно выполнить все необходимые операции.
taxonomy_vocabulary_delete($vid); — удаление по vocabulary_id
taxonomy_vocabulary_load($vid); — загрузка данных об одном словаре по указанному vid. Возвращает один объект аналогичной струкруры как taxonomy_get_vocabularies.
taxonomy_vocabulary_machine_name_load($machine_name); — тоже самое, но по машинному имени. Очень удобно, когда нужно отвязаться от конкретного идентификатора словаря.
taxonomy_vocabulary_load_multiple($vids = array(), $conditions = array()) ; — получение данных сразу о нескольких словарях. На самом деле эта функция используется как основа для прочих (таких как taxonomy_vocabulary_load, taxonomy_get_vocabularies).
В качестве условий (массив conditions) используются имена полей сущности taxonomy. Примеры:
1 2 |
taxonomy_vocabulary_load_multiple(null, array('module' => 'taxonomy')); taxonomy_vocabulary_load_multiple(null, array('machine_name' => 'blog_tags')); |
taxonomy_vocabulary_save($taxonomy_object); — загруженный объект, после изменений можно сохранить данной функцией. Если требуется создать новый словарь, то нужно удалить значение $vid из объекта.
Пример, создания словаря:
1 2 3 |
$tax = new stdClass(); $tax->machine_name = 'custom'; taxonomy_vocabulary_save($tax); |
Т.е. словарь из кода может быть создан даже без названия, только с machine_name. Но в админке CMS попросит указать человеко-читаемое название, т.к. поле обязательное для заполнения.
CRUD операции для термина словаря
Drupal предоставляет следующие API функции для манипуляций с отдельными терминами.
taxonomy_term_delete($tid); — удаляет термин с указанным $tid из базы данных.
taxonomy_term_load($tid); — загружает термин по $tid (вернет false, если термина с таким id нет). Кроме основных полей, здесь могут быть данные, предоставленные сторонними модулями.
Например, у меня есть словарь соц. сетей, с парой терминов
Я, зная tid термина «instagram», запрашиваю информацию о нем:
1 |
$term = taxonomy_term_load(6); |
Drupal вернет вот такой объект:
Если словарь имеет дополнительные поля (настроенные в CMS — в примере это field_term_sn_source), то вы получите и их.
taxonomy_term_save($term_object); — позволяет сохранить модифицированный термин или создать новый.
Пример создания термина:
1 2 3 4 5 6 |
$term = new stdClass(); // задаем обязательные поля $term->name = 'Custom termin'; $term->vid = 3; // cоздание термина taxonomy_term_save($term); |
При сохранении объект термина будет модифицирован, Drupal добавит кучу данных, сработают зацепки различных contributed модулей. Так можно получить ID термина сразу после создания. Вот пример состояния объекта после операции сохранения:
Различные выборки и подмножества терминов
taxonomy_term_load_multiple($tids = array(), $conditions = array()); — загрузка множества терминов по массиву id. Возможно указание дополнительных условий. Условия работают по той же схеме, что и в случае словарей.
taxonomy_get_term_by_name($name, $vocabulary = NULL); — пытается найти термин по названию. Можно даже не указывать словарь (требуется машинное имя словаря), в котором искать. Поиск не зависит от регистра, потому значений может быть найдено несколько.
Попробуем найти термин, созданный в предыдущем примере:
1 |
$term = taxonomy_get_term_by_name('custom termin'); |
Структура результата запроса:
taxonomy_get_children($tid, $vid = 0); — получение списка дочерних терминов, структура результата как на предыдущем скриншоте — массив терминов. С помощью vid можно ограничить поиск дочерних терминов каким то одним словарем.
taxonomy_get_parents($tid); — поиск непосредственных родителей термина. Структура таксономии Drupal позволяет иметь термину более одного непосредственного родителя.
taxonomy_get_parents_all($tid); — поиск всех родителей термина (т.е. и родителей родителей).
taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $load_entities = FALSE); — грузит все термины словаря (в общем случае).
Вы можете указать максимальную глубину и корень (tid) таксономии, от которого строится «дерево». Функция возвращает в любом случае плоский список (т.е. массив) терминов, иерархию придется выяснять, анализирую свойства depth и parents. $load_entities — позволяет указать грузить ли дополнительные поля, созданные в конструкторе полей CMS.
Дополнительные функции для работы с терминами таксономии Drupal
Есть ещё некоторые функции, которые можно отнести к сервисным.
taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = array(‘t.sticky’ => ‘DESC’, ‘t.created’ => ‘DESC’)); — выбирает список нод, связанных с указанным термином. Результат — массив nid.
taxonomy_implode_tags($tags, $vid = NULL); — создаёт строку из названий терминов, разделенных запятыми. Если указать vid, то переданные термины будут отфильтрованы по vid. Функция ожидает, что $tags — массив объектов терминов.