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

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. Примеры:

taxonomy_vocabulary_save($taxonomy_object); — загруженный объект, после изменений можно сохранить данной функцией. Если требуется создать новый словарь, то нужно удалить значение $vid из объекта.

Пример, создания словаря:

Т.е. словарь из кода может быть создан даже без названия, только с machine_name. Но в админке CMS попросит указать человеко-читаемое название, т.к. поле обязательное для заполнения.

CRUD операции для термина словаря

Drupal предоставляет следующие API функции для манипуляций с отдельными терминами.

taxonomy_term_delete($tid); — удаляет термин с указанным $tid из базы данных.

taxonomy_term_load($tid); — загружает термин по $tid (вернет false, если термина с таким id нет). Кроме основных полей, здесь могут быть данные, предоставленные сторонними модулями.

Например, у меня есть словарь соц. сетей, с парой терминов

Я, зная tid термина «instagram», запрашиваю информацию о нем:

Drupal вернет вот такой объект:

Если словарь имеет дополнительные поля (настроенные в CMS — в примере это field_term_sn_source), то вы получите и их.

taxonomy_term_save($term_object); — позволяет сохранить модифицированный термин или создать новый.

Пример создания термина:

При сохранении объект термина будет модифицирован, Drupal добавит кучу данных, сработают зацепки различных contributed модулей. Так можно получить ID термина сразу после создания. Вот пример состояния объекта после операции сохранения:

Различные выборки и подмножества терминов

taxonomy_term_load_multiple($tids = array(), $conditions = array()); — загрузка множества терминов по массиву id. Возможно указание дополнительных условий. Условия работают по той же схеме, что и в случае словарей.

taxonomy_get_term_by_name($name, $vocabulary = NULL); — пытается найти термин по названию. Можно даже не указывать словарь (требуется машинное имя словаря), в котором искать. Поиск не зависит от регистра, потому значений может быть найдено несколько.

Попробуем найти термин, созданный в предыдущем примере:

Структура результата запроса:

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 — массив объектов терминов.

Написать комментарий

Мало букафф? Читайте есчо !

Вывод строки запроса построенного в db_select

Апрель 11, 2019 г.

Конструктор запросов db_select позволяет абстрагироваться от движка базы данных. Если запрос довольно сложный, то на этапе тестирования может потребоваться, что называется, убедиться в том, что конечный запрос на языке SQL к базе именно тот, что вы ожидаете. ...

Читать

Как изменить длину поля (max length) после создания, сохраняя данные

Май 15, 2018 г.

Друпал не позволяет менять длину текстового поля после создания. Функция field_update_field также нам не поможет - будет сгенерирована соответствующая ошибка, что поле уже содержит данные и изменить его длину нельзя. Это можно проделать вручную, зная ...

Читать

 

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

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: