5

我为 Magento 管理界面定义了一个自定义菜单项,其中包含几个子项。

当具有管理员角色的用户登录到管理界面时,这可以很好地工作。管理员可以查看所有子项目,还可以访问项目链接到的页面。这些页面中的每一个都以网格形式显示数据库表的内容。

但是当我尝试使用自定义角色时会出现问题。自定义角色可以访问菜单项及其子项。现在,当我使用具有此自定义角色的用户登录管理界面时,用户可以按预期看到所有菜单项,但是对于两个子项,用户在单击子项时会收到拒绝访问消息。

这是 config.xml 中的 acl 和菜单条目。

...
    <adminhtml>
        <acl>
            <resources>
                <admin>
                    <children>                      
                        <deliveryservice translate="title">
                            <title>Deliveryservice</title>
                            <sort_order>300</sort_order>
                            <children>
                                <holiday translate="title" module="deliveryservice">
                                    <title>Holidays</title>
                                    <sort_order>5</sort_order>
                                </holiday>
                                <holidayset translate="title" module="deliveryservice">
                                    <title>Holidaysets</title>
                                    <sort_order>10</sort_order>
                                </holidayset>
                                <openinghour translate="title" module="deliveryservice">
                                    <title>Openinghours</title>
                                    <sort_order>20</sort_order>
                                </openinghour>
                                <delivery_address translate="title" module="deliveryservice">
                                    <title>Delivery Areas</title>
                                    <sort_order>30</sort_order>
                                </delivery_address>
                                <minimum_order_value translate="title" module="deliveryservice">
                                    <title>Minimum order value</title>
                                    <sort_order>40</sort_order>
                                </minimum_order_value>
                                <key_value_store  translate="title" module="deliveryservice">
                                    <title>Key Value Store</title>
                                    <sort_order>50</sort_order>
                                </key_value_store>
                                 <ratings  translate="title" module="deliveryservice">
                                    <title>Bewertungen</title>
                                    <sort_order>60</sort_order>
                                </ratings>
                            </children>
                        </deliveryservice>
                    </children>
                </admin>
            </resources>
        </acl>
        <menu>
            <deliveryservice translate="title">
                <title>Deliveryservice</title>
                <sort_order>300</sort_order>
                <children>
                    <holiday translate="title" module="deliveryservice">
                        <title>Holidays</title>
                        <sort_order>5</sort_order>
                        <action>adminhtml/holiday/</action>
                    </holiday>
                    <holidayset translate="title" module="deliveryservice">
                        <title>Holidaysets</title>
                        <sort_order>10</sort_order>
                        <action>adminhtml/holidayset/</action>
                    </holidayset>
                    <openinghour translate="title" module="deliveryservice">
                        <title>Openinghours</title>
                        <sort_order>20</sort_order>
                        <action>adminhtml/openinghour/</action>
                    </openinghour>
                    <delivery_address translate="title" module="deliveryservice">
                        <title>Delivery Areas</title>
                        <sort_order>30</sort_order>
                        <action>adminhtml/deliveryaddress/</action>
                    </delivery_address>
                    <minimum_order_value translate="title" module="deliveryservice">
                        <title>Minimum Order Values</title>
                        <sort_order>40</sort_order>
                        <action>adminhtml/minimumordervalue/</action>
                    </minimum_order_value>
                    <key_value_store  translate="title" module="deliveryservice">
                        <title>Key Value Store</title>
                        <sort_order>50</sort_order>
                        <action>adminhtml/keyvaluestore/</action>
                    </key_value_store>
                    <ratings  translate="title" module="deliveryservice">
                        <title>Bewertungen</title>
                        <sort_order>60</sort_order>
                        <action>adminhtml/ratings/</action>
                    </ratings>
                </children>
            </deliveryservice>
        </menu>
    </adminhtml>
      ...

菜单项 minimum_order_value 和 key_value_store 出现问题。

我不明白为什么管理员可以访问所有页面但不同的角色不能。有什么想法可能是这里的问题吗?

4

2 回答 2

12

好的,我解决了这个问题。

它与与子菜单项关联的控制器类和子菜单项标签的名称有关。

每个控制器都有一个_isAllowed()方法来检查用户查看页面的权限。

例如

protected function _isAllowed(){
    return Mage::getSingleton('admin/session')->isAllowed('deliveryservice/holidayset');
}

在此方法中,用于调用 isAllowed() 方法的参数的最后一部分(斜线后面)必须等于 config.xml 中 acl 和菜单条目的子菜单项的标记名称。

所以对于这个例子,子菜单标签的名字必须是 <holidayset ...

对于我的两个控制器,标签名称和参数不相等。

于 2012-10-05T11:19:36.153 回答
4

有太多因素可以肯定地说 - 最快的解决方案是自己调试。

看看_buildMenuArray' inapp/code/core/Mage/Adminhtml/Block/Page/Menu.php`。在那里的某个地方你应该看到一个 foreach 循环,它开始像这样

    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;
        }

这是为构建管理导航的块构建菜单信息数组的循环。如果continue触发了这些保护子句中的任何一个,Magento 将跳过呈现特定菜单。我建议检查_checkAcl此特定菜单的方法失败的原因。我的猜测(基于对您帖子的浏览)是您缺少未呈现的子菜单的 ACL 角色。

祝你好运!

于 2012-10-04T20:37:40.613 回答