我想阻止用户两次或多次添加相同的产品(在后端和前端),同时不限制他们订购任意数量的商品。
例如,鉴于有一个SKU ABCD123 的产品 - 如何阻止用户将其两次添加到购物车中?而是允许用户添加一次,让他们更新订购的数量?
我看了How to prevent adding same product to cart more then one time in magento;但是建议的解决方案是指限制购物车中的商品总数或使用特定库存配置更新每件商品。
有没有办法通过修改购物车代码来做到这一点?
答案 0 :(得分:1)
如果产品有自定义选项,并且客户可以选择其他自定义选项,那么在这种情况下产品数量不会更新,如果产品很简单,那么每次客户添加到购物车产品时数量都会更新
您可以使用事件观察者检查具有相同sku的产品是否在购物车中。
您可以使用checkout_cart_product_add_before
事件检查购物车中是否已存在此产品。下面是关于如何在magento中创建偶数观察者的代码的重点。
您的配置文件看起来像这样
<config>
...
<frontend>
...
<events>
<checkout_cart_product_add_after>
<observers>
<unique_event_name>
<class>{{modulename}}/observer</class>
<method>CheckItem</method>
</unique_event_name>
</observers>
</checkout_cart_product_add_after>
</events>
...
</frontend>
...
并且在你的观察者中检查你的逻辑是否有东西在购物车中
class <namespace>_<modulename>_Model_Observer
{
public function CheckItem(Varien_Event_Observer $obs)
{
// Get the quote item
$item = $obs->getQuoteItem();
//and put your logic here to match item with sku
}
}
答案 1 :(得分:1)
如果您有自己的模块,可以尝试覆盖CartController中的addAction
:
class MyModule_MyCheckout_CartController extends Mage_Checkout_CartController
{
public function addAction()
{
// initialize product to add to cart
$product = $this->_initProduct();
$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();
foreach($items as $item)
{
if($item->getSku() == $product->getSku()
{
//add the same item
Mage::getSingleton('checkout/session')->getQuote()->addItem($item);
// set a message in the session
return $this->_redirectReferer(Mage::helper('checkout/cart')->getCartUrl());
}
}
parent::addAction();
}
}
基本上,当你添加东西时,你会在你的购物车中循环,当你发现已经添加了SKU时返回。
在config.xml
中,必须覆盖此模块的路径:
//<global>-Context
<rewrite>
<mymodule_mycheckout_cart>
<from><![CDATA[#^/checkout/cart/#]]></from>
<to>/mycheckout/cart/</to>
</mymodule_mycheckout_cart>
</rewrite>