2012-10-04 26 views
4

我爲Magento管理界面定義了包含多個子項目的自定義菜單項。具有自定義角色的用戶無法訪問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發生問題。

我不明白爲什麼管理員可以訪問所有頁面,但不同的角色不能。 任何想法可能是什麼問題在這裏?

回答

12

好的我解決了這個問題。

它與與子菜單項和子菜單項標籤名稱相關的控制器類有關。

每個控制器都有一個_isAllowed()方法來檢查用戶的查看頁面的權限。

E.g.

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

在此方法的參數的最後部分(斜線後)用於調用isAllowed()方法等於在訪問控制列表和菜單項子菜單項的標籤名稱config.xml中。

因此,對於這個例子子菜單標籤的名稱必須<holidayset ...

對於我的兩個控制器中的變量名和參數是不相等的。

+0

感謝Flo同一天:D – MagentoDiary

4

有太多因素可以肯定地說 - 最快的解決方案將是自己調試它。

查看_buildMenuArray' in app/code/core/Mage/Adminhtml/Block/Page/Menu.php`。某處在那裏,你應該看到,開始時是這樣的

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

這是建立的菜單信息的陣列爲構建管理員導航塊迴路中的foreach循環。如果這些continue守衛子句中的任何一個被觸發,Magento將跳過渲染特定菜單。我建議檢查爲什麼_checkAcl方法對這個特定的菜單不合格。我的猜測(基於你的文章的略讀)是你錯過了沒有呈現的子菜單的ACL角色。

祝你好運!

+0

感謝您的回覆,但問題不在於菜單itmes無法呈現。所有應該對該自定義可見的菜單條目都被渲染。7個子菜單項中的5個按預期工作,當用戶點擊它們時,相關頁面被渲染。但是對於其中的兩個,相關頁面未呈現,而是顯示「訪問被拒絕」消息。從來沒有我調試你告訴我的方法越少,我可以說我的菜單項沒有被跳過。 – Flo

+0

好吧我發現了一個更多的想法,這個問題是不相關的一個錯誤的acl或菜單項我在上面張貼的XML。我用其中一個工作子元素替換了其中一個不工作子菜單項的操作元素。然後拒絕訪問消息消失,頁面呈現。所以它必須與頁面的渲染有關。在渲染頁面之前,必須有一個地方讓Magento檢查acl。任何想法發生這種情況? – Flo

相關問題