Jump to content

Hide Menu Items and/or empty module

From NusaATK
Revision as of 12:03, 26 June 2006 by Meinaart (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

ATK Howto: Hide Menu Items and/or empty module

Complexity: Advanced
Author: Meinaart van Straalen <meinaart@zicht.nl>

List of other Howto's

Issue

If you use the built-in security features for ATK you might have come accros the following scenario. If an user doesn't have rights on any of the nodes inside a module the module still appears in the main menu. This default behaviour is a little bit strange because when you click on a "empty" module you will only get the "back to Main menu" link. In this HowTo I will describe how you can hide a module from the main menu if there are no accessible nodes.

Solution

I found out that a module will not appear in the mainmenu if there are no menuitems added. So the solution I came up with is checking if the user has rights on the node before adding it to the menu.

class mod_orders extends atkModule {
	function getMenuItems() {
		// Get an instance of the security manager
		$securityManager = &atkGetSecurityManager();

		// An array with all the nodes in this module
		$nodes = Array("order","items");
		
		// The hasAccess variabele indicates if the logged in user
		// has access to any of the nodes in this module.
		
		$hasAccess = false; // Default is no access
		
		// If the user does have access to one of the nodes 
		// the menu items are added. The securityManager takes care of hiding
		// specific nodes bases on the rights the user has.
		foreach($nodes AS $nodeName) {
			if($securityManager->allowed("orders",$nodeName)) {
				// Accessible item found
				$hasAccess = true;
				break;
			}
		}
		
		if($hasAccess) {
			$this->menuitem("orders");
			
			// Loop through $nodes and add them to the menu
			// this is just an example. In the real world
			// you probably would want different kind of minimal rights
			// and perhaps a different default view.
			foreach($nodes AS $nodeName) {
				$this->menuitem("order", dispatch_url("orders.".$nodeName, "admin"), "orders", Array("orders.".$nodeName,"admin"));
			}
		}
	}

This is just an example of the getMenuItems function. If you use this you should of course also have a getNodes function with the proper rights.