Cómo evitar el error 404 en la instalación de una nueva extensión

27

Es un error muy común que se muestra en Magento cuando instala una nueva extensión con la configuración system.xml :

Cuando va a la System->Configuration->Extensionpestaña, se muestra un error 404. Debe cerrar sesión e iniciar sesión nuevamente y luego está bien. Pero, ¿hay alguna forma de evitar esto?

JohnyFree
fuente
No lo creo, el árbol de ACL se carga cuando inicia sesión y se almacena en la sesión de los usuarios.
Peter O'Callaghan
Tengo una idea pero no sé si es posible. Puede cambiar el comportamiento de "Magento Connect Manage" para que caduquen todas las sesiones de administración después de instalar la extensión. Pero no es posible hacerlo desde el alcance de la extensión (((. Solo desde el alcance de Connect Manager.
oleksii.svarychevskyi
2
Su pregunta respondió a mi pregunta! ¡Gracias!
Ian Phillips
Tuve que dejar un comentario, porque como dijo Ian: "Su pregunta respondió mi pregunta". El registro hizo el truco!
Hans Wassink

Respuestas:

16

Como dijo @Cags, esto no es (fácilmente) posible porque el árbol de ACL se carga cuando se inicializa la sesión (también conocido como el administrador inicia sesión).
Una posible solución sería anular el _isSectionAllowedmétodo en el controlador de configuración del sistema: ( Mage_Adminhtml_System_ConfigController::_isSectionAllowed) y hacer que vuelva a cargar el árbol de ACL.
Algo como:

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
}

Pero esto significa que el árbol de ACL se volverá a cargar cada vez que acceda a una sección de configuración. No veo ningún punto en hacer esto.
Además, no puede hacerlo para una extensión específica. Tendrá que reescribir la clase principal.

Marius
fuente
Tal vez sería mejor restablecer solo el árbol de ACL si la sección no está permitida. Sinceramente, no recuerdo haber intentado cargar una sección que no estaba permitida por ACL que no sea después de la instalación de un módulo y antes de que el administrador vuelva a iniciar sesión.
pspahn
Es una idea loca ya que nunca lo intenté y no estoy seguro de si la sesión está disponible en este momento, pero ¿podría ser posible recargar desde el script de instalación? Por supuesto, esto sólo funciona si el script de instalación se desencadena por una petición en la que como administrador está conectado y que no afectará a otros usuarios registrados de back-end
Fabian Schmengler
2
@fschmengler. No lo he probado antes, pero creo que podría funcionar. Bunt, sinceramente, no creo que valga la pena.
Marius
9

Encontré una forma de evitar esto con muy poca personalización. Lo que necesitamos es:

  1. Una nueva acción del controlador que vuelve a cargar la ACL (sin cerrar sesión y volver a iniciarla), y luego redirige a la página anterior:

    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. Una actualización de diseño para el admin_norouteidentificador. Agregaremos un enlace a esta nueva acción del controlador directamente en la página admin 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. Y la plantilla con el enlace:

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

Lo agregué en una pequeña extensión en Github: SSE_AclReload (agrega el enlace también al menú Sistema> Permisos )

También puede intentar volver a cargar la ACL automáticamente tan pronto como se envíe la acción admin / noroute, pero prefiero 1) saber qué está pasando y 2) tener una opción.

Fabian Schmengler
fuente
1

Si tiene algún problema cuando instala una nueva extensión y obtiene la página de error 404 , solo una cosa que debe hacer es entrar System > Permissions > Roles. Simplemente guarde el rol y no olvide borrar var/cachey var/seesion su problema se ha resuelto.

Hiral Unadkat
fuente
"borrar var / sesión"? ¿Para desconectar a todos los clientes y vaciar sus carritos? No
Fabian Schmengler
nup, simplemente borre la sesión, en la carpeta var
Hiral Unadkat
Lamentablemente esto es lo mismo. Excepto si no usa el controlador de sesión de archivo. En ese caso no hace nada porque no hay archivos
Fabian Schmengler
Luego debe ir a Sistema> Permisos> Roles y guardar el rol.
Hiral Unadkat
Lo que nos lleva al otro problema con su respuesta: incluso si funciona, es más esfuerzo que cerrar sesión y volver a iniciarla, lo que OP quiere evitar.
Fabian Schmengler
0

Prueba esto:

  1. Vaya a Admin -> Sistema -> Administración de caché
  2. Seleccione todo el tipo de caché
  3. Mantenga la acción como Actualizar y presione enviar.
Shefali Singh
fuente