เรามีข้อกำหนดที่ลูกค้าจะได้รับอนุญาตให้เพิ่มสินค้าเพียงหนึ่งรายการในรถเข็นในแต่ละครั้ง อย่างไรก็ตามเขา / เธอสามารถเพิ่มปริมาณของผลิตภัณฑ์ใด ๆ
ฉันจะป้องกันไม่ให้สินค้าใส่ในรถเข็นได้อย่างไรถ้ามีสินค้าอยู่ในตะกร้าแล้ว?
บางคนสามารถช่วยในเรื่องนี้?
เรามีข้อกำหนดที่ลูกค้าจะได้รับอนุญาตให้เพิ่มสินค้าเพียงหนึ่งรายการในรถเข็นในแต่ละครั้ง อย่างไรก็ตามเขา / เธอสามารถเพิ่มปริมาณของผลิตภัณฑ์ใด ๆ
ฉันจะป้องกันไม่ให้สินค้าใส่ในรถเข็นได้อย่างไรถ้ามีสินค้าอยู่ในตะกร้าแล้ว?
บางคนสามารถช่วยในเรื่องนี้?
คำตอบ:
เหตุการณ์catalog_product_type_prepare_full_options
และcatalog_product_type_prepare_lite_options
เป็นเพื่อนของคุณ
<?xml version="1.0"?>
<config>
<modules>
<Fooman_Example>
<version>0.1.0</version>
</Fooman_Example>
</modules>
<global>
<models>
<fooman_example>
<class>Fooman_Example_Model</class>
</fooman_example>
</models>
<helpers>
<fooman_example>
<class>Fooman_Example_Helper</class>
</fooman_example>
</helpers>
</global>
<frontend>
<events>
<catalog_product_type_prepare_full_options>
<observers>
<fooman_example_catalog_product_type_prepare>
<class>Fooman_Example_Model_Observer</class>
<method>catalogProductTypePrepare</method>
</fooman_example_catalog_product_type_prepare>
</observers>
</catalog_product_type_prepare_full_options>
</events>
</frontend>
</config>
จากนั้นในชั้นสังเกตการณ์ของคุณ
<?php
class Fooman_Example_Model_Observer
{
public function catalogProductTypePrepare($observer)
{
$quote = Mage::getSingleton('checkout/session')->getQuote();
if($quote->getItemsCount()>=1){
Mage::throwException('You can only buy one product at a time.');
}
}
}
catalog_product_type_prepare_lite_options
เป็นคนแรกสำหรับฉัน! ทำได้ดีมาก
แทนที่จะเขียนตัวควบคุมใหม่ (โปรดโอ้โปรดอย่าทำเช่นนั้น) แทนที่จะเขียนaddProduct
วิธีใหม่เพื่อ จำกัด จำนวน:
class YourCompany_YourModule_Model_Cart extends Mage_Checkout_Model_Cart
{
public function addProduct($productInfo, $requestInfo=null){
if($this->getItemsCount()>1){
Mage::throwException(Mage::helper('checkout')->__('Cannot add item - cart quantity would exceed checkout the limit of %s per person.', 1));
}
parent::addProduct($productInfo, $requestInfo);
}
}
หากคุณต้องการได้รับแฟนซีแทนที่1
ข้างต้นด้วยMage::getStoreConfig('checkout/options/max_cart_qty)
และตั้งค่าต่อไปนี้ config.xml ของโมดูลของคุณ:
<default>
<checkout>
<options>
<max_cart_qty>1</max_cart_qty>
</options>
</checkout>
</default>
ค่าดังกล่าวจะถูกควบคุมผ่านค่า XML หากคุณต้องการได้รับจริง ๆ แฟนซีเพิ่มนี้ไปยัง system.xml ของโมดูลใหม่ของคุณ:
<config>
<sections>
<checkout>
<groups>
<options>
<fields>
<max_cart_qty translate="label">
<label>Maximum Quantity Allowed in Cart (total qty)</label>
<frontend_type>text</frontend_type>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
</max_cart_qty>
</fields>
</options>
</groups>
</checkout>
</sections>
</config>
โปรดจำไว้ว่าคุณต้องตั้งค่า<depends>Mage_Checkout</depends>
โมดูลของคุณเพื่อ piggyback ในการกำหนดค่าระบบที่กำหนดไว้ล่วงหน้า
วิธีที่เป็นไปได้คือการเขียน addAction ของ Mage_Checkout_CartController
ดังนั้นตรวจสอบว่ามีสินค้าอยู่ในตะกร้าแล้วและถ้าใช่แสดงข้อความแสดงข้อผิดพลาดที่เหมาะสม หากไม่ใช่คุณสามารถเรียกใช้เมธอดพาเรนต์ซึ่งกำลังทำกระบวนการเพิ่มทั้งหมด:
if (count($this->_getCart()->getProductIds()) > 0) {
$this->_goBack();
} else {
parent::addAction();
}
$this->_goBack();
ไม่ทำงาน! ฉันได้รับเงื่อนไขว่า แต่ผลิตภัณฑ์ยังคงได้รับการเพิ่ม
ฉันคิดว่าคุณสามารถใช้ผู้สังเกตการณ์และเหตุการณ์ต่อไปนี้จะเป็นประโยชน์ในการตรวจสอบเงื่อนไขที่คุณต้องการ (บางทีเหตุการณ์บางอย่างอาจไม่อยู่ในเวอร์ชันของ Magento ที่คุณใช้)
checkout_cart_save_before
checkout_cart_product_add_after
checkout_cart_update_items_before
checkout_cart_update_items_after
checkout_cart_save_after
checkout_cart_product_add_after
กิจกรรมแล้วคำถามคือฉันจะป้องกันไม่ให้เพิ่มสินค้าลงในรถเข็นได้อย่างไร
อาจเป็นแนวคิดทางด้านซ้ายเล็กน้อย แต่จะใช้catalog_product_is_salable_after
กิจกรรมนี้อย่างไร
สิ่งที่คุณสามารถทำได้ที่นี่คือการตรวจสอบเพื่อดูว่าสินค้าอยู่ในตะกร้าหรือมีสินค้าอื่นในตะกร้าหรือไม่ เมื่อมีผลิตภัณฑ์อื่นในรถเข็นอัปเดตแอตทริบิวต์ 'is_salable' ของวัตถุ 'ขายได้' ส่งผ่านไปยังผู้สังเกตการณ์ให้เป็นเท็จ
โปรดทราบว่าสิ่งนี้ยังไม่ได้ทดสอบและเป็นเพียงความคิด มันจะล้มเหลวถ้าแม่แบบของคุณไม่ได้ตรวจสอบ$product->isSaleable()
ก่อนที่จะแสดงปุ่ม นอกจากนี้ยังเป็นการลบปุ่มเท่านั้นและจะไม่หยุดกระบวนการเพิ่มหากผู้ใช้สามารถคาดเดา URL ได้
ฉันรู้ว่าหัวข้อนี้เป็นเรื่องเก่า แต่ฉันมีปัญหาที่คล้ายกัน ฉันต้องการเพียงรายการเดียวในตะกร้าและถ้าลูกค้าเพิ่มรายการใหม่ฉันต้องการแทนที่รายการเก่าด้วยรายการใหม่ ดังนั้นฉันจึงแทนที่ addAction (อธิบายไว้ที่นี่เช่นนี้:
public function addAction(){
$items = $this->_getCart()->getItems();
foreach ($items as $item)
{
$itemId = $item->getItemId();
$this->_getCart()->removeItem($itemId);
}
parent::addAction();
}
checkout_cart_product_add_before
นั่นเช่นmarkshust.com/2012/