5

オブザーバーを使用して、カートコントローラーへの追加アクションの応答を変更しようとしていますが、AJAXリクエストのコンテキストでのみです。

オブザーバー呼び出され、JSがデータを正常に取得しています。これを確認するdie()には、オブザーバー関数cartAdd()を挿入し、Magentoからの応答の結果を確認するために使用している応答開発者コンソールを確認します。したがって、ここではJSは問題ではありません。

私の主な問題は、通常の機能では応答を変更できないように見えることです。を使用してリクエストを取得し、、、、またはその他の応答を変更する関数を使用し$observer->getEvent()->getControllerAction()->getResponse()て変更を加えますが、応答にまったく影響はありません。setHeader()setBody()

オブザーバーの応答を変更できない理由について誰かが手がかりを持っていますか?

/app/code/local/mynamespace/mymodule/etc/config.xml:

<frontend>
....
    <events>
        <controller_action_predispatch_checkout_cart_add>
            <observers>
                <mymodule_cart_add>
                    <type>singleton</type>
                    <class>mymodule/observer</class>
                    <method>cartAdd</method>
                </mymodule_cart_add>
            </observers>
        </controller_action_predispatch_checkout_cart_add>
    </events>
</frontend>

/app/code/local/mynamespace/mymodule/Model/Observer.php:

public function cartAdd(Varien_Event_Observer $observer)
{
    $controllerAction = $observer->getEvent()->getControllerAction();
    if($controllerAction->getRequest()->isAjax()) {
        $response = $controllerAction->getResponse();
        // I've even tried using:
        // $response = Mage::app()->getResponse();
        $response->setHeader('HTTP/1.1','403 Forbidden'); //using this because i will need it in my final code and it will make it immediatly obvious the response has been changed
        $response->setHeader('Content-type', 'application/json');
        $response->setBody('hello world!!!!');
        // this is to stop the product from being added to the cart
        $controllerAction->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
    }
}

注意:このコードは、AJAXifyがカートに追加することはまったくありません(これが私の最終目標です)。現時点では、この問題を解決しようとしています

カートに追加アクションを実行した結果として表示されるページのコンテンツを取得するだけです。

JSコードで示されている、コンソールに表示されているデータの例

4

1 に答える 1

8

商品がカートに追加されると、ユーザーをカートページに送信したり、商品ページにリダイレクトしたりするための管理者が構成可能な動作があります。[システム]>[構成]>[チェックアウト]>[ショッピングカート:ショッピングカートに製品リダイレクトを追加した後]フィールドを参照してください。

controller_action_predispatch_checkout_cart_addこのリダイレクト動作は、動的イベントで設定されたリダイレクトを置き換えるリダイレクトを介して実行されます。参照。からのロジックの最後のビットMage_Checkout_CartController::addAction()。しかし、恐れることはありません!Magentoコア開発者もこの動作をオーバーライドする必要があるため、オブジェクトにフラグが設定されている場合は、通常のリダイレクト動作をバイパスするようにMage_Checkoutカートコントローラーのメソッドに通知することができます。それを機能させるためのフックとサポートロジックがあるだけでなく、実際にはコアからの実用的な例があります-開発者にとって常に良いことです。addAction()checkout/session

メソッドの最後のリダイレクトロジックの直前にaddAction()、カートコントローラーのaddAction()メソッドがイベントをディスパッチしcheckout_cart_add_product_completeます。このイベントは、 Mage_Wishlistオブザーバーによって監視されます。メソッドからの関連する最終ロジックの簡単なレビューは、カートコントローラーのメソッドがリダイレクトさMage_Wishlist_Model_Observer::processAddToCart()れないようにする方法を示しています。つまり、オブジェクトにフラグを設定して、応答オブジェクトに設定されたリダイレクトを保持します。addAction()no_cart_redirectcheckout/session

この場合、もう1つ考慮事項があります。Mage_Wishlistオブザーバーの動作を維持する必要がある可能性があります。つまり、ウィッシュリストからカートに商品を追加した後、顧客はウィッシュリスト内の次の商品にリダイレクトされる場合があります。これは、オブザーバーの処理順序が重要な場合の1つです。Mage_Wishlistモジュールのカートへの追加動作が維持されるようにするには、イベントを消費する他のモジュールがMage_Wishlistcheckout_cart_add_product_completeオブザーバーの前に起動する必要があります。カスタムモジュールの宣言ファイルで、Mage_Wishlistモジュールをカスタムモジュールに依存するように設定する必要があります。これにより、カスタムモジュールのオブザーバーがMage_Wishlistモジュールの前に起動するようになります。

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Custom_Module>
            <active>true</active>
            <codePool>local</codePool>
        </Custom_Module>
        <Mage_Wishlist>
            <depends>
                <Custom_Module />
            </depends>
        </Mage_Wishlist>
    </modules>
</config>

Mage_Wishlistモジュールが要因ではなかった場合、消費するのに適したターゲットイベントは、動的に生成されcontroller_action_postdispatch_checkout_cart_addたイベントです。これは、汎用controller_front_send_response_beforeイベントの前の最後のターゲットイベントです。

于 2012-09-15T00:03:03.577 に答える