13

チェックアウトのどこかでそのキーがfalseに設定されている場合、セッションでキーを設定するコードがチェックアウトにあり、請求ページに送り返す必要があります。私はそのコードを持っていますが、サードパーティのサービスを呼び出し、セッションでこのキーが欠落しているために間違って戻ってくるため、通常はオブザーバーの後に実行されるコードを使用することもできません

これが私のコードです。必要なものはすべて揃っていますが、応答がすぐに発生する必要があります。ディスパッチされたイベント行が起動された後は、応答のみがブラウザーに返されます。

public function checkForOrdKey(Varien_Event_Observer $observer)
    {
        $controllerAction = $observer->getControllerAction();
        $request = $controllerAction->getRequest();
        $controllerName = $request->getControllerName();
        $stepData = $this->_getCheckoutSession()->getStepData();
        $ordKeyRemoved = $this->_getCheckoutSession()->getOrdKeyRemoved();
        // if it is the checkout onepage controller or inventory controller don't do anything
        if (isset($controllerName) && $controllerName === "onepage" && $stepData['shipping']['complete'] && $ordKeyRemoved) {
            $this->_getCheckoutSession()->setStepData('shipping', 'complete', false);
            $result['goto_section'] = 'billing';
            Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
            $this->_getCheckoutSession()->setOrdKeyRemoved(false);

        }
    }
4

1 に答える 1

27

基本的に、Responseオブジェクトの作成と送信を制御する必要があります。コントローラの通常のフローは、すべてのメソッドのインラインロジックを処理し、そのイベントを発生させ、途中で応答への追加を収集します。その後、Magentoフレームワークが応答を完成させて送信します。

controller_action_predispatch_checkout_onepage_savebillingpreDispatchイベント( )にアタッチしてからこれを実行することにより、オブザーバー内のフローを短絡できます。

$request = Mage::app()->getRequest();
$action = $request->getActionName();
Mage::app()->getFrontController()->getAction()->setFlag($action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);

上記の行Mage_Core_Controller_Varien_Actionは、呼び出されたアクションをバイパスするように(すべてのコントローラーの祖父母)に指示します(これがどのように機能するかを確認するには、CE 1.4.2の行414を確認してください)。次に、独自の応答を作成してブラウザに送り返します。チェックアウトJSクラスがエラーメッセージをレンダリングするために必要な正しいJSON形式を調査する必要がありますが、これらの線に沿った何か...

$response = Mage::app()->getResponse();
$response->setHttpResponseCode(500);  //adjust to be whatever code is relevant
$json = Mage::helper('core')->jsonEncode($this->__('Your message here'));  //adjust
$response->setBody($json);
//don't need to sendResponse() as the framework will do this later

そうすれば、Zend / Magentoフレームワーク内で作業しているので、CheckoutControllerをオーバーライドしたり(絶対にしないでください...)、" exit/die()"ハックネスを使用したりする必要はありません。exit / dieが悪い理由は、そのイベントに関心を登録した後のオブザーバーが行動できなくなるためです。あなたが攻撃を受ける前に別の開発者が終了したために呼び出されないオブザーバーを登録することは、開発者として非常に苛立たしいことです!!

no-dispatchフラグの設定は、ディスパッチ前のイベントに夢中になっている場合にのみ機能することに注意してください。

詳細については、Magentoのシーケンス図を確認して、フローのレイアウト/ブロック/テンプレートセクションをバイパスする方法を確認してください。

于 2011-03-13T22:19:26.497 に答える