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リストにレンダリングしました。」

人々は以前にこれを尋ねましたが、私は彼らの解決策を試しました、そして成功の考えられる原因はそれらの質問がdrupal6のためであるということではありません。私は現在drupal7で働いています。

あなたの助けは非常にありがたいです、ありがとう...

関連する質問:


メニューツリーを第1レベルに制限する

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 に答える