【问题标题】:How to get all the menu items below a certain parent in drupal 7?如何在drupal 7中获取某个父级以下的所有菜单项?
【发布时间】:2012-10-28 12:40:21
【问题描述】:

我目前正在开发一个模块,该模块通过 url 路径查找父菜单项,然后通过查找顶部父项来显示该相关菜单的当前树结构,最重要的是仅在该菜单中显示该菜单项和子菜单。

一个简单的解决方案是让 foreach 循环遍历所有项目或以所有项目作为键的数组。

path = '/system/menu/submenu';
parent = 'system';
output = parent + parent submenus.

“自定义菜单”中的所有菜单项:

- System
   - Menu wrapper
     - SubMenu 1A
     - SubMenu 2A
     - SubMenu 3A    
- Main
  - SubMenu 1B
  - SubMenu 2B
  - SubChildMenu 3B

PHP 代码应该返回这个:

- System
   - Menu wrapper
     - SubMenu 1A
     - SubMenu 2A
     - SubMenu 3A    

我的代码(目前不工作):

 $menu = menu_tree('my-custom-menu');
 return = theme('my_custom_menu', array('system' => $menu_tree));

注意:这里只需要php代码和php代码,其他模块不支持,只能手动选择。内容通过块显示。

"对于导航,Drupal 将调用 menu_tree_page_data 通过 menu_navigation_links 只会返回单级链接。 您可以按照此功能一直到 menu_main_menu,然后 template_preprocess_page 在它之前(这就是它最终成为 page.tpl.php 中的变量)

但是,如果您将菜单作为 block menu_tree_page_data 插入 由 menu_tree 调用(在之后立即调用 menu_tree_output 它为最终标记的数组做了一些额外的工作。) 两者都运行后,您可以将整个菜单树用作 然后我运行了一些自定义 PHP 代码来循环遍历的数组 数组并将其呈现为 HTML 列表。”

人们以前曾问过这个问题,但我已经尝试过他们的解决方案,但没有成功的可能原因是这些问题是针对 drupal 6 的。我目前正在使用 drupal 7。

非常感谢您的帮助,谢谢...

相关问题:


Restrict menu tree to first level

how to get all the menu items below a certain parent in drupal?

https://drupal.stackexchange.com/questions/28654/how-to-display-submenus-separate-from-their-menu-tree-in-drupal-7

https://drupal.stackexchange.com/questions/30112/displaying-a-menus-child-links

【问题讨论】:

    标签: php drupal module drupal-7 drupal-modules


    【解决方案1】:

    您需要的第一件事是您当前所在页面的 mlid:

    $q = variable_get('site_frontpage', 'node') == $_GET["q"] ? '<front>' : $_GET["q"];
    $current_menu_item = db_select('menu_links' , 'ml')
      ->condition('ml.link_path' , $q)
      ->fields('ml', array('mlid', 'plid'))
      ->execute()
      ->fetchAll();
    

    现在如果这个菜单项的 plid 为 0 则我们知道它是顶级菜单项,如果它不为 0 则我们需要获取父项。所以我们想要得到的树的顶部mlid是:

    $top_level_mlid = $current_menu_item->plid == 0 ? $current_menu_item->mlid : $current_menu_item->plid;
    

    然后你需要加载你的完整菜单:

    $full_menu_items = menu_tree_all_data('main-menu');
    

    现在循环遍历所有菜单项并获得我们想要的部分:

    foreach($full_menu_items as $menu_item) {
        if($menu_item['link']['mlid'] == $top_level_mlid) {
            $links = $menu_item['below'];
            break;
        }
    }
    

    $links 现在包含您所关注的菜单特定部分的所有链接。

    并将该数组作为页面上的菜单输出:

    echo theme('links__system_secondary_menu', array(
        'links' => $links, 
        'attributes' => array(
            'id' => 'secondary-menu', 
            'class' => array('links', 'clearfix')), 
            'heading' => array(
                'text' => t('Secondary menu'), 
                'level' => 'h2', 
                'class' => array('element-invisible')
            )
    ));
    

    【讨论】:

      【解决方案2】:

      这样的事情怎么样?

      function your_module_menu_link__your_menu($variables){
      
          $element = $variables['element'];
          $sub_menu = '';
      
          if ($element['#below']) {
      
              $sub_menu = drupal_render($element['#below']);
      
          }
      
          $ouput = "";
      
          if($element['#original_link']['plid'] > 0 || $element['#below']){
              $link = l($element['#title'], $element['#href'], $element['#localized_options']);
              $ouput = '<li' . drupal_attributes($element['#attributes']) . '>' . $link . $sub_menu . "</li>\n";
          }
      
          return $ouput;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 1970-01-01
        • 2014-07-10
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多