Pregunta

Aunque estoy familiarizado con el registro de uso de un extremo frontal del controlador, me parece no puede utilizar este extremo frontal del controlador de mi router primera clase sin codificar un include de PHP de la clase de controlador. Que creo que no debería ser necesario si todo está configurado correctamente. Me gustaría utilizar este router para ver si la URL solicitada es un partido para mi extensión, y si es así llamar la correspondiente controlador/acción.Mi configuración Actual es la siguiente:

En mi extensión etc/config.xml archivo tengo registrado en mi router y el controlador:

<frontend>
    <routers>
        <doall_manual>
            <use>standard</use>
            <args>
                <module>DoALL_Manual</module>
                <frontName>doall_manual</frontName>
            </args>
        </doall_manual>
    </routers>
</frontend>
<default>
    <web>
        <routers>
            <doall_manual>
                <area>frontend</area>
                <class>DoALL_Manual_Controller_Router</class>
            </doall_manual>
        </routers>
    </web>
</default>

Aquí está mi router:

El aviso require_once declaración de aquí.Estoy convencido de que esta línea de código no es necesario si mi extensión iban a ser el programa de instalación correctamente.Por ejemplo, Mage_Cms_Controller_Router no hace tal cosa.

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Standard
{

    public function match(Zend_Controller_Request_Http $request)
    {
        // checking before even try to find out that current module
        // should use this router
        if (!$this->_beforeModuleMatch()) {
            return false;
        }

        $path = explode('/', trim($request->getPathInfo(), '/'));

        if ($path[0] != 'parts-manual') {
            return false;
        }

        $request
            ->setModuleName('doall_manual')
            ->setControllerName('manual');

        switch (count($path)) {
            case 1:
                $request->setActionName('index');
                break;

            case 2:
                $request->setActionName('manual');
                break;

            case 3:
                $request->setActionName('page');
                break;

            default:
                $request->setActionName('noroute');
                break;
        }

        // TODO: This line shouldn't be needed, but I'm unsure as to why it is not detecting the controller's location on it's own.
        require_once 'DoALL'.DS.'Manual'.DS.'controllers'.DS.'ManualController.php';

        $controllerInstance = Mage::getControllerInstance('DoALL_Manual_ManualController', $request, $this->getFront()->getResponse());

        // dispatch action
        $request->setDispatched(true);
        $controllerInstance->dispatch($request->getActionName());

        return true;
    }

}

Mi Extremo Frontal Del Controlador:

class DoALL_Manual_ManualController extends Mage_Core_Controller_Front_Action
{
    /**
     * Display all manuals
     */
    public function indexAction()
    {
        echo __METHOD__;
    }

    /**
     * Display a manual's index
     */
    public function manualAction()
    {
        echo __METHOD__;
    }

    /**
     * Display the parts from a manual's page.
     */
    public function pageAction()
    {
        echo __METHOD__;
    }

}

Obviamente, yo no soy terminado con el desarrollo de este controlador.Sin embargo, el punto de este post no centrada en el contenido de este controlador de las acciones.Es simplemente que el acceso a estas acciones de mi router, sin tener que hacer específicamente a requieren de una declaración de la primera.

El extremo frontal del controlador en sí, funciona muy bien.Estas URL rutas de hecho eco el nombre del método como se esperaba:

/doall_manual/manual/
/doall_manual/manual/manual/
/doall_manual/manual/page/

Además, mi configuración actual es de trabajo.Como esperaba, estas URL rutas de funcionar como se espera también:

/parts-manual/
/parts-manual/ANYTHING_HERE/
/parts-manual/ANYTHING_HERE/ANYTHING_HERE_ALSO/

Y, por último, /parts-manual/ANYTHING_HERE/ANYTHING_HERE_ALSO/longer_url/ resultados en Magento página de error 404.

Algunas observaciones:

Mi router está extendiendo Mage_Core_Controller_Varien_Router_Standard mientras que el Mage_Cms router está extendiendo Mage_Core_Controller_Varien_Router_Abstract.He intentado registrar mi router en la misma forma en que Magento tiene:

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract

Añadido esto a mi etc/config.xml archivo, y comentó mi registro original del router de default/web/routers:

<global>
    <events>
        <controller_front_init_routers>
            <observers>
                <doall_manual>
                    <class>DoALL_Manual_Controller_Router</class>
                    <method>initControllerRouters</method>
                </doall_manual>
            </observers>
        </controller_front_init_routers>
    </events>
<global>

Luego agregó en este método para mi router:

/**
 * Initialize Controller Router
 *
 * @param Varien_Event_Observer $observer
 */
public function initControllerRouters($observer)
{
    /* @var $front Mage_Core_Controller_Varien_Front */
    $front = $observer->getEvent()->getFront();

    $front->addRouter('doall_manual', $this);
}

Este enfoque, aunque funciona, todavía no se resuelve mi pregunta original como para ¿por qué tengo que realizar un duro codificadas requieren declaración en mi clase de controlador.

¿Fue útil?

Solución

Bien...después de tomar casi una hora para escribir esta pregunta me ha resuelto que, literalmente, justo cuando terminé de escribirla.Así, en un esfuerzo para al menos tener esta hora no llegó a los desechos que me decidí a publicarlo así que quizá pueda aportar algo a la comunidad.

Este derecho aquí, era totalmente innecesario:

$controllerInstance = Mage::getControllerInstance('DoALL_Manual_ManualController', $request, $this->getFront()->getResponse());

$request->setDispatched(true);
$controllerInstance->dispatch($request->getActionName());

Estas líneas me había agregado, mientras que tomando la inspiración de Inchoo el Post de de 2012.

Final de la configuración es la siguiente:

etc/config.xml

<frontend>
    <routers>
        <doall_manual>
            <use>standard</use>
            <args>
                <module>DoALL_Manual</module>
                <frontName>doall_manual</frontName>
            </args>
        </doall_manual>
    </routers>
</frontend>
<default>
    <web>
        <routers>
            <doall_manual>
                <area>frontend</area>
                <class>DoALL_Manual_Controller_Router</class>
            </doall_manual>
        </routers>
    </web>
</default>

Router:

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Standard
{

    public function match(Zend_Controller_Request_Http $request)
    {
        // checking before even try to find out that current module
        // should use this router
        if (!$this->_beforeModuleMatch()) {
            return false;
        }

        $path = explode('/', trim($request->getPathInfo(), '/'));

        if ($path[0] != 'parts-manual') {
            return false;
        }

        $request
            ->setModuleName('doall_manual')
            ->setControllerName('manual');

        switch (count($path)) {
            case 1:
                $request->setActionName('index');
                break;

            case 2:
                $request->setActionName('manual');
                break;

            case 3:
                $request->setActionName('page');
                break;

            default:
                $request->setActionName('noroute');
                break;
        }

        return true;
    }

}

Controlador:

(sin cambios)

Tantas horas pasó para que yo pudiera eliminar una línea de código (la declaración)...

Tal vez..sólo tal vez, este post va a salvar a alguien más horas de frustración algún día :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top