7

我目前正在开发一个模块,该模块通过 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_navigation_links调用menu_tree_page_data ,它只会返回单级链接。您可以按照此函数直到 menu_main_menu,然后在它之前使用 template_preprocess_page(这就是它最终在 page.tpl.php 中作为变量的方式)

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

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

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

相关问题:


将菜单树限制在第一级

如何在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

4

2 回答 2

3

您需要的第一件事是您当前所在页面的 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')
        )
));
于 2012-11-19T17:30:22.327 回答
0

这样的事情怎么样?

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;

}
于 2013-11-06T02:38:59.140 回答