Drupal 8 Views — выводить пустую страницу, если не заполнены раскрытые фильтры

Недавно столкнулся со странным поведением Views в Drupal 8 (а как показал гугл — и в ранних версиях): на сайте есть лента новостей с категориями, выведенная через Views. Пользователь может отметить чекбоксами (с помощью Detter Exposed Filter) интересующие его категории. Так вот, если он отмечает категорию, в которой новостей нет, то в результате получает пустую страницу — тут все хорошо. Но если он вообще не отметит ни одной категории, то Views возвращает вообще все новости, хотя, по идее, должен так же вернуть пустую страницу. Всякие танцы с бубном вокруг обязательных фильтров и PHP-кодов в валидации параметров Global:Null особо не помогли. В результате нагуглил вот такие варианты.

Воспользоваться решил вторым вариантом, предложенным господином drupby, а именно реализовать hook_views_querry_alter(). Однако, согласно документации Drupal 8 его формат несколько изменился. Вот мой вариант:

function inno_hooks_views_query_alter($view, $query) {
 if ($view->name == 'My_View' && $view->current_display == 'page') {
    $filter_set = FALSE;
    foreach ($view->filter as $filter) {
      // Check if we've found a filter identifier that is set.
      if ($filter->options['exposed'] && array_key_exists($filter->options['expose']['identifier'], $_GET)) {
        $filter_set = TRUE;
        break;
      }
    }
 
    // If the filter isn't set, add a WHERE clause to the query that
    // cannot be TRUE. This ensures the view returns no results.
    if (!$filter_set) {
      $query->addWhere(0, 'FALSE');
      // To display a different message (or no message at all) you
      // also might want to adjust the Views' empty text. 
      $view->display_handler->options['empty'] = '';
    }
  }
}

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

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