Magento Admin :: Delete menu item for specific roles / users

I want to remove a menu item from adminmenu for a specific user role. I have seen others do this by creating a mannequin, but they are not role-based. I want to do this without using one of the .xml files. Is there any way to do this, for example; __construct () or prepareLayout?

EDIT: I have to add to this that the part I want to disable is the "Hierarchy Management" element in the CMS. I know that I can just turn off the Hierarchy for the user, but I need this to save the CMS pages.

+7
source share
2 answers

I am extending Mage_Adminhtml_Block_Page_Menu with my own block. I copied the function "_buildMenuArray ()" And just before returning the menu array, I check if the current login is not an administrator user. If so; I delete the "Hierarchy" element in the menu and set the value to "Page" with the last value so that the shadow displays correctly.

class Xxxxx_Xxxx_Block_Adminhtml_Page_Menu extends Mage_Adminhtml_Block_Page_Menu { protected function _buildMenuArray(Varien_Simplexml_Element $parent=null, $path='', $level=0) { if (is_null($parent)) { $parent = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu'); } $parentArr = array(); $sortOrder = 0; foreach ($parent->children() as $childName => $child) { if (1 == $child->disabled) { continue; } $aclResource = 'admin/' . ($child->resource ? (string)$child->resource : $path . $childName); if (!$this->_checkAcl($aclResource)) { continue; } if ($child->depends && !$this->_checkDepends($child->depends)) { continue; } $menuArr = array(); $menuArr['label'] = $this->_getHelperValue($child); $menuArr['sort_order'] = $child->sort_order ? (int)$child->sort_order : $sortOrder; if ($child->action) { $menuArr['url'] = $this->_url->getUrl((string)$child->action, array('_cache_secret_key' => true)); } else { $menuArr['url'] = '#'; $menuArr['click'] = 'return false'; } $menuArr['active'] = ($this->getActive()==$path.$childName) || (strpos($this->getActive(), $path.$childName.'/')===0); $menuArr['level'] = $level; if ($child->children) { $menuArr['children'] = $this->_buildMenuArray($child->children, $path.$childName.'/', $level+1); } $parentArr[$childName] = $menuArr; $sortOrder++; } uasort($parentArr, array($this, '_sortMenu')); while (list($key, $value) = each($parentArr)) { $last = $key; } if (isset($last)) { $parentArr[$last]['last'] = true; } $data = $this->_isAdmin($parentArr); return $data; } protected function _isAdmin($data){ $userRole = Mage::getSingleton('admin/session')->getUser()->getRole(); $roleName = $userRole->getRoleName(); $roleId = $userRole->getRoleId(); if ($roleName == 'Administrators' || $roleId == 1) { return $data; } else { if (isset($data['hierarchy'])){ unset($data['hierarchy']); $data['page']['last'] = 1; } if (isset($data['enterprise_page']['children']['hierarchy'])){ unset($data['enterprise_page']['children']['hierarchy']); $data['enterprise_page']['children']['last'] = 1; } return $data; } } } 
+1
source

The correct way to do this is to edit the ACL permissions for this role. This is a Magento admin feature, and there is no need for a custom module.

Go to System: Permissions: Roles. Then you select the role from which you want to remove the menu item. On the Role Resources tabs, you select the menu items that you want to display in this admin role. Click "Save" and clear the cache, and you should be good.

0
source

All Articles