以编程方式将一个参数添加到已经使用上下文过滤器的视图中



i具有一个视图,该视图将当前登录的用户的ID用作上下文过滤器。这是使用Drupal UI设置的,并且运行良好。然后,我编写了一个自定义模块,该模块将另一个参数(一个特定节点ID)添加到我的网站上的所有视图中。所有视图都需要此第二个参数(并且需要以编程方式添加)。此方法适用于仅使用编程添加的参数作为上下文过滤器的所有视图。但是,需要2个滤波器值的视图不起作用,因为我认为我没有正确处理ARGS数组中的参数顺序。我如何设置已经使用过滤值的视图,但是我需要以编程方式添加更多(我设置$ args [0],但我想这可能是问题)?

)?

我应该说我不希望这些过滤器出现在URL中。

testmod.module:

function testmod_views_pre_view($view, $display_id, array &$args) {
  ...
  $args[0] = $value;
}

我以为我可以只读取视图的$ arg数组并以编程方式添加我的特殊参数,但是对于使用登录用户作为上下文过滤器的视图,当我打印print_r($args)时,它是一个空数组,尽管该视图正常工作(仅显示当前用户的结果)。我通过UI设置的上下文过滤器是否与$ args不同?

需要做些什么才能说出如何使用1.和2.正确的滤波器值?我在这里迷路了。

编辑:我读到hook_views_pre_view()在ARG数组中找到上下文过滤器还为时过早(此时您只会在通过URL传递的该数组中看到参数)。哪个钩子最好实现我想做的事?

我现在有了更好的理解并找到了解决方案。hook_views_pre_view()确实为时过早,无法看到未通过URL传递给视图的论点。这就解释了为什么$ view-> args在我的情况下是空的。在hook_views_post_build()中,您确实看到所有参数(URL nonurl)传递给视图。但是,我解决问题的方式仍在使用hook_views_pre_view中的$args[0] = $value;。这意味着传递给所有视图的第一个参数始终是$value。对于使用其他参数的视图,Drupal稍后将它们添加到$args。在我的特殊情况下,我的视图可能不一定需要我通过的第一个参数,因此我不得不添加上下文滤波器Global: Null(在第一个位置),该滤波器允许忽略上下文滤波器值(并且作为默认的i设置0)。这样,每个视图确实具有正确数量的上下文过滤器,并且订单是正确的,无论该视图是否需要使用第一个参数。即使并非所有视图都真正需要它,也可能没有直觉将参数传递给每个视图,但是添加Global: Null虚拟滤镜比在if()语句中排除视图更容易以后添加。

最新更新