В данной статье описан способ, который позволяет ограничить выбор терминов только первого уровня в полях типа term reference
Предположим у нас есть словарь таксономии с иерархией терминов.
- Легковые
- Мотоциклы и мототехника
- Квадроциклы
- Мотовездеходы
- Мотоциклы
- Грузовики и автобусы
- Автобусы
- Грузовики
- Прицепы
- Автодома
- Автодом
- Жилой модуль
- Трейлер
- Велосипеды
- Спецтехника
Иногда возникает необходимость, разрешить пользователю выбор терминов только первого уровня.
Начинаем все как обычно. Стандартными средствами Друпал на форму создания/редактирования ноды добавляем поле c именем "field_kategory" типа "Ссылка на термин" (Term reference) и выбираем виджет "Выбор из списка".
Что бы ограничить вывод терминов только первого уровня можно использовать hook_form_alter или hook_form_FORM_ID_alter. Найти поле "field_kategory" и подменить значение свойства "#options" на массив терминов первого уровня.
Недостаток - если со временем понадобится применить это поле с другим типом материалов или термином - придется опять лезть в код модуля и добавлять обработку новой формы.
Мы пойдем похожим способом, но другим путем. Применим hook_field_widget_form_alter. Этот хук позволяет изменять виджеты полей перед выводом на форму.
function MYMODULE_field_widget_form_alter(&$element, &$form_state, $context) {
if ($context['field']['field_name'] == 'field_kategory') {
$voc_name = 'kategory'; //машинное имя словаря
$vocabulary = taxonomy_vocabulary_machine_name_load($voc_name);
if ($vocabulary) {
$options=array();
//список терминов первого уровня из нашего словаря
$terms = taxonomy_get_tree($vocabulary->vid,0,1);
foreach($terms as $term){
$options[$term->tid]=$term->name;
}
$element['#options']=$options;
}
}
}
Вот и все, наш чудо модуль готов. Теперь на всех формах, где выводится поле "field_kategory", список будет ограничен только терминами первого уровня вложенности. Даже на форме редактирования поля в пункте "Выбор значения по умолчанию".
Стоит отметить, что данный способ работает и для виджета "Флажки/Переключатели".
P.S. Если Вам необходимо запретить выбор терминов первого уровня, могу порекомендовать модуль Taxonomy container
- 25.09.2013
- 54 просмотра