Magento Admin :: Удалить пункт меню для определенных ролей / пользователей - PullRequest
7 голосов
/ 10 октября 2011

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

РЕДАКТИРОВАТЬ: я должен добавить к этому, что часть, которую я хочу отключить, является элементом управления иерархией в CMS.Я знаю, что могу просто отключить иерархию для роли пользователя, но она мне нужна для сохранения страниц CMS.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

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

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;
        }
    }
}
0 голосов
/ 12 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...