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

18

После просмотра сети и SE какое-то время мне кажется, что нет хорошего решения объединить 2 contextual filtersс OR (а не по умолчанию AND).

В этом посте упоминается взлом PHP, а в этом посте есть ссылки на проблему, в которой говорится о недавнем изменении представлений 7.x-3.1 . Также упоминается использование hook_views_query_alter(&$view, &$query)для изменения вида.

У кого-нибудь есть рабочий пример или лучшее решение?

Уве
источник
Я не думаю, что есть лучшее решение на данный момент. Как сказано в упомянутых вами темах, это, очевидно, нерешенная проблема. На этой неделе я наткнулся на ту же проблему, и мне пришлось искать обходной путь с вложениями. Но тогда, это не смешанный список, а два связанных, которые не соответствуют всем потребностям.
Countzero

Ответы:

7

Поток комментариев, начинающийся здесь, описывает эффективный обходной путь. MotoTribe ссылался на ту же ветку, но на момент его вопроса на этой странице не было рабочего примера. Теперь есть следующее:

В вашем модуле реализовать hook_views_api():

function MODULENAME_views_api() {
  return array(
    'api' => 3,
  );
}

Затем добавьте в свой модуль новый файл с именем MODULENAME.views.inc и реализуйте hook_views_query_alter():

function MODULENAME_views_query_alter(&$view, &$query) {
  if ($view->name == 'whatever_your_view_is_called') {
    $query->where[0]['type'] = 'OR';
  }
}

Также следует помнить об этом:

Очевидно, что фильтр «Содержимое: Опубликовано (Да)», который поставляется с каждым представлением, считается частью той же группы фильтров, что и контекстные фильтры (группа 0). Поэтому для того, чтобы в моем представлении отображались только опубликованные узлы, принадлежащие к любой из групп, указанных в контекстных фильтрах (опубликованные AND (arg1 ИЛИ arg2 ИЛИ ...)), мне пришлось переместить «Содержимое: Опубликованный (Да)» в новая группа фильтров (с помощью диалогового окна «И / или переупорядочить»). Обратите внимание, что пользовательский интерфейс не отображал фильтр «Содержимое: Опубликовано (Да)» по-другому после того, как я переместил его в новую группу (других групп не было), но в объекте запроса, который был передан в hook_views_query_alter()него, переместился это из группы 0 в группу 1, в результате чего код в вышеупомянутых функциях больше не влияет на него.

coredumperror
источник
1
Лучше хотя бы перефразировать актуальность ссылок на вопрос ОП. Ответы только на ссылки не приветствуются, поскольку ссылки могут не сохраняться.
Трискелион,
@ Трискелион: Ах, вы абсолютно правы. Я отредактировал свой ответ, чтобы исправить это.
coredumperror
4

Существует модуль, который изменяет обработчики представлений, чтобы сделать контекстные фильтры для использования с ИЛИ вместо И: представления контекстных фильтров ИЛИ

Синан Эрдем
источник
Я хочу создать представление с контентом от «текущего пользователя» + «Контент от помеченных пользователей (текущий пользователь помечен с использованием флага follow [[]])»
Umair
2

Ситуация с контекстными фильтрами и группами фильтров действительно мрачная. Вот ветка на Do об этом toppic, который имеет то же решение, что и @CoreDumpError.

https://drupal.org/node/1451218

Кроме того, вот модуль, который может помочь разрешить конфликтующие контекстные и открытые фильтры ... Вид фильтра Harmonizer

doublejosh
источник