如何通过URL中的分类法参数过滤块视图?

时间:2010-11-03 13:40:46

标签: drupal drupal-views

我的侧边栏中有一些块视图,显示标记为某些城市中突出显示的事件。使用分类法将节点组织到城市中。

当我直接加载节点时,我有一个像www.host.com/events/new-york/name-of-my-nice-event

这样的网址

我还有一些其他网页浏览量可以显示特定城市中所有活动的预告片:www.host.com/events/new-york

此外,我还有一些对所有城市都有效的静态网页,例如: www.host.com/about-us

整个网站都提供了显示精彩内容的侧边栏。现在我想确保侧边栏中的块仅根据URL中提供的分类显示所选城市的节点。 (静态页面除外,因为URL中没有分类,但那些并不重要)

到目前为止,我尝试将使用PHP作为标准参数的分类术语作为参数传递给我:

if (arg(1)) {
    $term = arg(1);
    return $term;
}

这适用于上述网页浏览量(例如www.host.com/events/new-york)。但是当我直接加载一个节点www.host.com/events/new-york/name-of-my-nice-event时,我的块只显示空文本。

我认为参数的索引是这样的:

           events/new-york/name-of-my-nice-event
           ^0     ^1       ^2

所以我不明白为什么当我查看节点细节时arg(1)没有返回new-york

3 个答案:

答案 0 :(得分:0)

首先,使用路径和路径自动,你看到的并不总是你得到的。

Fx我可以为我的文章节点设置pathauto来生成这样的网址

content/article/[title]

所以如果我想要标题我应该使用arg(2)吗?

不!(在这种情况下,arg(2)实际上是NULL。)

原因是路径auto生成的url是一个假网址,被转换为Drupal网址。在上面的例子中,我得到的是node/[nid]。因此,尽管网址中的节点标题为i,但我无法使用arg()获取,但我可以使用nid获取arg(1)

我猜不出你的网址映射到了什么,这取决于你如何设置你的网站使用的模块等。

如果你做了很多这些情境感知的事情,那么一个很好的建议就是研究panels。它使得能够告诉模块,例如关于它所存在的上下文的视图。与fx术语,节点等一样,您可以使用它将参数传递给视图。

面板可以做得更多而且非常复杂,但如果你需要做很多这样的事情,那么投资可能是值得的。

答案 1 :(得分:0)

解决我的问题:

if (arg(0) == 'node' && is_numeric(arg(1))) {
    $node = node_load(arg(1));

    if (count($node->taxonomy) > 0)  {
      foreach ($node->taxonomy as $term) {
        $term = $term->name;
      }
    }

    $term = strtolower($term); // for some reason needed in my case
}

else {
    $term = arg(1);
    $term = str_replace('-', ' ', $term); // for some reason needed in my case
}

return $term;

答案 2 :(得分:0)

虽然这在其他一些答案中描述的视图2在技术上是可行的,但是视图3内置了这种集成。

您可以为分类术语ID创建参数,然后选择“提供默认参数”。然后,这将为您提供“来自URL的分类术语ID”和“从节点页面加载默认参数...”的选项

这将允许您获取页面的分类并将其作为参数传递给视图块。

注意:视图3目前处于Alpha 3中,但根据我的经验处于相对稳定的状态,我在生产站点上使用它。如果它具有您认为有用的上述功能,请使用它,测试它并在遇到任何问题时提交错误/补丁!