Comment éviter l'erreur 404 lors de l'installation d'une nouvelle extension

27

C'est une erreur très courante qui apparaît dans Magento lorsque vous installez une nouvelle extension avec la configuration system.xml :

Lorsque vous accédez à l' System->Configuration->Extensiononglet, une erreur 404 s'affiche. Vous devez vous déconnecter et vous reconnecter, puis ça va. Mais existe-t-il un moyen d'éviter cela?

JohnyFree
la source
Je ne le crois pas, l'arborescence ACL est chargée lorsque vous vous connectez et stockée dans la session des utilisateurs.
Peter O'Callaghan
J'ai une idée mais je ne sais pas si c'est possible. Vous pouvez modifier le comportement de "Magento Connect Manage" pour expirer toutes les sessions d'administration après l'installation de l'extension. Mais ce n'est pas possible de le faire depuis la portée de l'extension (((. Seulement depuis la portée de Connect Manager.
oleksii.svarychevskyi
2
Votre question a répondu à ma question! Merci!
Ian Phillips
J'ai dû laisser un commentaire, car comme Ian l'a dit: "Votre question a répondu à ma question". La journalisation a fait l'affaire!
Hans Wassink

Réponses:

16

Comme l'a dit @Cags, cela n'est pas (facilement) possible car l'arborescence ACL est chargée lorsque la session est initialisée (AKA lorsque l'administrateur se connecte).
Une solution de contournement possible serait de remplacer la _isSectionAllowedméthode dans le contrôleur de configuration système: ( Mage_Adminhtml_System_ConfigController::_isSectionAllowed) et de lui faire recharger l'arborescence ACL.
Quelque chose comme:

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
}

Mais cela signifie que l'arborescence ACL sera rechargée à chaque fois que vous accéderez à une section de configuration. Je ne vois aucun intérêt à faire cela.
Vous ne pouvez pas non plus le faire pour une extension spécifique. Vous devrez réécrire la classe principale.

Marius
la source
Il serait peut-être préférable de réinitialiser l'arborescence ACL uniquement si la section n'est pas autorisée. Honnêtement, je ne me souviens pas avoir essayé de charger une section qui n'était pas autorisée par ACL autrement qu'après une installation de module et avant que l'administrateur ne se reconnecte.
pspahn
Juste une idée folle puisque je ne l'ai jamais essayée et je ne sais pas si la session est disponible à ce stade, mais pourrait-il être possible de recharger à partir du script d'installation? Bien sûr, cela ne fonctionne que si le script d'installation est déclenché par une demande où vous en tant qu'administrateur êtes connecté et cela n'affectera pas les autres utilisateurs backend connectés
Fabian Schmengler
2
@fschmengler. Je ne l'ai pas essayé auparavant, mais je pense que cela pourrait fonctionner. Honnêtement, je ne pense pas que ça vaille la peine.
Marius
9

J'ai trouvé un moyen de contourner cela avec très peu de personnalisation. Ce dont nous avons besoin, c'est:

  1. Une nouvelle action de contrôleur qui recharge l'ACL (sans se déconnecter et se déconnecter), puis redirige vers la page précédente:

    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. Une mise à jour de la mise en page pour la admin_noroutepoignée. Nous ajouterons un lien vers cette nouvelle action de contrôleur directement sur la page d'administration 404:

    <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. Et le modèle avec le lien:

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

Je l'ai jeté ensemble dans une petite extension sur Github: SSE_AclReload (ajoute également le lien au menu Système> Autorisations )

Vous pouvez également essayer de recharger l'ACL automatiquement dès que l'action admin / noroute est envoyée, mais je préfère 1) savoir ce qui se passe et 2) avoir le choix.

Fabian Schmengler
la source
1

Si vous avez un problème lorsque vous installez une nouvelle extension et obtenez la page d' erreur 404, une seule chose que vous devez faire est d'entrer System > Permissions > Roles. Enregistrez simplement le rôle et n'oubliez pas d'effacer var/cacheet var/seesion Et votre problème a été résolu.

Hiral Unadkat
la source
"effacer var / session"? Pour déconnecter tous les clients et vider leurs chariots? Nan.
Fabian Schmengler
nup, juste effacer la session, dans le dossier var
Hiral Unadkat
Malheureusement, c'est la même chose. Sauf si vous n'utilisez pas le gestionnaire de session de fichiers. Dans ce cas, il ne fait rien car il n'y a pas de fichiers
Fabian Schmengler
Ensuite, vous devez aller dans Système> Autorisations> Rôles et enregistrer le rôle.
Hiral Unadkat
Ce qui nous amène à l'autre problème avec votre réponse: même si cela fonctionne, c'est plus d'efforts que de se déconnecter puis de se reconnecter, ce que OP veut éviter.
Fabian Schmengler
0

Essaye ça:

  1. Allez dans Admin -> Système -> Gestion du cache
  2. Sélectionnez tout le type de cache
  3. Gardez l'action comme Actualiser et appuyez sur Soumettre.
shefali singh
la source