2017-09-21 5 views

答えて

0

スポイラー:それはほぼクリーンとしてShopwareのフックとしてですので、コントローラ

全体のコントローラを交換し、それが機能だ拡張するよりもきれいな方法はありませんを交換してください。

ガイド

あなたのプラグインに新規加入者を追加

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(); 

    } 
} 

マイナス面

は、残念ながらいくつかのコントローラは影響ロジックプライベートメソッドを持っています。口座管理者のように。したがって、コントローラを単純に拡張することは必ずしも可能ではありません。

最後に、新しいルートを持つ新しいコントローラを追加しようとします。 簡単で清潔です。

0

コントローラー全体を交換するよりもクリーンな方法があります。 アップデートの互換性がないため、コントローラ全体を交換することも推奨されません。 最悪の場合、そのようなものがウェブサイト全体を殺す可能性があります。 少し前に、私はshopware forum(ドイツ語)にスレッドを作成し、まったく同じ問題を議論しました。 をチェックアウトコントローラの既存のfinishAction()に拡張したかったのです。

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 
} 

あなたと全く同じ問題ではありませんが、手順は全く同じです。

まず第一に、あなたが(私の場合PostDispatchCheckoutコントローラに)コントローラに加入し、その後、あなたはそれがちょうどあなたが使用するを持っている具体的な行動を変化させることを、

を確認するためにあなたのbootstrap.phpの中のコントローラを編集あなたのコードが(私の場合はfinishAction()の)希望のアクションでトリガされるように、if-constructionを実行します。

こちらがお役に立てば幸いです。しかし、私が不思議に思うのは、の新しいアクションを既存のコントローラーに追加する必要がある理由です。完全な新しいカスタムコントローラを作成するよりも実行可能な状況はまったくないと思います。

敬具、

マックス

+0

を、私は別のルート上に第2の登録ページを実装しなければならなかった私の具体的な使用例では: あなたは以下と既存のコントローラのアクションを所有して定義することができます。アカウントコントローラからの同じログイン機能を使用します。 **問題**: Shopwareのアカウントコントローラは、いくつかのケースで内部的にRegisterコントローラにすべてのリクエストを転送します(ログインの認証情報が間違っているなど)。 コントローラの機能を拡張するためのポスト/ディスパッチの方法はわかっていますが、私の場合は不可能でした。 – Scribdarock

0

あなたは、 "アカウント" コントローラーを交換してはいけません。

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

、その後

public function onAccountMyBonus(\Enlight_Event_EventArgs $args) 
    { 
     $args->setProcessed(true); 
     ..... 
     your code here 
} 
関連する問題