我有一个视图,它使用当前登录用户的id作为上下文过滤器。这是使用Drupal UI设置的,效果很好。然后我写了一个自定义模块,它为我网站上的所有视图添加了另一个参数(一个特定的节点ID)。所有视图都需要第二个参数(并且需要以编程方式添加)。此方法适用于仅使用以编程方式添加的参数作为上下文过滤器的所有视图。但是,需要2个过滤器值的视图不起作用,因为我认为我没有正确处理args数组中的参数顺序。如何设置已经使用过滤器值的视图,但我需要以编程方式添加更多(我设置$ args [0],但我想这可能是问题)?
我应该说我不希望这些过滤器出现在网址中。
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传递的数组中的参数)。哪个钩子最适合我想做的事情?
答案 0 :(得分:0)
我现在有了更好的理解并找到了解决方案。 hook_views_pre_view()
确实太早,看不到通过URL传递给视图的参数。这解释了为什么$ view-> args在我的情况下是空的。在hook_views_post_build()
中,您确实看到传递给视图的所有参数(URL + nonURL)。但是,我解决问题的方式仍在$args[0] = $value;
中使用hook_views_pre_view
。这意味着传递给所有视图的第一个参数将始终为$value
。对于使用其他参数的视图,Drupal稍后会将它们添加到$args
。在我的特殊情况下,我的视图可能不一定需要我传递的第一个参数,因此我必须添加一个上下文过滤器Global: Null
(在第一个位置),它允许忽略上下文过滤器值(以及默认我设置0)。这样每个视图都具有正确数量的上下文过滤器,并且顺序是正确的,无论视图是否需要使用第一个参数。将参数传递给每个视图似乎并不直观,即使并非所有视图都需要它,但添加Global: Null
虚拟过滤器比排除if()
语句中的视图更容易,并且总是需要修改以后必须添加新视图时的模块代码。