web-dev-qa-db-ja.com

メニュー項目IDを検索しています

特定のノードを指すメニュー項目を見つける方法は?

ノードの作成時に、ノードのmain_menuリンクを作成します。 menu_rulesを使用すると、比較的簡単です。この問題は、親要素が異なる可能性がある場合に発生します。

main_menu
Groups
-[GROUPS]
--[GROUP_CONTENT]

main_menu
...
Groups
-A
--a1
--a2
-B
--b1
-C
...

上記の場合、新しいグループDを追加するのは簡単です。「グループ」にメニュー項目を追加するだけですが、a3を追加したい場合はどうしますか?私はAの名前を知っており、それが何にリンクされているか(グループを表すノード)を知っていますが、ランダムに生成されたメニューID([menu-1082]など)を知りません。

どうすればそのIDを見つけることができますか?

3
Pawel G

私はDrupalのほとんど新しいユーザーですが、自分でモジュールを作成しているため、同じ問題が発生しました。私のニーズは、ノードを作成し、それをメインメニュー項目のサブメニューとして挿入することです。私はこの方法で問題を解決しました:

私はこの関数を書きました

function mymodule_get_plid($menu_name , $name) {
    $menu = menu_tree_all_data($menu_name);
    foreach ($menu as $item => $menuitem) {
        if ($name == $menuitem['link']['link_title']) {
            return $menuitem['link']['mlid'];
            break;  
        }
    }
    return false;
}

$ menunameは 'main-menu'のような文字列で、$ nameはIDを検索するメニュー項目です。関数は$ nameを見つけるとIDを返し、そうでなければfalseを返します。

次に、ノードの作成を完了するためにこれを書きました。

$node = new stdClass();
$node->title = "YOUR TITLE";
$node->type = "page";  // Creating a node of Basic page type
node_object_prepare($node); // Sets some defaults. Invokes hook_prepare() and hook_node_prepare().
$node->language = LANGUAGE_NONE; // Or e.g. 'en' if locale is enabled
$node->uid = $account->uid;
$node->status = 1; //(1 or 0): published or not
$node->promote = 0; //(1 or 0): promoted to front page
$node->comment = 0; // 0 = comments disabled, 1 = read only, 2 = read/write

$node->menu['enabled'] = TRUE;
$node->menu['menu_name'] = 'main-menu';
$node->menu['plid'] = mymodule_get_plid('main-menu' , 'Inquiries');
$node->menu['link_title'] = 'MY SUBMENU NAME';
$node->menu['description'] = ''; // Needed even if empty to avoid notices.  /*  

$node = node_submit($node); // Prepare node for saving
node_save($node);

これですべてが正常に動作し、「MY SUBMENU NAME」が新しいノードとして作成され、メインメニューの[照会]メニュー項目のサブメニュー項目として追加されます。

5
Antoine

メニュー管理ページでメニュー項目を編集します。IDはメニュー項目編集ページのURLにあります。ほとんどの場合、メニュー項目のIDは<a>リンクのクラスとしても見つかります。

編集:

Aのパスがわかっている場合は menu_get_item を使用するか、パスのmenu_linksテーブルフィルタリングでdb_selectを使用できます。

3

IDを取得するには、次の関数を使用してdbをクエリします。引数としてコンテンツのノードIDを受け取り、親グループのメニュー項目のIDを返します。

function mymodule_get_fathers_menu_item($nid){
    $node = node_load($nid);
    $fathers_gid = mymodule_get_father($node);
    $fathers_nid = mymodule_get_nid_from_gid($fathers_gid);
    $father_node_link = "node/".$fathers_nid;

    $query = db_select('menu_links');
    $query->addfield('menu_links','mlid','mlid');
    $query->condition('link_path', $father_node_link,'=');

    $results = $query->execute();
    $result = $results->fetchAssoc();

    //drupal_set_message($result['mlid']);

    return ("main-menu:".$result['mlid']) ;
}

次に、親パラメーターをPHPコードとして、menu_rulesモジュールから「ノードのメニュー項目を作成する」アクションを使用します。

return windbench_get_fathers_menu_item( $value );

およびnode:nidのデータセレクターセット。

私のコードはノードの作成(おそらくogデータが保存されたときに何らかのことを行う)で機能しないため、ノードの編集(発行後)でトリガーします。

1
Pawel G