【问题标题】:Drupal: automatically add menu items when new nodes are addedDrupal:添加新节点时自动添加菜单项
【发布时间】:2010-07-02 05:59:46
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

    您可以使用 Drupal 7 上的规则来做到这一点。这个模块:http://drupal.org/project/menu_rules 向规则添加了一些操作。其中之一是为节点创建菜单项。您选择: 事件:创建节点 |更新节点 条件:内容类型为“您的内容类型” 操作:更新节点的菜单项(如果菜单项不存在,则有一个复选框来创建菜单项)

    【讨论】:

    • 在哪里选择这个事件“创建节点”?
    【解决方案2】:

    还有Menu Position 模块允许根据内容类型、语言和分类将内容置于特定菜单项下。它还有一个小的 API 来添加其他标准。

    【讨论】:

      【解决方案3】:

      是的。

      我确信有一个模块可以做类似的事情,但你也可以创建自己的。

      有两种方法可以解决。

      您可以使用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() 来查询您想要的项目并返回正确的菜单结构。”不清楚如何从 hook_menu 中获取节点列表
      • 不应为此使用hook_menu() 创建可见的菜单项只是挂钩的副作用/便利功能,不是主要目的乙>。这个钩子创建/操作的“菜单”是 Drupal 内部菜单系统(路由器表),而不是可见的 UI 菜单。根据 Jeremys 的第二个建议,应通过 menu_link_save 创建可见的菜单条目(这是 hook_menu 使用自身创建“方便”条目的方法)。
      • 我解释了路由器项与菜单项in another answer 的区别。另见When and how to use menu_links
      • 我会给你的第二个建议+1,第一个建议是-1,所以这取消了。虽然原则上通过hook_menu 动态创建多个条目确实没有错,但在每个节点上使用一个条目阻塞路由器表是一个巨大的禁忌,恕我直言。 (它会影响性能,但更重要的是,它会弄乱许多其他功能,因为它会导致节点具有多个内部路径。许多修改依赖于通过其内部路径来识别节点页面是 'node/[ nid]',这会打破这种方法!)
      【解决方案4】:

      您应该查看Auto Menu module - 虽然 Drupal 6 版本仍然是开发版本,但它可能满足您的需求。如果没有,您可以以如何使用menu_link_save() 来创建自己的解决方案为例。

      【讨论】:

        【解决方案5】:

        我也会去打一个 menu_link_save() 电话。与规则模块一起,您可以在保存新节点时设置一个操作,以自动创建适当的菜单项。

        你可能想看看我前段时间写的教程,它处理使用 menu_link_save() 和规则以编程方式创建菜单项:http://jan.tomka.name/blog/programmatically-creating-menu-items-drupal

        【讨论】:

          【解决方案6】:

          这是您可以执行此操作的情况.... 创建时创建菜单项“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

          【讨论】:

            【解决方案7】:

            这是一个简单的问题,不幸的是,Drupal 社区决定让它变得复杂。忘记所有带有规则和钩子的 hacky 解决方案。根据您使用的是 Drupal 6 还是 Drupal 7,有两个模块可以非常优雅地解决问题。我建议不要实际创建菜单条目。相反,下面的两个模块会动态呈现菜单中的节点,这样您的菜单编辑器就不会被数千个节点填满。然后,例如,如果您决定要将所有博客文章从 [我们的博客] 移动到 [关于我们]->[新闻],只需更改一个设置即可。无需更新数千个节点。

            D6Menu Trails

            D7Menu Position

            【讨论】:

              【解决方案8】:

              看起来有一个 Drupal 模块可以做到这一点:Auto Menu。有关此模块的更多详细信息(来自其项目页面):

              自动菜单模块在节点创建/编辑时自动生成菜单条目。可以基于每个内容类型指定父菜单项。

              仅当节点的菜单部分为空时,此模块才会起作用。因此,用户仍然可以手动组织菜单。此外,内容类型的默认设置是不自动创建菜单项。

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-05-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-22
                  相关资源
                  最近更新 更多