So vermeiden Sie 404-Fehler bei der Installation neuer Erweiterungen

27

Es ist ein sehr häufiger Fehler, der in Magento angezeigt wird, wenn Sie eine neue Erweiterung mit der system.xml- Konfiguration installieren :

Wenn Sie zur System->Configuration->ExtensionRegisterkarte wechseln, wird ein 404-Fehler angezeigt. Sie müssen sich abmelden und erneut anmelden, und dann ist es in Ordnung. Aber gibt es eine Möglichkeit, dies zu vermeiden?

JohnyFree
quelle
Ich glaube nicht, der ACL-Baum wird geladen, wenn Sie sich anmelden und in der Benutzersitzung speichern.
Peter O'Callaghan
Ich habe eine Idee, aber ich weiß nicht, ob es möglich ist. Sie können das Verhalten von "Magento Connect Manage" so ändern, dass alle Verwaltungssitzungen nach der Installation der Erweiterung ablaufen. Aber es ist nicht möglich, aus dem Umfang der Erweiterung (((. Nur aus dem Umfang von Connect Manager.
oleksii.svarychevskyi
2
Ihre Frage hat meine Frage beantwortet! Vielen Dank!
Ian Phillips
Ich musste einen Kommentar hinterlassen, denn wie Ian sagte: "Ihre Frage hat meine Frage beantwortet". Die Protokollierung hat den Trick gemacht!
Hans Wassink

Antworten:

16

Wie @Cags sagte, ist dies nicht (leicht) möglich, da der ACL-Baum geladen wird, wenn die Sitzung initialisiert wird (AKA, wenn sich der Administrator anmeldet).
Eine mögliche Problemumgehung besteht darin, die _isSectionAllowedMethode in System Configuration Controller: ( Mage_Adminhtml_System_ConfigController::_isSectionAllowed) zu überschreiben und den ACL-Baum neu zu laden.
So etwas wie:

protected function _isSectionAllowed($section)
{
    $session = Mage::getSingleton('admin/session');
    $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());//reload the tree
    return parent::_isSectionAllowed($secntion); //all the code from the original method
}

Dies bedeutet jedoch, dass der ACL-Baum jedes Mal neu geladen wird, wenn Sie auf einen Konfigurationsabschnitt zugreifen. Ich sehe keinen Grund, dies zu tun.
Sie können dies auch nicht für eine bestimmte Erweiterung tun. Sie müssen die Kernklasse neu schreiben.

Marius
quelle
Vielleicht ist es besser, den ACL-Baum nur zurückzusetzen, wenn der Abschnitt nicht zulässig ist. Ich kann mich ehrlich gesagt nicht erinnern, jemals versucht zu haben, einen Abschnitt zu laden, der von der ACL nicht zugelassen wurde, außer nach der Installation eines Moduls und bevor sich der Administrator erneut anmeldet.
Pspahn
Nur eine verrückte Idee, da ich sie noch nie ausprobiert habe und nicht sicher bin, ob die Sitzung zu diesem Zeitpunkt verfügbar ist. Könnte es jedoch möglich sein, sie über das Installationsskript neu zu laden? Dies funktioniert natürlich nur, wenn das Installationsskript durch eine Anfrage ausgelöst wird, bei der Sie als Administrator angemeldet sind und andere angemeldete Backend-Benutzer nicht betroffen sind
Fabian Schmengler,
2
@fschmengler. Ich habe es noch nicht ausprobiert, aber ich denke, es könnte funktionieren. Ehrlich gesagt glaube ich nicht, dass es die Mühe wert ist.
Marius
9

Ich habe einen Weg gefunden, dies mit sehr wenig Anpassung zu umgehen. Was wir brauchen ist:

  1. Eine neue Controller-Aktion, die die ACL neu lädt (ohne sich abzumelden und wieder einzuloggen) und dann zur vorherigen Seite zurückleitet:

    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();
        }
    }
  2. Ein Layout-Update für das admin_norouteHandle. Wir werden einen Link zu dieser neuen Controller-Aktion direkt auf der Admin 404-Seite hinzufügen:

    <layout version="0.1.0">
        <adminhtml_noroute>
            <reference name="content">
                <block type="adminhtml/template" name="content.aclReload" after="content.noRoute" template="sse_aclreload/button.phtml" />
            </reference>
        </adminhtml_noroute>
    </layout>
  3. Und die Vorlage mit dem Link:

    <a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>">
        <?php echo $this->__('Reload ACL'); ?>
    </a>

Ich habe es in einer kleinen Erweiterung auf Github zusammengefasst: SSE_AclReload (fügt den Link auch zum Menü System> Berechtigungen hinzu )

Sie können auch versuchen, die ACL automatisch neu zu laden, sobald die Aktion admin / noroute ausgeführt wird, aber ich möchte lieber 1) wissen, was los ist, und 2) eine Auswahl treffen.

Fabian Schmengler
quelle
1

Wenn Sie ein Problem haben, wenn Sie eine neue Erweiterung installieren und eine 404-Fehlerseite erhalten , müssen Sie nur auf Folgendes eingehen System > Permissions > Roles. Speichern Sie einfach die Rolle und vergessen Sie nicht zu löschen var/cacheund var/seesion und Ihr Problem wurde behoben.

Hiral Unadkat
quelle
"clear var / session"? Alle Kunden abmelden und ihre Karren leeren? Nee.
Fabian Schmengler
Nein, beenden Sie einfach die Sitzung im var-Ordner
Hiral Unadkat
Das ist leider auch so. Es sei denn, Sie verwenden nicht den Datei-Session-Handler. In diesem Fall tut es nichts, weil es keine Dateien gibt
Fabian Schmengler
Dann müssen Sie in System> Berechtigungen> Rollen gehen und die Rolle speichern.
Hiral Unadkat
Das bringt uns zu dem anderen Problem mit Ihrer Antwort: Auch wenn es funktioniert, ist es mehr Aufwand als sich aus- und wieder einzuloggen, was OP vermeiden möchte.
Fabian Schmengler
0

Versuche dies:

  1. Gehen Sie zu Admin -> System -> Cache Management
  2. Wählen Sie den gesamten Cache-Typ aus
  3. Behalten Sie die Aktion als Aktualisieren bei und klicken Sie auf Senden.
Shefali singh
quelle