浏览网络和SE一段时间后,似乎没有很好的解决方案将2 contextual filters
与OR 组合(而不是默认的AND)。
这篇文章提到了一个PHP hack,并且这篇文章中有一些指向问题的链接,这些问题说明了7.x-3.1版中的最新更改。它还提到使用hook_views_query_alter(&$view, &$query)
来修改视图。
有没有人有可行的例子或更好的解决方案?
浏览网络和SE一段时间后,似乎没有很好的解决方案将2 contextual filters
与OR 组合(而不是默认的AND)。
这篇文章提到了一个PHP hack,并且这篇文章中有一些指向问题的链接,这些问题说明了7.x-3.1版中的最新更改。它还提到使用hook_views_query_alter(&$view, &$query)
来修改视图。
有没有人有可行的例子或更好的解决方案?
Answers:
请尝试以下问题中的补丁:从参数中提取过滤器值
它允许您将值从上下文过滤器传递到“普通过滤器”。在那里,您可以执行高级条件。
从此处开始的注释线程描述了一种有效的解决方法。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,导致上述功能中的代码不再影响它。
有一个模块可以更改视图的处理程序,以使上下文过滤器与OR或AND一起使用: 视图上下文过滤器OR
与这种情况语境过滤器和过滤器组确实不容乐观。这是关于此主题的Do主题,其解决方案与@CoreDumpError所述相同。
https://drupal.org/node/1451218
另外,这是一个模块,可以帮助解决冲突的上下文过滤器和公开的过滤器... 视图过滤器协调器