In fast jeden Installationsanweisungen für Magento Extensions findet man den Schritt “Ausloggen und wieder einloggen”, der notwendig ist um Zugriff auf neue Bereiche im Admin Menü oder der Systemkonfiguration zu erhalten. Aber warum müssen wir das hinnehmen? Das Problem ist, dass die Access Control List (ACL) nur bei Login geladen wird und dann in der Session gecached bleibt. Sie bei jedem Zugriff zu laden ist keine brauchbare Alternative, das würde das Backend zu sehr verlangsamen.
Aber mit nur wenigen Zeilen Code können wir das Neuladen der ACL ein wenig komfortabler gestalten:
Der Code
Diese Controller Action lädt die ACL auf Anfrage neu:
class SSE_AclReload_Adminhtml_Permissions_AclReloadController extends Mage_Adminhtml_Controller_Action { public function indexAction() { $session = Mage::getSingleton('admin/session'); $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl()); Mage::getSingleton('adminhtml/session')->addSuccess( $this->__('ACL reloaded')); $this->_redirectReferer(); } }
Dieses Template stellt einen Button zur Verfügung, der zu dem neuen Controller linkt:
<?php $request = Mage::app()->getRequest(); ?> <a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>"> <?php echo $this->__('Reload ACL'); ?> </a>
Und dieses Layout Update fügt den Button zu “404” Fehlerseiten im Backend hinzu (die, die man sieht, wenn man keinen Zugriff auf eine Seite hat):
<adminhtml_noroute> <reference name="content"> <block type="adminhtml/template" name="content.aclReload" after="content.noRoute" template="sse_aclreload/button.phtml" /> </reference> </adminhtml_noroute>
Das Ergebnis
Ich habe es als Extension auf GitHub zusammengestellt:
https://github.com/schmengler/AclReload
Sie fügt außerdem einen Menüpunkt unterhalb des “System” > “Berechtigungen” Untermenüs hinzu:
Installation
Die empfohlene Installation-Methode ist via Composer, fügt dazu folgendes zu eurer composer.json
hinzu:
"repositories": [ { "type": "git", "url": "https://github.com/schmengler/AclReload.git" } } "require": { "sse/aclreload": ">=0.1.1" }
Aber man kann auch nur das Repository herunterladen und alles aus src/app
ins app
Verzeichnis seiner Magento Installation kopieren.
Danke
Danke an Marius Strajeru für die Idee in seiner Antwort auf diese StackExchange Frage.
James Anelay hat die Technik mit diesem Snippet für eigene Extensions noch etwas weitergetrieben: Ladet die ACL in einem Observer vor dem Dispatching der Systemkonfiguration neu, falls die aktuelle Sektion nicht erlaubt ist (also man normalerweise die 404 Seite sehen würde). Das selbe kann in einer preDispatch
Methode in eigenen Admin Controllers angewendet werden.