【问题标题】:Programmatically add product to cart with price change以编程方式将产品添加到购物车并更改价格
【发布时间】:2011-07-03 12:47:46
【问题描述】:

我想以编程方式将产品添加到购物车。另外,我想在添加到购物车时更改产品价格。

假设,我的产品价格是 100 美元。添加到购物车后,我想将其更改为 90 美元。

我将产品添加到购物车。但是,我无法更改产品价格。

有可能吗?

这是将产品添加到购物车的代码:-

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

try {   
    $cart->addProduct($product, array('qty' => 1));
    $cart->save();
}
catch (Exception $ex) {
    echo $ex->getMessage();
}

【问题讨论】:

标签: php magento


【解决方案1】:

我有同样的问题,我不是开发人员。我所做的是在 magento 后端添加了一个新的价格属性,称为“网站价格”。在产品页面上,这显示更高的价格为 100 美元。该商品的实际价格为 90 美元。因此,当购物者将其添加到购物车时,他们会看到商品的实际价格,但在产品页面上,他们会看到自定义属性价格 $100

如果您在产品页面上的所有价格都高出 %,那么实际价格只需将您的产品价格乘以 1+%。因此,如果您想在所有价格上增加 10%,请执行 price*1.1 这将显示您的价格高出 10%,但当购物者添加到购物车时,他们会看到实际价格。

【讨论】:

    【解决方案2】:

    在深入研究 Magento 的核心代码后,我发现您需要使用 $item->getProduct()->setIsSuperMode(true) 才能使 $item->setCustomPrice()$item->setOriginalPrice() 工作。

    这里有一些示例代码,您可以在侦听checkout_cart_product_add_aftercheckout_cart_update_items_after 事件的观察者中使用。代码在逻辑上是相同的,除了 checkout_cart_product_add_after 只为一件商品调用,checkout_cart_update_items_after 为购物车中的所有商品调用。此代码被分离/复制为 2 个方法仅作为示例。

    事件:checkout_cart_product_add_after

    /**
     * @param Varien_Event_Observer $observer
     */
    public function applyDiscount(Varien_Event_Observer $observer)
    {
        /* @var $item Mage_Sales_Model_Quote_Item */
        $item = $observer->getQuoteItem();
        if ($item->getParentItem()) {
            $item = $item->getParentItem();
        }
    
        // Discounted 25% off
        $percentDiscount = 0.25; 
    
        // This makes sure the discount isn't applied over and over when refreshing
        $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);
    
        // Make sure we don't have a negative
        if ($specialPrice > 0) {
            $item->setCustomPrice($specialPrice);
            $item->setOriginalCustomPrice($specialPrice);
            $item->getProduct()->setIsSuperMode(true);
        }
    }
    

    事件:checkout_cart_update_items_after

    /**
     * @param Varien_Event_Observer $observer
     */
    public function applyDiscounts(Varien_Event_Observer $observer)
    {
        foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item /* @var $item Mage_Sales_Model_Quote_Item */) {
             if ($item->getParentItem()) {
                 $item = $item->getParentItem();
             }
    
             // Discounted 25% off
             $percentDiscount = 0.25; 
    
             // This makes sure the discount isn't applied over and over when refreshing
             $specialPrice = $item->getOriginalPrice() - ($item->getOriginalPrice() * $percentDiscount);
    
             // Make sure we don't have a negative
             if ($specialPrice > 0) {
                 $item->setCustomPrice($specialPrice);
                 $item->setOriginalCustomPrice($specialPrice);
                 $item->getProduct()->setIsSuperMode(true);
             }
        }
    }
    

    【讨论】:

    • 这仅适用于购物车更新。将产品添加到购物车时如何实现此效果。请帮忙。
    • @Arvind07:使用相同的侦听器,但对于事件 checkout_cart_product_add_after,我已更新答案以反映这两个事件。
    • 由于某种原因,这在 Magento Enterprise 1.11 或 1.6CE 中不起作用。有什么想法吗?
    • @leek 是否可以仅为一个特定用户设置此自定义价格(基于 cookie/其他建议/注册用户。
    • $item->getOriginalPrice() 在 Magento CE 1.8 上不返回任何内容。有其他选择吗?
    【解决方案3】:

    如果我必须分享我在 Simon 的基础上制作的解决方案,那么我已经设法重写了报价的模型类保存功能。

    public function save()
    {
    
        $this->getQuote()->getBillingAddress();
        $this->getQuote()->getShippingAddress()->setCollectShippingRates(true);
        $this->getQuote()->collectTotals();
        //$this->getQuote()->save();
    
        foreach($this->getQuote()->getAllItems() as $item) {             
              $productId = $item->getProductId();
              $product = Mage::getModel('catalog/product')->load($productId);
              if($product->getAttributeText('is_dummy') == 'Yes') {
                $price = 2;
                $item->setCustomPrice($price);
                // we need this since Magento 1.4
                $item->setOriginalCustomPrice($price);
              }
        }  
           $this->getQuote()->save();   
        $this->getCheckoutSession()->setQuoteId($this->getQuote()->getId());
        /**
         * Cart save usually called after chenges with cart items.
         */
        Mage::dispatchEvent('checkout_cart_save_after', array('cart'=>$this));
        return $this;
    }
    

    【讨论】:

      【解决方案4】:

      可以为报价项目设置客户特定的价格。因此,应该这样做:

      $quoteItem = $quote->addProduct($product, $qty);
      $quoteItem->setCustomPrice($price);
      // we need this since Magento 1.4
      $quoteItem->setOriginalCustomPrice($price);
      $quote->save();
      

      希望这会有所帮助...

      【讨论】:

      • @Simon ,如果我可以为基于 cookie/用户访问网站的特定客户设置自定义价格(在他们完成点击链接之后)?
      • @RainbowHat 当然,应该是可能的。如有更多问题,请提出新问题。
      【解决方案5】:

      Jonathan 的答案可能是大多数情况下的最佳答案。但有些客户可能不喜欢购物车折扣在购物车中的显示方式。我最近做了一个项目(使用 Magento 1.3.3),客户不喜欢每个行项目仍然显示全价和小计,在小计下方有一条折扣线 - 他想查看价格每件商品打折,小计也显示打折价格。他真的不喜欢在小计行之后有折扣行。

      无论如何,如果您发现自己处于同一条船上,一种方法是覆盖 Mage_Sales_Model_Quote_Address_Item 和 Mage_Sales_Model_Quote_Item 中的 getCalculationPrice() 和 getBaseCalculationPrice() 方法。我知道重写并不总是很漂亮,使用事件要好得多,但在这种情况下,我无法让事件在前端和后端无缝工作。不确定这种方法是否适用于 Magento 1.4+。

      【讨论】:

        【解决方案6】:

        Magento 改变了在购物车中计算价格的方式,这使得从 v1.4 开始很难做到这一点。如果您确实使用观察者或其他设备设置价格,它几乎肯定会被覆盖回目录价格。

        实际上,您需要使用购物车规则来实现这一点。

        【讨论】:

        • 你知道如何以编程方式添加购物车规则吗?
        • 在这里查看@Alan Storm 的答案 (stackoverflow.com/questions/2798069/…)
        • 谢谢。 @Alan Storm 和 @ahsan 的回答给了我很多想法。
        • 您好,伙计,您成功了吗?如果是,请分享您的解决方案。我急需这个。谢谢
        猜你喜欢
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        相关资源
        最近更新 更多