Domanda

Mentre ho familiarità con la registrazione utilizzando un controller front-end, non riesco a utilizzare questo controller front-end dalla classe del mio router senza la prima codifica rigida un PHP include la classe del controller. che non credo che dovrebbe essere necessario se tutto è configurato correttamente. Vorrei utilizzare questa classe router per vedere se l'URL richiesto è una corrispondenza per la mia estensione e, in caso contrario, chiamare il controller appropriato /azione. La mia installazione corrente è la seguente:

Nel file ENT etc / config.xml di estensione ho registrato sia il mio router che il controllore:

<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>
.

Ecco la mia classe del router:

Nota la dichiarazione require_once qui. Sono convinto che questa linea di codice sia non necessaria se la mia estensione dovesse essere impostata correttamente. Ad esempio, Mage_Cms_Controller_Router non fa nulla di simile.

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;
    }

}
.

Il mio controller frontale:

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__;
    }

}
.

Ovviamente non ho finito con lo sviluppo per questo controller. Tuttavia il punto di questo post non è centrato attorno al contenuto delle azioni di questo controller. Sta semplicemente accedendo a queste azioni dal mio router, senza dover specificare specificamente una dichiarazione richiesta prima.

Il controller front-end stesso, funziona bene. Questi percorsi URL saranno infatti echo fuori i nomi dei metodi come previsto:

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

Inoltre, la mia configurazione attuale funziona. Come mi aspetto, questi percorsi URL si comportano anche come previsto:

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

e infine, /parts-manual/ANYTHING_HERE/ANYTHING_HERE_ALSO/longer_url/ risulta nella pagina 404 di Magento.

Alcune osservazioni:

Il mio router sta estendendo Mage_Core_Controller_Varien_Router_Standard mentre il router MAGE_CMS si estende Mage_Core_Controller_Varien_Router_Abstract. Ho tentato di registrare il mio router nello stesso modo in cui Magento ha:

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract

Aggiunto questo al mio file etc/config.xml e ha commentato la mia registrazione originale del router da 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>
.

Poi aggiunto in questo metodo al mio 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);
}
.

Questo approccio, mentre funziona, non risolve ancora la mia domanda originale in merito a perché devo eseguire una dichiarazione richiesta con codice duro sulla mia classe controller .

È stato utile?

Soluzione

Bene ... Dopo aver preso quasi un'ora per scrivere questa domanda l'ho risolto letteralmente come ho finito di scriverlo.Quindi, nel tentativo di almeno questa ora non è riuscito a sprecare ho deciso di pubblicarlo in modo che possa forse contribuire con qualcosa alla comunità.

Questo proprio qui, era del tutto inutile:

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

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

Queste linee che avevo aggiunto, mentre prendono ispirazione da Inchoo's Post from 2012 .

La configurazione finale è la seguente:

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;
    }

}
.

Controller:

(Nessuna modifica necessaria)

Così tante ore spese in modo da poter eliminare che una riga di codice (la dichiarazione richiesta) ...

Forse .. Solo forse, questo post salverà qualcun altro ore di frustrazione un giorno :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top