次のように新しいリソースを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')."')"
    ));
}その後、管理者以外のユーザーとしてログインした場合、ユーザーの役割にリソースを明示的に指定していないため、期待される動作はボタンが表示されないことになると思いました。結局のところ、のデフォルトの戻り値はisAllowedtrueのように見えます。問題を複雑にするために、そのロールのリソースに移動して表示すると、チェックボックスはチェックされていません。
各ロールをクリックして[保存]をクリックすることで「問題」を解決できますが、これは特にライブ/ステージ/開発環境全体で行うPITAです。コードを介して各リソースからこのリソースを自動的に拒否する簡単な方法はありますか?必要に応じて、移行スクリプトを追加してもかまいません。同じアクションで何が起こるかをざっと見ました。おそらく、すべてのロールをロードし、それらをループMage_Admin_Model_Resource_Rules::saveRelし、テーブルに行を挿入するための同様のロジックを実行することで、これを行うことができたでしょう。しかし、このコードはすべてのリソースがポストされていることを前提としているようです。つまり、直接呼び出すには、データを渡すために必要な形式を調べ、場合によっては既存のリソースもロードする必要があります。
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())