假设菜单树中有以下页面:
- 专案
- 项目一
- 项目二
- 项目三
我正在寻找一种创建视图的方法,该视图将嵌入到“项目”(父)页面中,该视图将显示子页面中的图片,标题和文本(摘要)。
父级和子级之间的关系在菜单树中定义。
我知道我可以使用节点引用,但这意味着每次有人创建页面时,他们都必须先定义菜单关系,然后再定义节点引用关系。
我也知道我可以创建另一个内容类型,但是我认为这太过分了,因为所有内容页面看起来都一样。
假设菜单树中有以下页面:
我正在寻找一种创建视图的方法,该视图将嵌入到“项目”(父)页面中,该视图将显示子页面中的图片,标题和文本(摘要)。
父级和子级之间的关系在菜单树中定义。
我知道我可以使用节点引用,但这意味着每次有人创建页面时,他们都必须先定义菜单关系,然后再定义节点引用关系。
我也知道我可以创建另一个内容类型,但是我认为这太过分了,因为所有内容页面看起来都一样。
Answers:
您可以使用“ 菜单节点API” 和“ 菜单节点视图”模块完全做到这一点。
创建具有所需内容类型的视图,然后选择“菜单:菜单链接ID”的上下文过滤器(仅在安装了上述模块的情况下可用)。
在“当过滤器值不可用时”下,选择“提供默认值”,然后选择“ PHP代码”。
下面的代码片段将执行此操作,然后您只需从视图中暴露一个块就可以了:
if (function_exists('menu_node_get_links')){
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)){
foreach($node->menu_node_links as $mlid=>$data){
return $mlid;
}
}
}
menu_load_object(arg(1))
而不是node_load()
节省一些费用。2)您应该检查以确保菜单项来自您所关注的菜单。现在,您只返回第一个$mlid
。在foreach内部,您应该添加条件if ($data->menu_name == 'my-menu')
来解决此问题。和3)您可能想要添加第二个过滤器,menu: hidden
以仅返回未隐藏的项目。使用相同的代码段,但返回$data->hidden;
而不是$mlid
。
也许对于D7 / Views 3来说已经改变了,但是您不需要任何PHP即可完成所需的行为:
瞧。它不应该起作用,但是可以。
它仅适用于节点,但效果很好,但是在节点层次结构上使用菜单链接的优点在于,您不仅限于围绕节点构建导航。您甚至可以在视图中包括外部链接。
有一个相对较新的模块,即“ 视图菜单节点子过滤器”似乎完全可以实现您想要的功能:
此模块向视图添加上下文过滤器,该过滤器将根据菜单的结构检索节点的子节点。
您是否考虑过为此目的使用节点参考?
因此,您可以达到可能想要的结果。
Emile的答案是正确的,但是我不得不将提到的PHP代码粘贴到“ 菜单:父菜单链接ID ” 类型的上下文过滤器中。
if (function_exists('menu_node_get_links')){
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)){
foreach($node->menu_node_links as $mlid=>$data){
return $mlid;
}
}
}
如果您使用实体翻译,并且该节点附加到不同的菜单,则此处是对根据当前语言过滤的代码的改编。您需要像其他答案中所解释的那样,将其作为PHP代码复制到视图中的上下文过滤器(父菜单链接ID)
if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
foreach ($node->menu_node_links as $mlid => $data) {
if ($lang == $data->language) {
return($mlid);
}
}
}
}