当前位置: 首页>>网站问题>>正文


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

webfans 网站问题 , , 去评论

问题描述

在浏览网络和SE一段时间后,在我看来没有很好的解决方案将2个contextual filters与OR(而不是默认的AND)结合起来。

这篇文章提到了一个PHP hack,这个post有一些指向issue的链接,说明了views 7.x-3.1最近的变化。它还提到使用hook_views_query_alter(&$view, &$query)来修改视图。

有没有人有一个工作实例或更好的解决方案?

最佳解决方法

请尝试此问题中的修补程序:Pull filter value from an argument

它允许您将值从上下文过滤器传递到”normal filter”。在那里你可以做你先进的条件。

次佳解决方法

启动here的注释线程描述了一种有效的解决方法。 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';
  }
}

还要注意这个警告:

显然,每个View附带的“Content:Published(Yes)”过滤器被认为是与上下文过滤器(组0)相同的过滤器组的一部分。因此,为了使我的视图仅显示属于上下文过滤器指定的任何组的已发布节点(已发布AND(arg1或arg2 OR …)),我必须将“内容:已发布(是)”移动到一个新的过滤器组(使用“And /Or,Rearrange”对话框)。请注意,在我将其移动到新组(没有任何其他组)之后,UI没有显示“内容:已发布(是)”过滤器,但在查询对象中,它被传递到hook_views_query_alter()中将它从组0移动到组1,导致上述函数中的代码不再影响它。

第三种解决方法

有一个模块可以更改Views的处理程序,使上下文过滤器与OR一起使用而不是AND:Views Contextual Filters OR

第四种方法

上下文过滤器和过滤器组的情况确实很暗淡。这是关于这个toppic的D.o上的线程,它具有@CoreDumpError所述的相同解决方案。

https://drupal.org/node/1451218

此外,这是一个模块,可以帮助解决冲突的上下文和公开过滤器… Views Filter Harmonizer

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2674.html,转载请务必附带本地址声明。