Magento - 以编程方式将多个产品添加到购物车

时间:2012-12-04 11:03:49

标签: magento product cart

在尝试将多个产品添加到购物车的一些泡菜中,实际上我有一个带有表单元素的块,用于定义添加到购物车的产品(免费产品,由观察者事件处理) 。将产品价格更改为免费的观察员活动工作正常,但是通过以下方法向购物车添加多个产品会很麻烦:

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]的数组中明确定义)不会添加到购物车。

我不知道为什么它在技术上不起作用。在添加过程中没有捕获异常,并且调试还将数组显示为填充了两个项目。

任何人都可以解释为什么这不起作用吗?

谢谢!

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();
    }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我也遇到了这个问题,你需要声明

$cart = Mage::getModel('checkout/cart');
在foreach里面。我不确定它为什么会起作用,但它似乎对我有用。

答案 2 :(得分: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();