【发布时间】:2010-07-02 05:59:46
【问题描述】:
在 Drupal 中向页面添加节点时可以自动添加菜单项吗?
换句话说,我可以将菜单父级与节点内容类型相关联,然后在添加新节点时自动添加子级吗?
谢谢
【问题讨论】:
在 Drupal 中向页面添加节点时可以自动添加菜单项吗?
换句话说,我可以将菜单父级与节点内容类型相关联,然后在添加新节点时自动添加子级吗?
谢谢
【问题讨论】:
您可以使用 Drupal 7 上的规则来做到这一点。这个模块:http://drupal.org/project/menu_rules 向规则添加了一些操作。其中之一是为节点创建菜单项。您选择: 事件:创建节点 |更新节点 条件:内容类型为“您的内容类型” 操作:更新节点的菜单项(如果菜单项不存在,则有一个复选框来创建菜单项)
【讨论】:
还有Menu Position 模块允许根据内容类型、语言和分类将内容置于特定菜单项下。它还有一个小的 API 来添加其他标准。
【讨论】:
是的。
我确信有一个模块可以做类似的事情,但你也可以创建自己的。
有两种方法可以解决。
您可以使用hook_menu() 来查询您想要的项目并返回正确的菜单结构。您还需要确保使用hook_nodeapi() 在节点上重建菜单缓存。 请参阅下面 henricks 的 cmets,了解为什么这是一个坏主意
或者,您可以使用 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;
}
【讨论】:
hook_menu()! 创建可见的菜单项只是挂钩的副作用/便利功能,不是主要目的乙>。这个钩子创建/操作的“菜单”是 Drupal 内部菜单系统(路由器表),而不是可见的 UI 菜单。根据 Jeremys 的第二个建议,应通过 menu_link_save 创建可见的菜单条目(这是 hook_menu 使用自身创建“方便”条目的方法)。
hook_menu 动态创建多个条目确实没有错,但在每个节点上使用一个条目阻塞路由器表是一个巨大的禁忌,恕我直言。 (它会影响性能,但更重要的是,它会弄乱许多其他功能,因为它会导致节点具有多个内部路径。许多修改依赖于通过其内部路径来识别节点页面是 'node/[ nid]',这会打破这种方法!)
您应该查看Auto Menu module - 虽然 Drupal 6 版本仍然是开发版本,但它可能满足您的需求。如果没有,您可以以如何使用menu_link_save() 来创建自己的解决方案为例。
【讨论】:
我也会去打一个 menu_link_save() 电话。与规则模块一起,您可以在保存新节点时设置一个操作,以自动创建适当的菜单项。
你可能想看看我前段时间写的教程,它处理使用 menu_link_save() 和规则以编程方式创建菜单项:http://jan.tomka.name/blog/programmatically-creating-menu-items-drupal
【讨论】:
这是您可以执行此操作的情况.... 创建时创建菜单项“CAMPAIGN 001”的节点活动。使用default_menu_link 现在另一种内容类型,“子广告系列”创建一个节点,使用广告系列作为 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
【讨论】:
这是一个简单的问题,不幸的是,Drupal 社区决定让它变得复杂。忘记所有带有规则和钩子的 hacky 解决方案。根据您使用的是 Drupal 6 还是 Drupal 7,有两个模块可以非常优雅地解决问题。我建议不要实际创建菜单条目。相反,下面的两个模块会动态呈现菜单中的节点,这样您的菜单编辑器就不会被数千个节点填满。然后,例如,如果您决定要将所有博客文章从 [我们的博客] 移动到 [关于我们]->[新闻],只需更改一个设置即可。无需更新数千个节点。
【讨论】:
看起来有一个 Drupal 模块可以做到这一点:Auto Menu。有关此模块的更多详细信息(来自其项目页面):
自动菜单模块在节点创建/编辑时自动生成菜单条目。可以基于每个内容类型指定父菜单项。
仅当节点的菜单部分为空时,此模块才会起作用。因此,用户仍然可以手动组织菜单。此外,内容类型的默认设置是不自动创建菜单项。
【讨论】:
Menu Views 是 Drupal 7 自动生成菜单链接的一个有趣模块。它允许您使用 Views 的强大功能来创建菜单链接,并且可以开箱即用地与 Superfish 和 Nice 等模块结合使用菜单。
(PS:我的声誉不够高,无法提供两个以上的链接,因此我将其他模块标记为粗体而不是提供超链接)
【讨论】: