2010-12-16 13 views

Antwort

1

Das Menüsystem ist zwischengespeichert, so dass Sie Menüelemente nicht beliebig hinzufügen oder entfernen können, basierend auf Benutzer, betrachtete Seite, benutzerdefinierte Logik usw. Das ist nicht möglich, ohne den Menü-Cache löschen zu müssen würde einen schweren Leistungseinbruch verursachen.

Um diesen Effekt zu erstellen, können Sie eine benutzerdefinierte Logik erstellen, um die Zugriffssteuerung für den Menüeintrag zu definieren. Da Drupal Menüelemente verbirgt, auf die Benutzer keinen Zugriff haben, können Sie unter bestimmten Umständen die Berechtigung verweigern, das Menüelement auszublenden. Dies ist ein bisschen hackische Lösung.

Eine andere Lösung, die ich bevorzugen würde, würde sein, js oder css zu verwenden, um das Menü zu verbergen oder zu zeigen. Sie können eine Klasse im Body dynamisch hinzufügen/entfernen, um festzustellen, ob der Menüeintrag angezeigt werden soll oder nicht. Dies würde schnell unmanagbar werden, wenn Sie mehrere dieser Art von Menüpunkten benötigen.

+1

Warum halten Sie es hackish einen Menüpunkt mit dem Zugangssystem zu verbergen? Drupal-Core macht das auch mit den Login/Logout-Links, ich sehe nichts falsch daran (es sei denn, Sie verstecken etwas, auf das der Benutzer über einen anderen Link zugreifen kann). – marcvangend

+0

@marcvandend: Es hängt davon ab, wie Sie es verwenden, wenn Sie eine benutzerdefinierte Zugriffsfunktion schreiben, um den Zugriff auf eine Seite zu verweigern, wenn Sie auf bestimmten anderen Seiten sind, würde ich das hackish nennen. Es ist sinnvoll, dass Sie sich nicht anmelden können, wenn Sie nicht angemeldet sind, aber nicht, dass Sie nicht auf eine Seite zugreifen können, wenn Sie sich auf einer anderen Seite befinden. Dieser Check hat an sich keine Bedeutung und würde nur dazu dienen, einen Menüeintrag zu verbergen. – googletorp

+0

Könnte man nicht auch verwenden (ja, wenn auch wieder, hack-ish - aber viel benutzt) css, um einfach zu "verstecken" basierend auf bestimmten CSS bereits im HTML-Markup vorhanden? Ein wenig .js wäre auch gut. Manchmal (sogar ich) vergesse ich, dass wir so viele Medien haben, um das DOM zu manipulieren :). –

3

Sie müssen hook_menu in Ihrem Modul implementieren. Beispiel:

<?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; 
} 
?> 

Der 'type' => MENU_SUGGESTED_ITEM, Teil macht es optional, so dass es durch den Endbenutzer freigegeben werden kann - ist das, was du gemeint mit „bedingt“? Wenn nicht, bitte erklären Sie, welche Art von "bedingt" Sie suchen.

2

Oder Sie können die 'type' => MENU_NORMAL_ITEM, verwenden, da es standardmäßig aktiviert ist, aber jederzeit deaktiviert werden kann. Dies hängt natürlich von Ihren Vorlieben ab. Weitere Informationen finden Sie unter http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7.

Eine weitere gute Sache zu wissen, wenn Modul definierte Menüelemente in benutzerdefinierten Menüs verwendet wird, könnte wie programmgesteuert das Menü erstellen, das Sie verwenden möchten, so dass alles "out of the box" erstellt wird. Fügen Sie einfach eine mymodule.install-Datei, in der Sie den folgenden Code setzen:

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

Wenn Sie eine Deinstallationsfunktion haben, nicht zu vergessen, nicht nur, um das Modul zu deaktivieren, sondern auch um es zu deinstallieren. Erneutes Aktivieren des Moduls, Leeren der Caches und der Menüpunkt sollte da sein!

2

Sie können einen Menüeintrag basierend auf einer Bedingung dynamisch anzeigen oder ausblenden (Rückruf). Hier

ist ein Beispiel aus 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

Verwenden menu_link_save() Funktion

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. 
Verwandte Themen