Digamos que adicionemos alguns novos recursos à ACL da seguinte maneira:
<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>
Em seguida, adicionamos o seguinte em torno de um botão que aparece na grade do SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Se eu fizer logon como um usuário não administrador, realmente pensaria que o comportamento esperado não seria um botão visível, pois não dei explicitamente aos usuários a função de recurso. Porém, o valor de retorno padrão de isAllowed
parece ser verdadeiro. Para complicar, quando você visualizar os recursos para essa função, a caixa de seleção não aparecerá marcada.
Posso resolver o 'problema' clicando em cada função e clicando em Salvar, mas este é um PITA a ser feito especialmente em ambientes ao vivo / estágio / dev. Existe alguma maneira fácil de negar automaticamente esse recurso de cada função via código? Não me importo de adicionar um script de migração, se necessário. Eu dei uma olhada rápida no que acontece na mesma ação. Presumivelmente, eu poderia fazer isso carregando todas as funções, percorrendo-as e executando uma lógica semelhante à Mage_Admin_Model_Resource_Rules::saveRel
inserção das linhas na tabela. Mas esse código parece assumir que todos os recursos são postados, o que significaria que, para invocá-lo diretamente, eu precisaria descobrir em qual formato eu preciso passar os dados e possivelmente carregar também os recursos existentes.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())