5

改訂された質問: これはカスタムのカートへの追加方法まで追跡しました。質問を完全に修正しました。

Magento ver.を使用しているサイトに取り組んでいます。1.3.2.4 を e コマース プラットフォームとして使用。AJAX リクエストを介してカートに複数のアイテムを追加するカスタムの「カートに追加」プロセスを構築しました。このリクエストの後、「カートの表示」ページにリダイレクトする前に、ブラウザーで JavaScript を使用していくつかの後処理が行われます。99% の場合、このプロセスは Firefox と Safari では正しく機能しているように見えますが、IE8 ではプロセスが失敗します。カートにアイテムを追加すると、「あなたのカート」ページにリダイレクトされた後、ショッピング カートは空です。

サイト上のすべてのアイテムがこの AJAX プロセスを介して追加されるわけではありません。この問題は、AJAX 経由でアイテムを追加する前にカートが空の場合にのみ発生します。つまり、通常の Magento プロセスで追加されたアイテムが最初に cat に追加された場合、AJAX カートへの追加リクエストは常に成功します。Blu の Cookie をクリアしてから AJAX 経由で追加しようとすると、IE8 で一貫して失敗します。

サーバーは、PHP 5.2.9、eAccelerator、および Suhosin を備えた Apache/PHP サーバーです。追加情報があればリクエストしてください。喜んで提供させていただきます。セッションをMySQLデータベースに保存しています。

カスタムのカートへの追加メソッドのコードは次のとおりです。このコードは次の場所にあり/app/code/core/Mage/Checkout/controllers/CartController.phpます。

public function ajaxaddAction()
{
    $result = array('success' => true);

    try
    {
        $session = $this->_getSession();
        $cart = $this->_getCart();

        $products = json_decode($_POST['products'],true);

        if(!is_array($products))
        {
            throw new Exception("Products data not sent");
        }

        foreach ($products as $product_data)
        {
            $product = $this->_initProduct($product_data['id']);

            if(!$product)
                throw new Exception("Product id {$product_data['id']} not found");

            $info = array('qty' => $product_data['qty']);

            if($product_data['options'])
                $info['options'] = $product_data['options'];

            $cart->addProduct($product,$info);
        }

        $cart->save();

        $this->_getSession()->setCartWasUpdated(true);

        /**
         * @todo remove wishlist observer processAddToCart
         */
        Mage::dispatchEvent('checkout_cart_add_product_complete',
            array('product' => $products[0], 'request' => $this->getRequest(), 'response' => $this->getResponse())
        );

        $cartItems = $cart->getQuote()->getAllItems();

        $result['cart'] = array();

        foreach($cartItems as $item)
            $result['cart'][] = json_decode($item->toJson());
    }
    catch (Mage_Core_Exception $e)
    {
        if ($this->_getSession()->getUseNotice(true)) {
            $this->_getSession()->addNotice($e->getMessage());
        } else {
            $messages = array_unique(explode("\n", $e->getMessage()));
            foreach ($messages as $message) {
                $this->_getSession()->addError($message);
            }
        }
        $result['success'] = false;
        $result['exception'] = $e->getMessage();
    }

   catch (Exception $e) {
        $this->_getSession()->addException($e, $this->__('Can not add item to shopping cart'));
        $result['success'] = false;
        $result['exception'] = $e->getMessage();
    }

    header('Content-Type: application/json',true);

    ob_end_clean();

    echo json_encode($result);

    exit();
}

/app/code/local/「コードをディレクトリに移動します」と答えないでください。それがより良い場所であることを理解しており、将来的にはそこに移動しますが、あなたの答えが問題を解決しない限り、コメントを投稿してください. より迅速な応答を得るために、私は報奨金を開始しており、このコードを統合するためのより良い方法に関するヒントだけでなく、この特定の問題に対する適切な回答が必要です。

私が提供できる情報がありましたら、お知らせください。締め切りが迫っています...

4

3 に答える 3

4

私はこれに10時間以上費やしました。今のところ、部分的な解決策があると思います。しかし、なぜこのソリューションが機能するのかわかりません...

Magento では、カートへの追加プロセスを完了するためにリダイレクトが必要なようです。だから代わりに

header('Content-Type: application/json',true);
ob_end_clean();
echo json_encode($result);
exit();

JSON をセッションに保存し、新しいカート アクションにリダイレクトします。

$this->_getSession()->setCartJsonResult(json_encode($result));
$this->_redirect('checkout/cart/postajaxadd');

そのアクションは、JSON データをダンプします。

public function postajaxaddAction()
{
    $session = $this->_getSession();

    header('Content-Type: application/json',true);
    ob_end_clean();
    echo $this->_getSession()->getCartJsonResult();
    exit();
}

これでも時々失敗します。しかし、私の JavaScript コードは期待していた JSON データを取得せず、リクエストを繰り返すことができます。2 番目のリクエストは最初のリクエストよりも成功することが多いのですが、それでも AJAX リクエストが失敗する場合があります。

于 2010-03-06T02:06:33.320 に答える
3

これがあなたが遭遇している問題の原因であるかどうかはわかりませんが、JSON 応答を行うためのより良い方法は、既存の「Magento/Zend の方法」を使用することです。

それ以外の:

header('Content-Type: application/json',true);

ob_end_clean();

echo json_encode($result);

exit();

使用する:

$this->getResponse()->setHeader('Content-Type', 'application/json', true)->setBody(json_encode($result));
于 2010-03-06T10:58:14.107 に答える
1

セッション ストレージが不足し、新しいセッションを作成できない場合に、カートに物を追加する際に問題が発生しました。セッションをディスクまたは memcache に保存する場合は、十分なスペースが割り当てられていることを確認してください。

于 2010-03-01T22:54:09.477 に答える