Supponiamo di aggiungere alcune nuove risorse all'ACL in questo modo:
<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>
Aggiungiamo quindi quanto segue attorno a un pulsante che appare nella griglia di SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Se quindi eseguissi l'accesso come utente non amministratore, avrei davvero pensato che il comportamento previsto non sarebbe stato visibile alcun pulsante, dal momento che non ho esplicitamente assegnato agli utenti il ruolo della risorsa. A quanto pare però, il valore di ritorno predefinito di isAllowed
sembra essere vero. Per complicare le cose, quando vai a visualizzare le risorse per quel ruolo, la casella di controllo non appare spuntata.
Posso risolvere il "problema" facendo clic su ciascun ruolo e facendo clic su Salva, ma questa è una PITA da fare soprattutto in ambienti live / stage / dev. Esiste un modo semplice per negare automaticamente questa risorsa da ciascun ruolo tramite codice? Non mi dispiace aggiungere uno script di migrazione, se necessario. Ho dato una rapida occhiata a ciò che accade nella stessa azione. Presumibilmente, potrei farlo caricando tutti i ruoli, eseguendone il ciclo ed eseguendo una logica simile Mage_Admin_Model_Resource_Rules::saveRel
all'inserimento delle righe nella tabella. Ma questo codice sembra supporre che tutte le risorse siano pubblicate, il che significherebbe che per invocarlo direttamente avrei bisogno di capire in quale formato devo passare i dati e possibilmente caricare anche le risorse esistenti.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())