2010-12-16 10 views
3

項目に条件付きでメニューを追加したいとします。私は、カスタムモジュールと "リンク"と呼ばれるメニューを持っています。モジュールコード内のメニューにアイテムを追加するにはどうすればよいですか?プログラムで項目をメニューに追加するDrupal

答えて

1

メニューシステムはキャッシュされているので、ユーザー、ページ閲覧、カスタムロジックなどに基づいてメニュー項目を追加したり削除したりすることはできません。メニューキャッシュをクリアする必要はありません。パフォーマンスが大幅に低下します。

この効果を作成するには、カスタムロジックを作成して、メニュー項目のアクセスコントロールを定義することができます。 Drupalはユーザーがアクセスできないメニュー項目を隠すので、特定の状況下ではメニュー項目を非表示にする権限を拒否することができます。これはややこしい解決策です。

私が好む別の解決策は、jsまたはcssを使用してメニューを表示または非表示にすることです。本文にクラスを動的に追加/削除して、メニュー項目を表示するかどうかを判断できます。しかし、これらのメニュー項目のいくつかが必要な場合、これはすぐに処理不能になります。

+1

?また、Drupalコアでは、ログイン/ログアウトのリンクでは、(ユーザーが別のリンクを介してアクセスできるものを隠していない限り)間違ったことはありません。 – marcvangend

+0

@marcvangend:それはあなたが他の特定のページにいるときにページへのアクセスを拒否するカスタムアクセス機能を書くなら、それをどのように使うかによって決まります。ログインしていないときはログインできませんが、別のページを開いているときはページにアクセスできないことは意味があります。そのチェックはそれ自体意味がなく、純粋にメニュー項目を隠すために使用されます。 – googletorp

+0

htmlマークアップに既に存在する特定のCSSに基づいて単純に '非表示にする' CSSを使用することもできませんでした(はい、もう一度、hack-ish - ですが)。ちょっと.jsでも大丈夫です。時には(私も)私たちがDOMを操作するために非常に多くの媒体を持っていることを忘れています。 –

3

モジュールにhook_menuを実装する必要があります。例:

<?php 
function mymodule_menu() { 
    $items['mymodule/links'] = array(
    'title' => 'Links', 
    'page callback' => 'mymodule_links_page', 
    'access arguments' => array('access content'), 
    'type' => MENU_SUGGESTED_ITEM, 
); 
    return $items; 
} 
?> 

'type' => MENU_SUGGESTED_ITEM,部分は、それはオプションになり、それがエンドユーザーによって有効にすることができます - あなたは、「条件付き」で何を意味するのかということでしょうか?そうでない場合は、あなたが探している「条件付き」の種類を説明してください。

2

'type' => MENU_NORMAL_ITEM,はデフォルトで有効になっているため使用できますが、いつでも無効にすることができます。これはもちろんあなたの好みにもよります。詳細については、http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7を参照してください。

カスタムメニューでモジュール定義のメニュー項目を使用するときに知っておくべきもう1つの良いことは、すべての機能が「すぐに」作成されるように、プログラムでメニューを作成する方法かもしれません。アンインストール機能を持​​っている場合は、モジュールを無効にするだけでなく、それをアンインストールすることを忘れないでください

<?php 
function mymodule_install() { 
    $menu = array( 
    'menu_name' => 'links', 
    'title' => 'My Custom Links', 
    'description' => 'Descriptive text.', 
); 
    menu_save($menu); 
} 
?> 

:単純に次のコードを入れてmymodule.installファイルを追加します。モジュールを再び有効にし、キャッシュをフラッシュしてメニュー項目をそこに置く必要があります。

2

条件(アクセスコールバック)に基づいてメニュー項目を動的に表示または非表示にすることができます。ここで

https://drupal.org/project/examplesからの例です:あなたはそれをハックアクセスシステムを使用してメニュー項目を非表示に考えるのはなぜ

<?php 
function mymodule_menu() { 
    $items = array(); 

    $items['my-menu-item'] = array(
    'title' => 'My Menu', 
    'description' => 'My description', 
    'page callback' => 'my_page_link_callback_function_name', 
    'access callback' => 'can_the_user_see_this_item', 
    'expanded' => TRUE, 
    'weight' => -100, 
    'menu_name' => 'primary-links', 
); 

    return $items; 
} 

// Here we determine if the user can or can not see the item. 
function can_the_user_see_this_item(){ 
    if (MY_CONDITION){ 
    return TRUE; 
    } 
    else { 
    return FALSE; 
    } 
} 
1

使用menu_link_save()機能

Saves a menu link. 

After calling this function, rebuild the menu cache using menu_cache_clear_all(). 

Parameters 

$item: An associative array representing a menu link item, with elements: 

link_path: (required) The path of the menu item, which should be normalized first by calling drupal_get_normal_path() on it. 
link_title: (required) Title to appear in menu for the link. 
menu_name: (optional) The machine name of the menu for the link. Defaults to 'navigation'. 
weight: (optional) Integer to determine position in menu. Default is 0. 
expanded: (optional) Boolean that determines if the item is expanded. 
options: (optional) An array of options, see l() for more. 
mlid: (optional) Menu link identifier, the primary integer key for each menu link. Can be set to an existing value, or to 0 or NULL to insert a new link. 
plid: (optional) The mlid of the parent. 
router_path: (optional) The path of the relevant router item. 
$existing_item: Optional, the current record from the {menu_links} table as an array. 

$parent_candidates: Optional array of menu links keyed by mlid. Used by _menu_navigation_links_rebuild() only. 

Return value 

The mlid of the saved menu link, or FALSE if the menu link could not be saved. 
関連する問題