Drupal:添加新节点时自动添加菜单项

时间:2010-07-02 05:59:47

标签: drupal drupal-6

当我在Drupal中向页面添加节点时,我可以自动添加菜单项吗?

换句话说,我可以将菜单父级与节点内容类型相关联,然后在添加新节点时自动添加子级吗?

感谢

9 个答案:

答案 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

D7 Menu Position

答案 8 :(得分:-1)

Menu Views是Drupal 7自动生成菜单链接的一个有趣模块。它允许您使用视图的强大功能来创建菜单链接,并且可以与 Superfish Nice等模块结合使用。菜单

(PS:我的声誉不足以提供两个以上的链接,因此我将其他模块标记为粗体而不是提供超链接)