項目に条件付きでメニューを追加したいとします。私は、カスタムモジュールと "リンク"と呼ばれるメニューを持っています。モジュールコード内のメニューにアイテムを追加するにはどうすればよいですか?プログラムで項目をメニューに追加するDrupal
答えて
メニューシステムはキャッシュされているので、ユーザー、ページ閲覧、カスタムロジックなどに基づいてメニュー項目を追加したり削除したりすることはできません。メニューキャッシュをクリアする必要はありません。パフォーマンスが大幅に低下します。
この効果を作成するには、カスタムロジックを作成して、メニュー項目のアクセスコントロールを定義することができます。 Drupalはユーザーがアクセスできないメニュー項目を隠すので、特定の状況下ではメニュー項目を非表示にする権限を拒否することができます。これはややこしい解決策です。
私が好む別の解決策は、jsまたはcssを使用してメニューを表示または非表示にすることです。本文にクラスを動的に追加/削除して、メニュー項目を表示するかどうかを判断できます。しかし、これらのメニュー項目のいくつかが必要な場合、これはすぐに処理不能になります。
モジュールに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,
部分は、それはオプションになり、それがエンドユーザーによって有効にすることができます - あなたは、「条件付き」で何を意味するのかということでしょうか?そうでない場合は、あなたが探している「条件付き」の種類を説明してください。
'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ファイルを追加します。モジュールを再び有効にし、キャッシュをフラッシュしてメニュー項目をそこに置く必要があります。
条件(アクセスコールバック)に基づいてメニュー項目を動的に表示または非表示にすることができます。ここで
は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;
}
}
使用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.
- 1. Drupal 6:メニュー項目にサブメニュー項目を追加しますか?
- 2. Drupal 8 - メニュー項目にHTMLを追加/作成する
- 3. drupalメインメニューのメニュー項目にIDを追加
- 4. プログラムでメニュー項目としてビューを追加する
- 5. ワードプレスでメニュー項目を追加する
- 6. WinFormsを追加するAppメニュー項目
- 7. メニュー項目を別のアプリケーションに追加
- 8. Qt:QActionメニュー項目をドックアイコン(Mac)に追加
- 9. アクションバーメニュー項目をプログラムで追加する
- 10. 実行時にメニューにメニュー項目を追加する方法
- 11. Drupalの動的メニュー項目ですか?
- 12. Drupal 8番目のレベルのメニュー項目
- 13. リンクではないdrupalメニュー項目
- 14. メニュー項目の追加方法
- 15. メニュー項目をアンドロイドで動的に追加する方法は?
- 16. メニュー項目またはメニューをJavaのJTable列ヘッダーに追加
- 17. 対応するメニュー項目にクラスを追加する方法
- 18. Drupalの6:親メニュー項目のリダイレクト最初のサブメニュー項目
- 19. WebKitContextMenu(javascript、gjs)にメニュー項目を追加するには?
- 20. Android Studioのメニュー項目にカスタムスタイルを追加するには?
- 21. プロジェクトにカスタムフォントを追加する、プログラムで項目をplistに追加する
- 22. ブートストラップにアイコンを追加メニュー項目をドロップする
- 23. メニュー項目を水平表示で追加する
- 24. djangoセッションでメニュー項目のリストを追加する
- 25. Silverstripe CMSで新しいメニュー項目を追加する
- 26. メニュー項目をデフォルトの右クリックコンテキストメニューに追加する方法
- 27. ルックアンドフィールにアクションイベントを追加するメニュー項目
- 28. GLUT:実行時にメニュー項目を追加する
- 29. Joomla - メニュー項目リンクに変数を追加する
- 30. アンドロイドのメニュー項目間にパディングを追加する方法は?
?また、Drupalコアでは、ログイン/ログアウトのリンクでは、(ユーザーが別のリンクを介してアクセスできるものを隠していない限り)間違ったことはありません。 – marcvangend
@marcvangend:それはあなたが他の特定のページにいるときにページへのアクセスを拒否するカスタムアクセス機能を書くなら、それをどのように使うかによって決まります。ログインしていないときはログインできませんが、別のページを開いているときはページにアクセスできないことは意味があります。そのチェックはそれ自体意味がなく、純粋にメニュー項目を隠すために使用されます。 – googletorp
htmlマークアップに既に存在する特定のCSSに基づいて単純に '非表示にする' CSSを使用することもできませんでした(はい、もう一度、hack-ish - ですが)。ちょっと.jsでも大丈夫です。時には(私も)私たちがDOMを操作するために非常に多くの媒体を持っていることを忘れています。 –