以编程方式将产品添加到购物车并更改价格

时间:2011-02-24 12:13:02

标签: php magento

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

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

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

有可能吗?

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

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

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

6 个答案:

答案 0 :(得分:62)

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

以下是您可以在侦听checkout_cart_product_add_aftercheckout_cart_update_items_after事件的Observer中使用的示例代码。代码在逻辑上是相同的,只有一个项目调用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);
         }
    }
}

答案 1 :(得分:8)

Magento已经改变了在购物车中计算价格的方式,这使得在v1.4以后很难做到这一点。如果您使用Observer或其他设备设置价格,则几乎肯定会将其覆盖回目录价格。

实际上,您需要使用购物车规则来实现此目的。

答案 2 :(得分:7)

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

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

希望这会有所帮助......

答案 3 :(得分:4)

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

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

答案 4 :(得分:4)

如果我必须分享我在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;
}

答案 5 :(得分:3)

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

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