2013-05-28 77 views
1

我想阻止用户两次或多次添加同一产品(在后端以及前端),同时不限制他们订购任意数量的项目。Magento - 防止两次或两次以上添加相同的sku

例如,由于存在SKU产品ABCD123 - 如何防止用户将其两次添加到购物车中?相反,允许用户添加一次,让他们更新订购的数量呢​​?

我看过这个How to prevent adding same product to cart more then one time in magento;然而,建议的解决方案是指限制购物车中的物品总数或使用特定库存配置更新每个产品。

有没有办法通过修改购物车代码来做到这一点?

+0

@Lathe ...:您可以使用Ajax通知提的是:“该产品已添加,然而,客户可以在检出时更新产品..“顺便说一句,magento也只更新数量,它不会再添加一行相同的早先加入.. –

+0

如果产品具有自定义选项,如果客户可以选择另一个自定义选项那么产品数量将不会更新 – Mufaddal

回答

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

如果您有自己的模块,你可以尝试覆盖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。

在你​​3210,此模块的路线将不得不改写这样的:

//<global>-Context 
<rewrite> 
    <mymodule_mycheckout_cart> 
     <from><![CDATA[#^/checkout/cart/#]]></from> 
     <to>/mycheckout/cart/</to> 
    </mymodule_mycheckout_cart> 
</rewrite>