2

カートに商品を追加しようとしています。このためのオブザーバーを作成しました。

<?php
class WP_Plugadapter_Model_Observer
{

    public function hookToControllerActionPostDispatch($observer)
    {
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add')
        {
            Mage::dispatchEvent("add_to_cart_after", array('request' => $observer->getControllerAction()->getRequest()));
        }
    }

    public function hookToAddToCartAfter($observer)
    {

        $request                = $observer->getEvent()->getRequest()->getParams();
        $_product               = Mage::getModel('catalog/product')->load($request['product']);
        $extra_functions        = $_product->getExtra_functions();

        if(!empty($extra_functions)){

            $extra_functions    = explode(',', $extra_functions);
            if(array_search('121', $extra_functions)){

                $cart           = Mage::getSingleton('checkout/cart'); 
                $cart->addProduct(10934, 1);
                $cart->save();

                if (!$cart->getQuote()->getHasError()){
                   Mage::log("Product ADD TO CART is added to cart.");
                }else{
                   Mage::log("BOEM");
                }

            }  

        }

    }

}

システムログを確認すると、次のログメッセージが表示されます。製品ADDTOCARTがカートに追加されます。

何が間違っているのかわかりません。スクリプトをスタンドアロンでロードすると、正常に機能します。例えば:

<?php

include_once '../app/Mage.php';

Mage::app();
umask(0);

$session        = Mage::getSingleton('core/session', array('name'=>'frontend'));        
$cart           = Mage::getSingleton('checkout/cart'); 
$cart->addProduct(10934, 1);
$cart->save();

オブザーバーで別の方法でそれを行うことができる可能性はありますか?

4

1 に答える 1

5

問題は、カートの見積もりオブジェクトがデータベースに保存されず、リクエスト処理の後半でセッションからの見積もりオブジェクトによって上書きされることです。カートの見積もりが保存されない理由は非常に紛らわしいです。savequote モデルのメソッドは、内部プロパティがtrue_hasDataChangesに設定されていることを想定しています。ただし、このプロパティは、製品が見積もりに追加されてもfalseのままです。

次のメソッドを使用して引用符にデータを追加することで、そのプロパティを強制的にtrueに設定できます (どのプロパティでも可能です) 。setData

                $cart = Mage::getSingleton('checkout/cart'); 
                $cart->addProduct(10934, 1);
                //force _hasDataChanges to true
                $cart->getQuote()->setData('updated', true);
                $cart->save();

または、チェックアウト セッションの見積もりオブジェクトを使用して、商品をカートに追加することもできます

 if(array_search('121', $extra_functions)){

            $cart           = Mage::getSingleton('checkout/cart'); 
            $qty = 1;
            $quote =  Mage::getSingleton('checkout/session')->getQuote()
                ->addProduct(
                    Mage::getModel('catalog/product')->load(10934),
                    $qty)
                ->save();
            $cart->save();

            if (!$cart->getQuote()->getHasError()){
               Mage::log("Product ADD TO CART is added to cart.");
            }else{
               Mage::log("BOEM");
            }

        } 
于 2013-02-13T16:39:41.630 に答える