0

複数の製品をカートに追加しようとするちょっとしたピックルでは、カートに追加される製品 (オブザーバー イベントで処理される無料の製品) を定義するフォーム要素を含むブロックが効果的にあります。商品の価格を無料に変更するオブザーバー イベントは正常に機能していますが、次の方法ではカートに複数の商品を追加するのが面倒です。

public function addFreeItems($observer) {
$cart = Mage::getSingleton('checkout/cart');
$freeItems = $_SESSION['package_free_item'];
$freeItemSplit = explode(",", $freeItems);
try {
    foreach ($freeItemSplit as $product) {
        $product = Mage::getModel('catalog/product')->load($product);
        $cart->addProduct($product, array('qty' => '1'));
        $cart->save();
    }
} catch(Exception $e) {
       Mage::log($e->getMessage());
       echo $e->getMessage();
    }
} 

このメソッドは単一のアイテムに対して機能し、問題なく追加されますが、後続のアイテム (位置 [1] の配列で明確に定義されています) はカートに追加されません。

なぜこれが技術的にうまくいかないのか、私は途方に暮れています。追加プロセスで例外はキャッチされず、デバッグでも配列に 2 つの項目が取り込まれていることが示されます。

なぜこれが機能しないのか、誰かが光を当てることができますか?

ありがとう!

XML 更新:

<sales_quote_add_item>
        <observers>
            <priceupdate_observer>
                <type>singleton</type>
                <class>Edge_Package_Model_ObserverPrice</class>
                <method>updatePrice</method>
            </priceupdate_observer>
        </observers>
</sales_quote_add_item>

パッケージの価格を効果的に更新するだけでなく、その中から無料の製品の追加を呼び出します。

編集2:

public function addFreeItems($observer) {
$route = Mage::app()->getFrontController()->getRequest()->getRouteName();
if($route == "packages" && $_SESSION['package_free_item'] != null ) {
    $freeItems = $_SESSION['package_free_item'];
    $product_ids = explode(",", $freeItems);
    $cart = Mage::getSingleton('checkout/cart');
        foreach ($product_ids as $product_id) {
        $product = Mage::getModel('catalog/product')->load($product_id);
        $cart->addProduct($product, array('qty' => '1', 'product_id' => $product->getId()));  
        }
    $cart->save();
    }
}
4

3 に答える 3

0

私もこれに遭遇しました。あなたは宣言する必要があります

$cart = Mage::getModel('checkout/cart');

foreachの内部。なぜ機能するのかはわかりませんが、私には機能しているようです。

于 2013-10-25T01:48:45.653 に答える
0
<checkout_cart_product_add_after>
        <observers>
            <priceupdate_observer>
                <type>singleton</type>
                <class>Edge_Package_Model_ObserverPrice</class>
                <method>updatePrice</method>
            </priceupdate_observer>
        </observers>
</checkout_cart_product_add_after>

public function addFreeItems($observer) {
   $quote = Mage::getSingleton('checkout/session')->getQuote();
   //foreach loop
   $quote->addProduct($product, array('qty' => '1', 'product_id' => $product->getId()));
}

/app/code/core/Mage/Checkout/Model/Cart.php のメソッド addProduct を参照してください。

http://magentocommerce.com/boards/viewthread/39334を参照してください。

于 2012-12-04T11:41:45.883 に答える
0

これが役立つかもしれません:

http://deepakbhatta.com/magento-add-multiple-items-to-cart/

 $cart = Mage::helper('checkout/cart')->getCart();
        $ms="";
        foreach($validProducts as $sku => $qty) {
            $params = array('qty' => $qty);
            $id = Mage::getModel('catalog/product')->getIdBySku($sku);
            $product = Mage::getModel('catalog/product')->load($id);;
            $cart->addProduct($product, $params);
            $msg .= $product->getName(). " is successfully added into cart<br>";
        }
         $cart->save();
于 2014-10-25T03:51:50.577 に答える