Magento Admin :: Удалить пункт меню для определенных ролей / пользователей

#php #magento

#php #magento

Вопрос:

Я хочу удалить пункт меню из adminmenu для определенной роли пользователя. Я видел, как другие делали это, создавая фиктивное переопределение, но они не основаны на ролях. Я хочу сделать это без использования одного из XML-файлов. Есть ли способ сделать это, например; __construct() или prepareLayout ?

Редактировать: Я должен добавить к этому, что часть, которую я хочу отключить, — это элемент управления иерархией в CMS. Я знаю, что могу просто отключить иерархию для роли пользователя, но мне это нужно для сохранения страниц CMS.

Комментарии:

1. Хорошо, мне удалось исправить это самостоятельно. Я расширил Mage_Adminhtml_Block_Page_Menu в моем локальном Xxxxx_Xxxx_Block_Adminhtml_Page_Menu

2. 1 за совместное использование решения 🙂

3. Пожалуйста, отправьте свое решение в качестве ответа как можно скорее.

4. Я смог сделать это только через 8 часов после отправки. Итак, я сделал это только сейчас. Завтра я могу пометить его как решаемый.

Ответ №1:

Я расширяю Mage_Adminhtml_Block_Page_Menu своим собственным блоком. Я скопировал функцию «_buildMenuArray ()» И непосредственно перед тем, как вернуть массив меню, я проверяю, не является ли текущий пользователь loggen в user администратором. Если это так; Я удаляю элемент иерархии из меню и устанавливаю для элемента Страницы значение last, чтобы выпадающая тень отображалась правильно.

 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 amp;amp; !$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;
        }
    }
}
  

Ответ №2:

Правильный способ сделать это — отредактировать разрешения ACL для роли. Это функция администратора Magento, и нет необходимости в пользовательском модуле.

Вы заходите в систему: Разрешения: Роли. Затем вы выбираете роль, из которой хотите удалить пункт меню. На вкладках Ресурсы роли вы выбираете пункты меню, которые хотите отобразить в администраторе этой роли. Нажмите сохранить и очистите кеш, и все должно быть хорошо.

Комментарии:

1. Как я уже сказал в описании. Роль «иерархия» должна быть активирована для сохранения страниц CMS. Если я отключу его, страницы CMS будут сохранены без информации об иерархии. И когда вы активируете роль (иерархию) в меню ролей. Пункт меню для этой роли (иерархии) автоматически добавляется в строку меню.