Domanda

Ho bisogno di sostituire il metodo preDispatch di un controller di base. I eredita controllore nucleo da Mage_Checkout_Controller_Action, che a sua volta ha un metodo preDispatch che deve essere chiamato. Dal momento che sto che si estende dal controller di base che voglio di esclusione, non posso chiamare parent::preDispatch(), dal momento che sarebbe tirare in termini di funzionalità che sto cercando di evitare.

La mia domanda è -? Come posso chiamare un metodo di override che è 2 livelli più alto nella catena di ereditarietà, o sto solo andando su questo nel modo sbagliato

Aggiorna

A quanto pare funziona:

Mage_Checkout_Controller_Action::preDispatch(); (anche se questo metodo non è statico, credo che si impara qualcosa di nuovo ogni giorno ..)

Ora la mia domanda è: C'è un modo migliore di fare questo senza dover copiare in tutti funzionalità dalla classe che sto overridding

Il motivo per cui sto cercando questo è perché stavo andando verso il basso questa strada , tentando di forzare Magento per ricordare assegnazioni di indirizzi quando i clienti passano attraverso multishipping cassa e successivamente se ne vanno. (FWIW, ho trovato l'articolo legato alla grande per ottenere mi fa andare avanti nella giusta direzione, ma sembra che ci sia un sacco mancante, per quanto passi che devono essere prese per ottenere questo al lavoro).

Il controller che sto ignorando è il nucleo MultiShippingController che ha una schiena redirect al Multishipping indexAction che deve essere evitato. Su un po 'lato-nota, ho ottenuto questa funzionalità quasi completo, tranne che per alcune questioni (relative alla aggiunta del primo elemento al carrello e il Mage_Sales_Model_Quote_Item-> getQuoteItem () restituendo null nel modello addresses.phtml, anche se che è una discussione del tutto diversa).

È stato utile?

Soluzione

Credo che sarebbe interessante sapere esattamente cosa si sta cercando di realizzare, ma posso darvi alcune indicazioni senza conoscere i dettagli:

Nella maggior parte dei casi, se il metodo si sta cercando di riferimento non usa $this, si può tranquillamente chiamare statico:

Mage_Checkout_Controller_Action::preDispatch()

Ma si dovrebbe probabilmente essere facendo questo attraverso un osservatore di controllo preDispatch. Magento vi offre la possibilità di fare questo in Mage_Core_Controller_Varien_Action:

abstract class Mage_Core_Controller_Varien_Action
{
    // [...]
    public function preDispatch()
    {
        // [...]
        if ($this->_rewrite()) {
            return; // [What is the purpose if this?]
        }
        // [...]

        // [This is where my event needs to be firing, but this code never gets 
        // executed because the controller is rewritten]
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

    }
    // [...]
}

Tutto quello che dovete fare è aggiungere il nome piena azione sulla fine del controller_action_predispatch. Un esempio di shoehorning funzionalità in OnePage Savebilling:

    <events>
        <controller_action_predispatch_checkout_onepage_saveBilling>
            <observers>
                <some_unique_name_for_this_event>
                    <class>yourmodel/observer</class>
                    <method>myPredispatchObserver</method>
                </some_unique_name_for_this_event>
            </observers>
        </controller_action_predispatch_checkout_onepage_saveBilling>
    </events>

Cosa c'è di più, nel metodo di osservatore, è necessario accettare l'osservatore e si può ottenere il controller si da getEvent:

<?php

class MyCompany_MyModule_Model_Observer
{

    public function myPredispatchObserver($observer)
    {
        $controller = $observer->getEvent()->getControllerAction();
    }
}

Altri suggerimenti

Sono sul mio cellulare, ma mi piacerebbe pensare che si potrebbe utilizzare uno dei diversi eventi per rimuovere il reindirizzamento dall'oggetto risposta.

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