具有自定义角色的用户无法访问Magento管理界面中的自定义菜单项

具有自定义角色的用户无法访问Magento管理界面中的自定义菜单项,magento,menu,admin,acl,Magento,Menu,Admin,Acl,我已经为Magento管理界面定义了一个自定义菜单项,其中包含多个子项 当具有管理员角色的用户登录到管理员界面时,这一点与预期的效果相当好。管理员可以看到所有的子项目,也可以访问项目链接到的页面。每个页面都显示网格中数据库表的内容 但是,当我尝试使用自定义角色时,就会出现问题。自定义角色可以访问菜单项及其子项。现在,当我与一个具有此自定义角色的用户登录到管理界面时,该用户会按预期看到所有菜单项,但对于两个子项,当用户单击该子项时,会收到一条拒绝访问的消息 下面是config.xml中的acl和菜

我已经为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>
      ...
。。。
送货服务
300
假期
5.
度假酒店
10
开放时间
20
交货区
30
最小订单值
40
键值存储
50
贝维尔通根
60
送货服务
300
假期
5.
行政主任/假期/
度假酒店
10
adminhtml/holidayset/
开放时间
20
adminhtml/openinghour/
交货区
30
adminhtml/deliveryaddress/
最小顺序值
40
adminhtml/minimumordervalue/
键值存储
50
adminhtml/keyvaluestore/
贝维尔通根
60
管理员/评级/
...
菜单项“最小顺序值”和“键值存储”出现问题

我不明白为什么一个管理员可以访问所有页面,但不同的角色不能。
你知道这里有什么问题吗

有太多的因素在起作用,无法确定-最快的解决办法是自己调试

看看app/code/core/Mage/Adminhtml/Block/Page/Menu.php`中的
\u buildMenuArray'。在那里的某个地方,你应该看到一个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
guard子句,Magento将跳过呈现特定菜单。我建议检查
\u checkAcl
方法在这个特定菜单中失败的原因。我的猜测是(基于你文章的略读)你缺少了子菜单的ACL角色,而这些子菜单没有呈现


祝你好运

好的,我解决了这个问题

它与与子菜单项关联的控制器类以及子菜单项标记的名称有关

每个控制器都有一个
\u isAllowed()
方法,用于检查用户查看页面的权限

例如

在此方法中,用于调用isAllowed()方法的参数的最后一部分(斜杠后面)必须等于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>
      ...

因此,对于本例,子菜单标记的名称必须是
,感谢您的响应,但问题不是菜单itmes没有呈现。将呈现该自定义用户应可见的所有菜单项。7个子菜单项中有5项按预期工作,当用户单击它们时,将呈现相关页面。但对于其中两个,并没有呈现相关页面,而是显示一条“拒绝访问”消息。尽管我调试了你告诉我的方法,但我可以说我的菜单项没有一个被跳过。好吧,我又发现了一个问题,这个问题与我上面发布的xml中错误的acl或菜单项无关。我将动作元素从一个不工作的子菜单项替换为一个工作的子菜单项。然后,拒绝访问消息消失,页面被呈现。因此,它一定与页面的呈现有关。必须有一个位置,Magento在呈现页面之前检查acl。你知道这是在哪里发生的吗?谢谢,弗洛,今天也是我的生日