如何通过 URL 中的分类参数过滤块视图?
Posted
技术标签:
【中文标题】如何通过 URL 中的分类参数过滤块视图?【英文标题】:How do I filter a block view by taxonomy argument in URL? 【发布时间】:2010-11-03 13:40:45 【问题描述】:我的侧边栏中有一些块视图,显示标记为在某些城市发生的亮点事件。使用分类法将节点组织成城市。
当我直接加载一个节点时,我有一个类似 www.host.com/events/new-york/name-of-my-nice-event
的 URL
我还有一些其他页面浏览量显示了某个城市所有活动的预告片: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
。
【问题讨论】:
【参考方案1】:首先,使用 path 和 path auto,你看到的并不总是你得到的。
Fx 我可以为我的文章节点设置 pathauto 以生成这样的 url
content/article/[title]
所以如果我想要标题,我应该使用arg(2)
对吗?
不!(在这种情况下,arg(2)
实际上是 NULL
。)
原因是 path auto 生成的 url 是假 url,被翻译成 Drupal url。在上述情况下,我得到的是node/[nid]
。所以即使url中的节点标题i,使用arg()
也无法获取,但可以使用arg(1)
获取nid
我猜不出你的网址映射到什么,这取决于你如何设置你的网站你使用什么模块等等。
如果你做了很多这些上下文相关的事情,一个好的建议是查看panels。它能够告诉模块,如关于它存在的上下文的视图。像 fx 术语、节点等,您可以使用它来将参数传递到视图中。
面板可以做更多的事情并且相当复杂,但如果你需要做很多这样的事情,那么投资可能是值得的。
【讨论】:
非常感谢您为我指明了正确的方向。经过一段时间的尝试,我设法用发布的解决方案解决了我的问题。【参考方案2】:解决我的问题:
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;
【讨论】:
【参考方案3】:虽然如其他一些答案中所述,Views 2 在技术上是可行的,但 Views 3 已内置此集成。
您可以为分类术语 id 创建一个参数,然后选择“提供默认参数”。这将为您提供“来自 URL 的分类术语 ID” 和“从节点页面加载默认参数...”的选项。
这将允许您获取页面的分类并将其作为参数传递给您的视图块。
注意:Views 3 目前处于 Alpha 3 阶段,但根据我的经验,它处于相对稳定的状态,我正在生产站点上使用它。如果它具有您认为有用的上述功能,请使用它,测试它并在遇到任何问题时提交错误/补丁!
【讨论】:
以上是关于如何通过 URL 中的分类参数过滤块视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 URL 将变量过滤器添加到 Drupal 6 视图?