Ограничить уровень при выборе терминов таксономии (Taxonomy select)


54

В данной статье описан способ, который позволяет ограничить выбор терминов только первого уровня в полях типа 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

Добавить комментарий
Может быть интересно