
Sometimes you'll need to create a menu link that is different for each user that views it. The simplest way to do this is to create a small custom module that will add the menu link and generate a dynamic URL.
In my case, I wanted a link title 'My Company' that would redirect the user to their own Organic Group.
What to do
- Create a menu entry
<?php function grasmash_menu() { //create menu item for My Company $items = array(); $items['my-company'] = array( 'title' => 'My Company', 'description' => 'View your company\'s page', 'page callback' => 'grasmash_my_company_link', 'access callback' => 'grasmash_user_has_company', 'expanded' => TRUE, 'weight' => -100, 'menu_name' => 'primary-links', ); return $items; } ?>
The page and access callbacks are functions that I'm about to create. For more information about the hook_menu function, checkout the hook_menu() entry in Drupal's API. I'd also recommend downloading the Examples for Developers module to get a good sense of how Drupal's basic functions work.
- Next, create a function that will actually determine the user's company (OG) ``` <?php //find user's company. this assume that each user only belongs to one company! //for admins, will choose the most recently joined company that user is an admin of function grasmash_get_user_company(){ global $user; $nid = db_result(db_query("SELECT og_uid.nid, node.type FROM og_uid, node WHERE og_uid.uid = %d AND node.type = 'company' AND node.nid = og_uid.nid ORDER BY og_uid.created DESC, og_uid.is_admin DESC LIMIT 1", $user->uid)); return $nid; } ?> ```
- Let's also create function for the access callback. This will determine whether the user should be able to see the link. ``` <?php //does the user actually belong to a company? function grasmash_user_has_company(){ if (grasmash_get_user_company()){ return TRUE; } } ?> ```
- Lastly, let's redirect the user to the correct node after they click on the link: ``` <?php //redirect the user to the right node function grasmash_my_company_link(){ $nid = grasmash_get_user_company(); drupal_goto('node/' . $nid); //return node_view($nid); //you could also simply load the node if you wanted to } ?> ```
Add new comment