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

Php 以编程方式将产品添加到购物车并更改价格,php,magento,Php,Magento,我想以编程方式将产品添加到购物车。此外,我想改变产品价格时,添加到购物车 假设我的产品价格是100美元。我想在加入购物车时把它改成90美元 我将产品添加到购物车。但是,我无法更改产品价格 可能吗 以下是将产品添加到购物车的代码:- $cart = Mage::getSingleton('checkout/cart'); try { $cart->addProduct($product, array('qty' => 1)); $cart->save();

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

假设我的产品价格是100美元。我想在加入购物车时把它改成90美元

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

可能吗

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

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

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

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


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

乔纳森的答案可能是大多数情况下最好的答案。但有些客户可能不喜欢购物车折扣在购物车中的显示方式。我最近做了一个项目(使用Magento 1.3.3),其中客户不喜欢每一行项目仍然显示完整价格以及小计,小计下方有一个折扣线-他希望看到每一项的价格折扣,小计也显示折扣价格。他真的不喜欢在小计行之后有折扣行


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

在深入研究了Magento的核心代码后,我发现您需要使用
$item->getProduct()->setIsSuperMode(true)
,以使
$item->setCustomPrice()
$item->setOriginalPrice()
有效

下面是一些示例代码,您可以在侦听
结帐车\产品\添加\在
之后或
结帐车\更新\项目\在
事件之后的观察者中使用。代码在逻辑上是相同的,除了对一个项目调用
结帐购物车\u产品\u添加\u后
,对购物车中的所有项目调用
结帐购物车\u更新\u后项目。作为示例,此代码被分离/复制为2个方法

事件:签出\购物车\产品\添加\之后 事件:结账\u购物车\u更新\u项目\u之后
可以设置报价项目的客户特定价格。因此,像这样的事情应该可以做到:

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

希望这有助于…

如果我必须分享我在Simon基础上制定的解决方案,那么我已经设法重写了quote的模型类保存函数

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

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

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

您知道如何以编程方式添加购物车规则吗?请在此处查看@Alan Storm的答案()谢谢。艾伦·斯托姆和阿桑的回答给了我很多想法。嗨,查普,你又开始工作了吗?如果是,请分享您的解决方案。我急需这个。谢谢这只适用于购物车更新。如何在将产品添加到购物车时实现此效果。请提供帮助。@Arvind07:使用相同的侦听器,但对于事件
结帐\u购物车\u产品\u添加\u之后的事件
,我已更新了答案以反映这两个事件。由于某些原因,这不适用于Magento Enterprise 1.11或1.6CE。有什么想法吗?@leek是否可以只为一个特定用户设置此自定义定价(基于cookie/其他建议/注册用户。$item->getOriginalPrice()没有在Magento CE 1.8上返回任何内容。有其他选择吗?我可以根据@Simon的说明更改产品价格,如果我可以根据cookie/用户为访问网站的特定客户设置自定义价格(在他们点击链接后)“?@彩虹帽当然,应该是可能的。进一步的问题,请问一个新问题。”。
$quoteItem = $quote->addProduct($product, $qty);
$quoteItem->setCustomPrice($price);
// we need this since Magento 1.4
$quoteItem->setOriginalCustomPrice($price);
$quote->save();
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;
}