Substitution de la méthode preDispatch d'un contrôleur central
-
16-10-2019 - |
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).
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.