Drupal par programmation l'ajout d'un élément à un menu
Je souhaite conditionnellement ajouter un élément à un menu. J'ai un module personnalisé et un menu appelé "liens". Comment puis-je ajouter un élément à un menu dans mon module de code?
Le système de menu est mis en cache, de sorte que vous ne pouvez pas ajouter ou supprimer des éléments de menu que vous s'il vous plaît en fonction de l'utilisateur, page consultée, la logique personnalisée etc. C'est que vous ne pouvez pas le faire sans avoir à effacer le menu cache qui serait la cause d'une grave dégradation des performances.
Ce que vous pourriez faire, pour créer cet effet est de créer une logique personnalisée pour définir le contrôle d'accès sur l'élément de menu. Depuis Drupal cache des éléments de menu que les utilisateurs n'ont pas accès à l', vous pouvez, dans certaines circonstances, refuser l'autorisation de masquer l'élément de menu. C'est un peu hackish solution.
Une autre solution que je préfère, serait d'utiliser du js ou css pour masquer ou afficher le menu. Vous pourriez ajout/suppression une classe sur le corps afin de déterminer si l'élément de menu doit être affichée ou non. Cela deviendrait rapidement unmanagable si vous avez besoin de plusieurs de ces types d'éléments de menu, cependant.
Pourquoi considérez-vous qu'il hackish pour masquer un élément de menu en utilisant le système d'accès? De base de Drupal aussi est-ce avec la connexion/déconnexion des liens, je ne vois rien de mal à cela (sauf si vous avez quelque chose à cacher à l'utilisateur d'avoir accès via un autre lien). Cela dépend de comment vous l'utilisez, si vous écrivez un accès personnalisé fonction de refuser l'accès à une page lorsque vous êtes sur certaines autres pages, je dirais que la hackish. Il est logique que vous ne pouvez pas vous connecter quand vous n'êtes pas connecté, mais pas que vous ne pouvez pas accéder à une page lorsque vous êtes sur une page différente. Que l'enregistrement n'a pas de sens en elle-même, et serait purement être utilisé pour masquer un élément de menu. Ne pourrait-on pas également utiliser (oui, mais encore une fois, hack-ish - mais beaucoup utilisé) css tout simplement de "cacher" des informations de base de css existant déjà dans le code html? Un peu .js serait très bien. Parfois (même si j') oublier que nous avons autant de médias pour manipuler le DOM :).
La 'type' => MENU_SUGGESTED_ITEM, partie optionnelle, de sorte qu'il peut être activé par l'utilisateur final - c'est ce que tu voulais dire avec "conditionnellement"? Si non, veuillez expliquer ce genre de "conditionnellement" vous êtes à la recherche pour.
Ou vous pouvez utiliser le 'type' => MENU_NORMAL_ITEM, depuis qu'il est activé par défaut, mais peut être désactivé à tout moment. Bien sûr, cela dépend de vos préférences. Voir http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7 pour référence ultérieure.
Une autre bonne chose à savoir lors de l'utilisation de module défini les éléments de menu dans le menu personnalisé peut-être comment programmer le menu que vous souhaitez utiliser de sorte que tout ce qui est créé "out of the box". Il suffit d'ajouter un mymodule.installez-le fichier où vous avez mis le code suivant:
<?php
function mymodule_install(){
$menu = array('menu_name'=>'links','title'=>'My Custom Links','description'=>'Descriptive text.',);
menu_save($menu);}?>
Si vous avez une fonction de désinstallation ne pas oublier non seulement de désactiver le module, mais aussi pour le désinstaller. Réactiver le module, vider vos caches et de l'élément de menu doit être là!
<?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;}}
Saves a menu link.After calling thisfunction, 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.Defaultis0.
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 0or 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.Usedby _menu_navigation_links_rebuild() only.Return value
The mlid of the saved menu link,or FALSE if the menu link could not be saved.
Le système de menu est mis en cache, de sorte que vous ne pouvez pas ajouter ou supprimer des éléments de menu que vous s'il vous plaît en fonction de l'utilisateur, page consultée, la logique personnalisée etc. C'est que vous ne pouvez pas le faire sans avoir à effacer le menu cache qui serait la cause d'une grave dégradation des performances.
Ce que vous pourriez faire, pour créer cet effet est de créer une logique personnalisée pour définir le contrôle d'accès sur l'élément de menu. Depuis Drupal cache des éléments de menu que les utilisateurs n'ont pas accès à l', vous pouvez, dans certaines circonstances, refuser l'autorisation de masquer l'élément de menu. C'est un peu hackish solution.
Une autre solution que je préfère, serait d'utiliser du js ou css pour masquer ou afficher le menu. Vous pourriez ajout/suppression une classe sur le corps afin de déterminer si l'élément de menu doit être affichée ou non. Cela deviendrait rapidement unmanagable si vous avez besoin de plusieurs de ces types d'éléments de menu, cependant.
Cela dépend de comment vous l'utilisez, si vous écrivez un accès personnalisé fonction de refuser l'accès à une page lorsque vous êtes sur certaines autres pages, je dirais que la hackish. Il est logique que vous ne pouvez pas vous connecter quand vous n'êtes pas connecté, mais pas que vous ne pouvez pas accéder à une page lorsque vous êtes sur une page différente. Que l'enregistrement n'a pas de sens en elle-même, et serait purement être utilisé pour masquer un élément de menu.
Ne pourrait-on pas également utiliser (oui, mais encore une fois, hack-ish - mais beaucoup utilisé) css tout simplement de "cacher" des informations de base de css existant déjà dans le code html? Un peu .js serait très bien. Parfois (même si j') oublier que nous avons autant de médias pour manipuler le DOM :).
OriginalL'auteur googletorp
Vous avez besoin pour mettre en œuvre hook_menu dans votre module. Exemple:
La
'type' => MENU_SUGGESTED_ITEM,
partie optionnelle, de sorte qu'il peut être activé par l'utilisateur final - c'est ce que tu voulais dire avec "conditionnellement"? Si non, veuillez expliquer ce genre de "conditionnellement" vous êtes à la recherche pour.OriginalL'auteur marcvangend
Ou vous pouvez utiliser le
'type' => MENU_NORMAL_ITEM,
depuis qu'il est activé par défaut, mais peut être désactivé à tout moment. Bien sûr, cela dépend de vos préférences. Voir http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7 pour référence ultérieure.Une autre bonne chose à savoir lors de l'utilisation de module défini les éléments de menu dans le menu personnalisé peut-être comment programmer le menu que vous souhaitez utiliser de sorte que tout ce qui est créé "out of the box". Il suffit d'ajouter un mymodule.installez-le fichier où vous avez mis le code suivant:
Si vous avez une fonction de désinstallation ne pas oublier non seulement de désactiver le module, mais aussi pour le désinstaller. Réactiver le module, vider vos caches et de l'élément de menu doit être là!
OriginalL'auteur Karlis Rode
Vous pouvez dynamiquement afficher ou masquer un élément de menu basé sur une condition d'accès ( rappel ).
Voici un exemple de https://drupal.org/project/examples:
OriginalL'auteur Francisco Luz
Utilisation menu_link_save() fonction
OriginalL'auteur milkovsky