当我在Drupal中向页面添加节点时,我可以自动添加菜单项吗?
换句话说,我可以将菜单父级与节点内容类型相关联,然后在添加新节点时自动添加子级吗?
感谢
答案 0 :(得分:4)
您可以使用Drupal 7上的规则来执行此操作。此模块:http://drupal.org/project/menu_rules向规则添加一些操作。其中之一是为节点创建菜单项。你选择: 事件:创建节点|更新节点 条件:内容类型是“您的内容类型” 操作:更新节点的菜单项(如果菜单项不存在,则有一个复选框以创建菜单项)
答案 1 :(得分:2)
还有Menu Position模块允许将内容放在特定菜单条目下,具体取决于其内容类型,语言和分类。它还有一个小API来添加其他标准。
答案 2 :(得分:1)
是
我确信有一个模块可以做到这一点,但你也可以创建自己的模块。
有两种方法可以解决这个问题。
您可以使用hook_menu()查询所需的项目并返回正确的菜单结构。您还需要确保使用hook_nodeapi()在节点上重建菜单缓存。 请参阅下面的henricks评论为什么这是一个坏主意
另外,您可以使用hook_nodeapi()添加menu_link_save()的自定义菜单项。
修改强>
hook_menu应该返回一个菜单项数组,这些菜单项通常非常静态,但这些数组是动态生成的。
因此,您可以查询节点表以获取所需的节点列表,循环浏览这些项并动态创建包含正确菜单项的数组。
非常粗略:
function example_menu() {
$result = db_query('select * from node where ...'); // put in your own select items and where clause
$menu = array();
while ($row = db_fetch_object($result)) {
$menu['my_path/' . $row->nid;] = array(
// See hook menu docs for what to put here.
);
}
return $menu;
}
答案 3 :(得分:0)
您应该查看Auto Menu module - 虽然Drupal 6版本仍然是开发版,但它可能会满足您的需求。如果没有,您可以将其作为如何使用menu_link_save()
创建自己的解决方案的示例。
答案 4 :(得分:0)
我也会去调用menu_link_save()。与Rules模块一起,您可以在保存新节点时设置操作,以自动创建适当的菜单项。
您可能想看一下我前一段时间编写的教程,该教程使用menu_link_save()和规则以编程方式创建菜单项:http://jan.tomka.name/blog/programmatically-creating-menu-items-drupal
答案 5 :(得分:0)
看起来有一个Drupal模块执行此操作:Auto Menu。有关此模块的更多详细信息(来自其项目页面):
自动菜单模块自动在节点创建/编辑上生成菜单条目。可以基于每种内容类型指定父菜单项。
当节点的菜单部分仅为空时,此模块起作用。因此,用户仍然可以手动组织菜单。此外,内容类型的默认设置是不自动创建菜单项。
答案 6 :(得分:0)
这是你可以做到这一点的情况.... 节点广告系列创建菜单项' CAMPAIGN 001'什么时候创建。使用default_menu_link 现在是另一种内容类型,' Sub Campaign'创建节点,使用广告系列作为EntityRef,因此其菜单项应位于之前创建的广告系列的菜单项下。
function mymodule_node_insert($node) {
if ($node->type == 'sub-campaign') {
if (isset($node->field_reference_campaign['und'][0]['target_id'])) {
$campaign_node_id = $node->field_photo_album_campaign['und'][0]['target_id'];
$campaign_loaded = node_load($campaign_node_id);
// Get menu link id for the campaign node.
$campaign_node_id_mlid = custom_node_mlid($campaign_node_id);
$campaign_loaded_title = strtolower(str_replace(' ', "-", $campaign_loaded->title));
$campaign_loaded_title_link_path = 'campaign/' . $campaign_loaded_title . '/photo-albums';
//I will query if it exist or not, if not then will create a sub menu item.
$link_exist = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $campaign_loaded_title_link_path))->fetchField();
dsm($link_exist);
if (!$link_exist) {
// Create menu item under campaign.
custom_create_menu_item($campaign_loaded_title_link_path, 'photo-albums', $campaign_node_id_mlid);
//watchdog('glue_site - Menu Item', 'Link Created');
}
else {
//dsm('Link Exist.');
watchdog('glue_site - Menu Item', 'Link Already Exist');
}
}
}
if ($node->type == 'campaign') {
}
}
然后是一个自定义函数来创建菜单项
function custom_create_menu_item($campaign_loaded_title_link_path, $type, $plid) {
switch ($type) {
case 'photo-albums':
$item = array(
'link_path' => $campaign_loaded_title_link_path,
// If changing the title here, change it in template.php as well.
'link_title' => 'Sub Campaign',
'menu_name' => 'menu-campaign-menu', // Menu machine name, for example: main-menu
'weight' => 0,
'plid' => $plid, // Parent menu item, 0 if menu item is on top level
'module' => 'menu',
'router_path' => 'campaign/%/sub-campaign',
'customized' => '1',
);
menu_link_save($item);
menu_cache_clear_all();
watchdog('glue_site - Menu Item', 'Link Created');
break;
}
}
获取父节点的mlid。广告系列节点...
function custom_node_mlid($nid) {
// Require menu node module.
$arr = menu_node_get_links($nid);
$mlid = array_keys($arr);
return $mlid[0];
}
为此,您需要menu_node
答案 7 :(得分:0)
这是一个简单的问题,不幸的是Drupal社区已经决定要复杂化。用规则和钩子忘掉所有hacky解决方案。有两个模块,取决于您是否在Drupal 6或Drupal 7上,可以非常优雅地解决问题。我建议不要实际创建菜单条目。相反,下面的两个模块动态呈现菜单中的节点,这样您的菜单编辑器就不会充满数千个节点。然后,例如,如果您决定将所有博客帖子从[我们的博客]移动到[关于我们] - > [新闻],它只是更改一个设置的主要内容。没有更新数千个节点。
D6 Menu Trails
答案 8 :(得分:-1)
Menu Views是Drupal 7自动生成菜单链接的一个有趣模块。它允许您使用视图的强大功能来创建菜单链接,并且可以与 Superfish 和 Nice等模块结合使用。菜单强>
(PS:我的声誉不足以提供两个以上的链接,因此我将其他模块标记为粗体而不是提供超链接)