Question

I besoin de remplacer la méthode preDispatch d'un contrôleur central. Le contrôleur de noyau hérite de Mage_Checkout_Controller_Action, qui a elle-même une méthode preDispatch qui doit être appelé. Depuis que je suis depuis le contrôleur extension de base que je veux override, je ne peux pas simplement appeler parent::preDispatch(), car cela tirer dans la fonctionnalité que j'essaie d'éviter.

Ma question est - Comment puis-je appeler une méthode redéfinie est de 2 niveaux plus élevés dans la chaîne d'héritage, ou suis-je simplement aller à ce sujet dans le mauvais sens

Mise à jour

Apparemment, cela fonctionne:

Mage_Checkout_Controller_Action::preDispatch(); (même si cette méthode est pas statique, je suppose que vous apprenez quelque chose de nouveau chaque jour ..)

Maintenant, ma question est: Est-il une meilleure façon de le faire sans avoir à copier dans tous fonctionnalité de la classe j'overridding

La raison pour laquelle je tente c'est parce que je descendais ce chemin , essayant de forcer Magento ne pas oublier les affectations d'adresses lorsque les clients passent par la caisse multishipping puis repartent ensuite. (FWIW, j'ai trouvé le lié à l'article grand pour me faire aller dans la bonne direction, mais il semble y avoir beaucoup manquant dans la mesure où des mesures qui doivent être prises pour obtenir ce travail).

Le contrôleur je surcharge est le noyau MultiShippingController qui a un dos de redirection vers le IndexAction Multishipping que les besoins à éviter. Sur un peu côté note, je l'ai obtenu cette fonctionnalité complète la plupart du temps, sauf pour quelques questions (relatives à l'ajout de premier article au panier et le Mage_Sales_Model_Quote_Item-> getQuoteItem () retour nul dans le modèle de addresses.phtml, bien que qui est une discussion tout à fait différente).

Était-ce utile?

La solution

Je pense qu'il serait intéressant de savoir exactement ce que vous essayez d'accomplir, mais je peux vous donner quelques conseils sans connaître les détails:

Dans la plupart des cas, si la méthode que vous essayez de référence ne pas utiliser $this, vous pouvez appeler en toute sécurité statique:

Mage_Checkout_Controller_Action::preDispatch()

Mais vous devriez probablement faire cela par un observateur preDispatch contrôleur. Magento vous offre la possibilité de le faire dans 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)
        );

    }
    // [...]
}

Tout ce que vous avez à faire est d'ajouter le nom d'action complet sur la fin de controller_action_predispatch. Un exemple de shoehorning fonctionnalité dans 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>

De plus, dans votre méthode d'observation, vous devez accepter l'observateur et vous pouvez obtenir le contrôleur lui-même de getEvent:

<?php

class MyCompany_MyModule_Model_Observer
{

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

Autres conseils

Je suis sur mon téléphone, mais je pense que vous pouvez utiliser l'un de plusieurs événements pour supprimer la redirection de l'objet de réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top