Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing menu links, if user is authenticated or not

I need to change the menu links on my website (and leave the same items names) depending on the user is a guest, or authenticated user.

What's the standard way to do it ?

thanks

like image 605
aneuryzm Avatar asked Jul 13 '10 12:07

aneuryzm


2 Answers

You cannot dynamically change a menu item's path, because menu items are cached.

Still, AFAIK, there are two ways to get what you want. Both methods require you to create your menu items with hook_menu in a custom module (not from the Menu UI).

The first method is to create two menu items with identical names and set the access rules so that one is only available for logged guests, the other for authenticated users. Since Drupal will only show menu items that the user is allowed to access, only one will show up at any given moment. In Drupal core, you can see how the user module creates a menu item for anonymous users by looking at the /user/login path in user_menu().

The second method is to create a single menu item and check in the menu callback if the user is logged in. If the user is logged in, you serve one page, if not you serve another. In Drupal core, the /user path works like this. See user_page to see how the code works.

like image 113
marcvangend Avatar answered Sep 21 '22 07:09

marcvangend


You can dynamically change a menu item's path - see hook_translated_menu_link_alter.

This hook is called before every menu item is rendered IF it has the property ['options']['alter'] = TRUE.

You can set this property to menu items using hook_menu_link_alter.

Example code would be:

function MY_MODULE_menu_link_alter(&$item) {
    $item['options']['alter'] = TRUE;
}

function MY_MODULE_translated_menu_link_alter(&$item, $map) {
    if($item['mlid']==89) {
        $item['link_path'] .= 'my-new-path';
    }
}
like image 33
Felix Eve Avatar answered Sep 18 '22 07:09

Felix Eve