Ограничение допустимого выбора в exposed filters

Чтобы ограничить список допустимых значений в раскрытом фильтре (exposed filter) для views, можно в настройках фильтра вручную выбрать термины которые можно будет выбирать. Но термины могут со временем добавляться, да и их может быть большое количество и неудобно выбирать из большого списка. Можно программно ограничить допустимые значения терминов в hook_form_FORM_ID_alter(). Его можно имплементировать либо в кастомном модуле, либо в template.php файле темы.

Рассмотрим случай, когда нужно показывать в списке только термины верхнего уровня и только те термины, которые связаны с материалами.


/**
 *  Implements hook_form_FORM_ID_alter().
 */
// MYMODULE заменить на имя модуля или имя темы
function MYMODULE_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  $query = db_select('taxonomy_term_data', 'td');
  $query->join('taxonomy_term_hierarchy', 'th', 'th.tid = td.tid');
  $query->join('taxonomy_index', 'ti', 'ti.tid = td.tid');
  $query->join('node', 'n', 'n.nid = ti.nid');
  $query->condition('th.parent', 0);// Выбираем термины верхнего уровня
  $query->fields('td', array('tid', 'name')); 
  $query->condition('td.vid', 1);// Указываем vid словаря
  $allowed_categories = $query->execute()->fetchAllKeyed();
  $all_categories = array('All' => t('- Any -'));
  $form['field_tags_tid']['#options'] = $all_categories + $allowed_categories;
}

После очистки кеша, выбор терминов в exposed filter будет ограничен только родительскими терминами и не "пустыми" терминами (связанными с материалами).