Модуль taxonomy предоставляет разработчикам Drupal 7 мощное API для управления словарями и терминами таксономии. В этой статье, мы рассмотрим только некоторые возможности.
Программное создание словаря таксономии
if (!taxonomy_vocabulary_machine_name_load('voc_name')) {
$vocabulary = array(
'machine_name' => 'voc_name',
'name' => 'Название словаря',
);
$vocabulary = (object) $vocabulary;
taxonomy_vocabulary_save($vocabulary);
$vid = $vocabulary->vid;
}
Для начала с помощью функции taxonomy_vocabulary_machine_name_load проверим на существование в системе словаря с нашим именем. Если такого словаря не существует, то создаём его, используя функцию taxonomy_vocabulary_save. Для этого нужно указать два параметра:
- Машинное имя словаря. В качестве имени должны выступать символы латинского алфавита, цифры и знак нижнего подчёркивания;
- Название словаря. Здесь можно использовать и символы кириллицы.
В переменной vid сохраняем идентификационный номер нашего нового словаря.
Программное создание термина таксономии
$term = array(
'name' => 'Название термина',
'vid' => $vid,
'parent' => $tid,
);
$term = (object) $term;
taxonomy_term_save($term);
$tid = $term->tid;
Создаём новый термин таксономии с помощью функции taxonomy_term_save. Указываем название термина. Можно использовать символы кириллицы. Устанавливаем связь со словарём и родительским термином с помощью их идентификационных номеров. В переменной tid сохраняем идентификационный номер нового термина. Кго можно использовать в качестве родительского для построения иерархической структуры словаря таксономии. В примере показано как это реализовать.
Программное создание типа материала и добавление к нему поля типа таксономия
Программно создадим новый тип материала:
$type = array(
'type' => 'node_type_name',
'name' => st('Название типа материала'),
'base' => 'node_content',
'description' => st('Описание типа материала'),
'custom' => 1,
'modified' => 1,
'locked' => 0,
);
$type = node_type_set_defaults($type);
node_type_save($type);
Для этого сначала нужно определись параметры для типа материала. Устанавливаем машинное имя. Напоминаю, что для машинного имени нужно использовать символы латинского алфавита, цифры и знак нижнего подчёркивания. Добавляем название типа материала и его описание. Здесь вместо функции t для использования многоязыковых строк рекомендуется использовать аналогичную функцию st. Далее устанавливаем базовый тип материала и другие параметры.
Значения по умолчанию для нового типа материала можно установить с помощью функции node_type_set_defaults. Воспользуемся этой возможностью, чтобы не заполнять все параметры вручную.
В завершение сохраняем тип материала используя функцию node_type_save.
Программно добавляем поле для нашего типа материала:
$field = field_info_field('field_taxonomy_voc');
if (empty($field)) {
$field = array(
'field_name' => 'field_taxonomy_voc',
'type' => 'taxonomy_term_reference',
'settings' => array(
'allowed_values' => array(
array(
'vocabulary' => 'voc_name',
'parent' => 0,
),
),
),
'module' => 'taxonomy',
);
$field = field_create_field($field);
}
В начале проверяем существует ли наше поле. Это можно сделать, воспользовавшись функцией field_info_field. В качестве параметра передаём имя нашего будущего поля. Если поле не найдено, то создаём его. Для этого лучше использовать функцию field_create_field. Только необходимо перед её вызовом нужно устанавить параметры нового поля. Устанавливаем название поля и его тип, в нашем случае это будет taxonomy_term_reference. Добавим настройки поля и передаём все параметры в функцию field_create_field.
Одного создания поля недостаточно, нужно установить отображение этого поля. Добавим следующий код:
$instance = field_info_instance('node', 'field_taxonomy_voc', $type->type);
if (empty($instance)) {
$instance = array(
'field_name' => 'field_taxonomy_voc',
'entity_type' => 'node',
'bundle' => $type->type,
'label' => 'Термины таксономии',
'required' => 1,
'widget' => array(
'type' => 'options_buttons',
'module' => 'options',
),
'display' => array(
'default' => array(
'label' => 'hidden',
'type' => 'taxonomy_term_reference_link',
'module' => 'taxonomy',
),
'teaser' => array(
'label' => 'hidden',
'type' => 'hidden',
),
),
);
$instance = field_create_instance($instance);
}
По аналогии с предыдущим примером, необходимо сначала проверить существует ли отображение для нашего поля. По логике, если до этого момента поля не существовало, то и проверять на существование отображения смысла нет. Но я думаю, то проверка лишней не будет. Воспользуемся функцией field_info_instance.
Мы проверили что отображения не существует. Теперь нужно его добавить. Легко догадаться, что функция будет называться field_create_instance. Также нужно добавить параметры к этой функции. Параметров будет немного больше. Установим связь с полем и типом материала. Добавим описание для отображения. Сделаем поле обязательным для заполнения. Определим тип виджета для отображения. В нашем случае, это будет Флажки / Радио-кнопки. Последний параметр отвечает за стиль отображения по-умолчанию и в анонсе.