假设我们像这样向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,尤其是在现场/舞台/开发环境中。有没有简单的方法可以通过代码自动拒绝每个角色的资源?如果需要,我不介意添加迁移脚本。我快速查看了同一动作会发生什么。大概可以做到这一点,方法是加载所有角色,循环遍历所有角色,并执行类似的逻辑以Mage_Admin_Model_Resource_Rules::saveRel
将行插入表中。但是这段代码似乎假定所有资源都已发布,这意味着要直接调用它,我需要确定需要哪种格式将数据传递给它并可能加载现有资源。
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())