如何基于菜单关系创建子节点的视图?


17

假设菜单树中有以下页面:

  • 专案
    • 项目一
    • 项目二
    • 项目三

我正在寻找一种创建视图的方法,该视图将嵌入到“项目”(父)页面中,该视图将显示子页面中的图片,标题和文本(摘要)。

父级和子级之间的关系在菜单树中定义。

我知道我可以使用节点引用,但这意味着每次有人创建页面时,他们都必须先定义菜单关系,然后再定义节点引用关系。

我也知道我可以创建另一个内容类型,但是我认为这太过分了,因为所有内容页面看起来都一样。


1
在另一个节点的子菜单中显示的节点之间没有直接关系(菜单链接和节点之间的唯一连接是菜单链接指向节点/ nid)。因此,您需要一些东西来将这些子节点链接在一起(并链接到父节点),这可能是一个常见的分类术语,book.module,...
Berdir 2011年

Answers:


4

一种解决方案是使用分类术语来定义关系,然后使用“ 分类菜单”模块将这些术语关系转换为菜单项。然后,如果您不想使用面板,则可以使用“ 自定义页面”模块和“上下文”模块来控制所有页面上的信息和区域。


16

您可以使用“ 菜单节点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;
      }  
   }
}

3
我认为过滤器应为“菜单:父菜单链接ID”,以获取当前节点的子节点。参数代码可以是:$ current = end(menu_get_active_trail()); 返回$ current ['mlid'];
Stefan

谢谢你 进行了一些改进(除了@Stefan的更正)。1)您可以使用menu_load_object(arg(1))而不是node_load()节省一些费用。2)您应该检查以确保菜单项来自您所关注的菜单。现在,您只返回第一个$mlid。在foreach内部,您应该添加条件if ($data->menu_name == 'my-menu')来解决此问题。和3)您可能想要添加第二个过滤器,menu: hidden以仅返回未隐藏的项目。使用相同的代码段,但返回$data->hidden;而不是$mlid
亚当·巴尔萨姆

2
我强烈不建议使用仍处于开发阶段的模块。
Ambidex 2014年

@Stefan是否可以让所有孩子都处于任何水平?而不只是第一。
伊莱·斯通

4

节点层次模块允许这种类型的关系,以及提供一观点的集成。

节点层次结构允许节点成为创建树状内容层次结构的其他节点的子级。该模块提供:

  • 一键式创建分层菜单
  • 分层面包屑
  • 使用Pathauto(和令牌模块)的自动分层URL

    (例如:q = aboutus / history / beginning)。

  • 如果需要,自动创建分层菜单。
  • 可选的视图集成。
  • 可选的节点访问集成。

2

也许对于D7 / Views 3来说已经改变了,但是您不需要任何PHP即可完成所需的行为:

  1. 安装menu_viewsmenu_nodemenu_node_views模块。
  2. 创建一个类型为“菜单树”的新视图
  3. 添加字段“菜单:链接标题”和“菜单:描述”
  4. 添加上下文过滤器/参数“菜单:节点ID”;提供默认值“来自URL的内容ID”
  5. 添加关系“菜单:父菜单链接ID”

瞧。它不应该起作用,但是可以。

它仅适用于节点,但效果很好,但是在节点层次结构上使用菜单链接的优点在于,您不仅限于围绕节点构建导航。您甚至可以在视图中包括外部链接。


这是暴露节点链接的好选择(我喜欢Aaron Bauman提出的示例视图导入:pastebin.com/u2GjmWG7)。但是,在OP请求时,使节点字段可用于视图时遇到了一些麻烦。如何完成的?
doub1ejack

通过将关系添加到“菜单:节点ID”,您应该能够公开节点字段。你看到类似的东西吗?
aaronbauman


0

您是否考虑过为此目的使用节点参考

  1. 提供要显示的内容类型的节点引用字段。
  2. 将该字段用作“视图”中的上下文过滤器(默认值:url的Content ID)。
  3. 将此视图显示作为块添加到内容中。例如,显示该节点的节点将被视为引用该节点的节点的父节点。

因此,您可以达到可能想要的结果。


0

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;
      }  
   }
}

0

如果您使用实体翻译,并且该节点附加到不同的菜单,则此处是对根据当前语言过滤的代码的改编。您需要像其他答案中所解释的那样,将其作为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);
    }
  }
}
  }

0

菜单节点视图发布队列中,我们有一个不错的解决方案:

  • 添加带有“父菜单链接ID”的上下文过滤器,
  • 选择“提供默认值”
  • 选择“自定义php代码”
  • 输入以下代码

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.