次のように新しいリソースを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())