我已经为Magento管理界面定义了一个包含多个子项的自定义菜单项。
当具有管理员角色的用户登录到管理界面时,这可以正常工作。管理员可以查看所有子项,还可以访问项链接到的页面。这些页面中的每一个都显示网格中数据库表的内容。
但是当我尝试使用自定义角色时会出现问题。自定义角色可以访问菜单项及其子项。现在,当我使用具有此自定义角色的用户登录管理界面时,用户可以按预期看到所有菜单项,但是对于两个子项,用户在单击子项时会收到拒绝访问的消息。
以下是config.xml中的acl和menu条目。
...
<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出现问题。
我不明白为什么管理员可以访问所有页面,但不同的角色不能访问。 有什么想法可能会出现问题吗?
答案 0 :(得分:12)
好的我解决了这个问题。
它与子菜单项和子菜单项标签名称相关的控制器类有关。
每个控制器都有一个_isAllowed()
方法,用于检查用户查看页面的权限。
E.g。
protected function _isAllowed(){
return Mage::getSingleton('admin/session')->isAllowed('deliveryservice/holidayset');
}
在此方法中,用于调用isAllowed()方法的参数的最后一部分(斜杠后面)必须等于config.xml中acl和菜单项的子菜单项的标记名称。
因此,对于此示例,子菜单标记的名称必须为<holidayset ...
对于我的两个控制器,标签名称和参数不相等。
答案 1 :(得分:4)
有太多因素可以确定 - 最快的解决方法是自己调试。
查看_buildMenuArray' in
app / 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角色。