如何使用视图上下文过滤器OR?


18

浏览网络和SE一段时间后,似乎没有很好的解决方案将2 contextual filters与OR 组合(而不是默认的AND)。

这篇文章提到了一个PHP hack,并且这篇文章中有一些指向问题的链接,这些问题说明了7.x-3.1版中的最新更改。它还提到使用hook_views_query_alter(&$view, &$query)来修改视图。

有没有人有可行的例子或更好的解决方案?


我认为目前尚无更好的解决方案。如您所指出的线程中所述,这显然是一个持续存在的问题。本周,我偶然发现了相同的问题,不得不寻找附件的解决方法。但是,它并没有给出混合的列表,而是给出了两个相连的列表,这不能满足所有需求。
Countzero 2012年

Answers:



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 OR ...)),我必须将“内容:已发布(是)”移至一个新的过滤器组(使用“与/或,重新排列”对话框)。请注意,在将UI移到新组(没有其他组)之后,UI并未显示“内容:已发布(是)”过滤器,但是在传递给hook_views_query_alter()它的查询对象中确实移动了它从组0到组1,导致上述功能中的代码不再影响它。


1
最好至少解释一下与OP的问题相关的内容。不鼓励仅链接的答案,因为链接可能不会持久。
Triskelion

@Triskelion:啊,你是绝对正确的。我已经修改了我的回复以解决此问题。
coredumperror

4

有一个模块可以更改视图的处理程序,以使上下文过滤器与OR或AND一起使用: 视图上下文过滤器OR


我想创建一个包含“当前用户”内容和“来自标记用户的内容(当前用户已使用关注标记[用户]标记的”)的视图”
Umair

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.