Drupal 8 Views: убрать некоторые значения из раскрытого фильтра

Недавно на понадобилось сделать фильтр записей по полю типа «список», у которого может быть очень много возможных значений (список значений и сами записи импортируются из внешней системы). Если делать обычный Exposed Filter, то появляются два неудобства:

  • Из-за большого количества возможных значений фильтр не очень красиво выглядит на экране и пользователю сложно искать нужное значение
  • Если выбрать очень много пунктов за раз (или сразу все), то можно получить ошибку сервера из-за слишком большого GET-запроса (URL too long), поскольку Drupal передает все выбранные значения фильтров в URL не очень «коротким» способом.

Один из возможных выходов: не дать возможности пользователю выбрать значения фильтра, которые не встречаются в нодах. Сделал я это путем реализации хука form_alter() для модификации формы фильтра:

function customs_form_alter(&$form, $form_state, $form_id)
  {
    //Убедимся, что имеем дело с нужной формой
    if ($form_id == 'views_exposed_form' && $form['#id'] == 'views-exposed-form-vacancy-page-1')
    {
        //Соберем все ДОСТУПНЫЕ значения
        $nids = \Drupal::entityQuery('node')
          ->condition('status', 1)
          ->condition('type', 'vakancy')
          ->condition('field_razdel_saita', 59)
          ->execute();
        $nodes = Node::loadMultiple($nids);
        $depts = array();
        foreach ($nodes as $node) {
          $depts[] = $node->get('field_strukturnoe_podrazdelenie')->value;
        }
        //Уберем дубликаты
        $depts=array_unique($depts);
        //Присвоим массиву с возможными значениями поля только те элементы, значения которых есть в $depts
        $form['field_department_value']['#options']=array_intersect($form['field_department_value']['#options'], $depts); 
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *