特定のノードを指すメニュー項目を見つける方法は?
ノードの作成時に、ノードの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を見つけることができますか?
私は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」が新しいノードとして作成され、メインメニューの[照会]メニュー項目のサブメニュー項目として追加されます。
メニュー管理ページでメニュー項目を編集します。IDはメニュー項目編集ページのURLにあります。ほとんどの場合、メニュー項目のIDは<a>
リンクのクラスとしても見つかります。
編集:
Aのパスがわかっている場合は menu_get_item を使用するか、パスのmenu_links
テーブルフィルタリングでdb_selectを使用できます。
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データが保存されたときに何らかのことを行う)で機能しないため、ノードの編集(発行後)でトリガーします。