Допустим, мы добавили некоторые новые ресурсы в ACL следующим образом:
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<search>
<children>
<import translate="title">
<title>Import</title>
</import>
<export translate="title">
<title>Export</title>
</export>
</children>
</search>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Затем мы добавляем следующее вокруг кнопки, которая появляется в сетке SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Если бы я вошел в систему как пользователь без прав администратора, я бы действительно подумал, что ожидаемое поведение не будет отображаться кнопкой, так как я явно не назначил пользователям роль ресурса. Однако оказывается, что возвращаемое значение по умолчанию isAllowed
для true. В дополнение к этому, когда вы идете и просматриваете ресурсы для этой роли, флажок не будет отмечен галочкой.
Я могу решить «проблему», щелкнув по каждой роли и нажав «Сохранить», но это PITA, особенно для среды live / stage / dev. Есть ли простой способ автоматического запрета этого ресурса для каждой роли через код? Я не против добавить скрипт миграции, если это необходимо. Я быстро взглянул на то, что происходит в том же действии. Предположительно, я мог бы сделать это, загрузив все роли, просматривая их и выполняя аналогичную логику для Mage_Admin_Model_Resource_Rules::saveRel
вставки строк в таблицу. Но этот код, по-видимому, предполагает, что все ресурсы опубликованы, что означало бы, что для его непосредственного вызова мне нужно выяснить, в каком формате мне нужно передавать эти данные и, возможно, также загружать существующий ресурс.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())