2017-09-21 5 views

Répondre

0

Spoiler: Remplacez le contrôleur

Il n'y a pas moyen plus propre que de remplacer le contrôleur entier et étendre ses fonctionnalités, il est donc presque aussi propre que les crochets de ShopWare.

Guide

Ajouter un nouvel abonné à votre plug-in

class AccountSubscriber implements SubscriberInterface 
{ 
    /** 
    * @return array 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
      'Enlight_Controller_Dispatcher_ControllerPath_Frontend_Account' => 'getAccountController' 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getAccountController() 
    { 
     return $this->getPath() . '/Controllers/Frontend/AccountExtended.php'; 
    } 

    /** 
    * @return string 
    */ 
    public function getPath() 
    { 
     $plugin = Shopware()->Container()->get('kernel')->getPlugins()['AcmeYourPlugin']; 

     return $plugin->getPath(); 

    } 
} 

Downsides

Malheureusement, certains contrôleur ont des méthodes privées qui ont un impact la logique. Comme le contrôleur de compte. Il n'est donc pas toujours possible d'étendre simplement le contrôleur. En fin de compte, essayez d'ajouter un nouveau contrôleur avec un nouvel itinéraire. C'est plus facile et plus propre.

0

Il existe un moyen plus propre que de remplacer l'ensemble du contrôleur. Il est également déconseillé de remplacer un contrôleur complet en raison de l'absence de compatibilité avec les mises à jour. Dans le pire des cas, quelque chose comme ça pourrait tuer l'ensemble du site. Il ya quelque temps, j'ai créé un fil dans le shopware forum(allemand) discuter du même problème. Je voulais étendre un finishAction() existant dans le contrôleur de caisse.

public function onPostDispatchCheckout(\Enlight_Controller_ActionEventArgs $args) 
{ 
/** @var \Enlight_Controller_Action $controller */ 
$controller = $args->getSubject(); 

/** @var \Enlight_Controller_Request_Request $request */ 
$request = $controller->Request(); 

if ($request->getActionName() !== 'finish') { 
    return; 
} 

// do your stuff here 
} 

Donc, même si ce n'est pas exactement le même problème que vous avez, la procédure est tout à fait la même chose.

Tout d'abord vous êtes abonné au contrôleur (dans mon cas, le contrôleur PostDispatchCheckout) après que vous modifiez le contrôleur dans votre Bootstrap.php

Pour vous assurer, qu'il modifie simplement une action spécifique que vous avez à utiliser la if-construction donc votre code se déclenche juste sur l'action désirée [dans mon cas le finishAction()].

J'espère que cela aide. Ce qui me demande cependant est pourquoi vous devez ajouter une action nouvelle à un contrôleur déjà existant. Je ne peux penser à aucune situation où quelque chose comme ça est plus pratique que de créer un nouveau contrôleur personnalisé complet.

Cordialement,

Max

+0

Dans mon cas d'utilisation concrète que je devais mettre en œuvre une deuxième page d'inscription sur un itinéraire différent. Avec la même fonctionnalité de connexion du contrôleur de compte. ** Le problème **: Le contrôleur de compte Shopware transmet en interne toutes les demandes à un contrôleur de registre dans certains cas (par exemple, des informations d'identification erronées). Je suis au courant de la façon de poster/pré-expédier pour étendre la fonctionnalité des contrôleurs, mais dans mon cas, ce n'était pas possible. – Scribdarock

0

Vous ne devriez pas remplacer le contrôleur "compte". Vous pouvez définir votre propre action pour le contrôleur existant suivant:

public static function getSubscribedEvents() 
    { 
     return [ 
      'Enlight_Controller_Action_Frontend_Account_MyBonus'  => 'onAccountMyBonus',   
     ]; 
    } 

puis

public function onAccountMyBonus(\Enlight_Event_EventArgs $args) 
    { 
     $args->setProcessed(true); 
     ..... 
     your code here 
}