【问题标题】:Magento - Adding multiple products to cart programaticallyMagento - 以编程方式将多个产品添加到购物车
【发布时间】:2012-12-04 11:03:48
【问题描述】:

在尝试将多个产品添加到购物车的过程中,实际上我有一个带有表单元素的块,该元素定义了添加到购物车的产品(免费产品,由观察者事件处理) .将产品价格更改为免费的观察者事件运行良好,但是使用以下方法将多个产品添加到购物车被证明很麻烦:

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

【问题讨论】:

  • 将 $cart->save() 方法移到购物车之外允许将附加项目添加到购物车,但是,第一个项目已添加两次!数量已定义,为什么会发生这种情况我还没有弄清楚。

标签: magento product cart


【解决方案1】:
<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

【讨论】:

  • 感谢 R.S,不幸的是没有工作,我已经阅读了关于为什么我必须在循环内重复产品模型的问题。同样的问题仍然存在:-/ 尝试将购物车保存在循环中,但是,仅显示 1 个产品的不同问题。
  • 你们的产品有选择吗?
  • 无 - 两种产品都很简单。
  • 有趣的运行 - $quote_item->getQty();显示: 2012-12-04T12:23:57+00:00 DEBUG (7): 第二个产品正确输出 2012-12-04T12:23:57+00:00 DEBUG (7): 1 就 Magento 而言有关第一个产品(2 个违规者的数量)在购物车中没有设置数量...通过 $quote_item->setQty(1) 设置数量;将数量设置为 3?!?!?!
  • 看看我更新的代码,我在 v1.7 上测试过,它确实有效
【解决方案2】:

我也遇到过,你需要声明

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

在foreach里面。我不确定它为什么有效,但它似乎对我有效。

【讨论】:

    【解决方案3】:

    也许这个会有所帮助:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2015-11-27
      • 2014-07-01
      相关资源
      最近更新 更多