Вы здесь

Как использовать ИЛИ в контекстных фильтрах?

0

Добрый день.
Не знаю как спросить по другому, наверное странная формулировка вопроса.
Скажу, мне вот сразу не понравилось когда то, что в представлениях обнаружилось два вида отдельных фильтров, чувствовалось могут быть проблемы.

В обычных "критериях фильтрации" можно задать значение фильтра константой или раскрыть фильтр для формы, а динамическое значение подставить можно только через контекстный фильтр. И даже модуль Date, который создает интерфейс для удобной настройки выборки по дате настраивает динамический параметр через контекстный фильтр.

Как в таком случае быть если нужно выбрать материалы:
(тип = 'тип1' и период = 'год') или (тип = 'тип2' и период = 'месяц')

В контекстном фильтре также нельзя объединять параметры фильтрации в группы
(период = 'год' ...) или (период = 'месяц'...)

Версия Drupal: 
7.x
Связанные проекты: 
ViewsDate
Вопрос задан 09.02.2017 - 03:34

С модулем Date нашел как выставить динамическое значение для даты в "критерии фильтрации"
Просто для поля "Содержимое: Дата публикации" эта настройка не так очевидна оказалась.
Там есть два способа , через Содержимое:**** и Дата:*****

Но для других полей, не дат, проблема может быть актуальна.

Комментарий оставлен 09.02.2017 - 07:16

Если нужен просто "ИЛИ" в контекстных фильтрах, то для этого есть замечательный модуль Views Contextual Filters OR, но там тупое ИЛИ по всем условиям, строить группы с чередованием И и ИЛИ не получится...

Комментарий оставлен 09.02.2017 - 10:08

Ответы

0

Есть несколько вариантов. Создать 2 отображения во вьюшке, на каждой свой контекст.
Вариант 1: префикс в пути разный ставить (к примеру by-year/..., by-month/...)
Вариант 2: Выводить страницу программно, и показывать нужную вьюшку. Получится как то-так.

$view_name = 'Название вьюшки';
if(УСЛОВИЯ ДЛЯ ТИП1){
  $display_name = 'Название(display_id) отображения первого варианта';
  $args = array(ТИП1, ПЕРИОД_ГОД);
}elseif(УСЛОВИЯ ДЛЯ ТИП2){
  $display_name = 'Название(display_id) отображения второго варианта';
  $args = array(ТИП2, ПЕРИОД_МЕСЯЦ);
}else{
  drupal_not_found(); // Или возвращай инфу что неправильный запрос
}

$view = views_get_view($view_name);
if ( is_object($view) ) { 
  $view->set_display($display_name);
  $view->set_arguments($args);
  $view->pre_execute();
  return $view->render($display_name);
}

Есть еще вариант, с определением фильтров по умолчанию и в хуке hook_views_pre_execute(). - но это уже надо смотреть на задачу и оценить возможность такого решения.

Думаю есть еще методы... но на текущий момент только такие решения на ум приходят.

Ответ дан 10.02.2017 - 17:47