เหตุการณ์ที่เหมาะสมเพื่อเพิ่มตัวเลือกที่กำหนดเองได้ทันทีคือcatalog_product_type_prepare_full_options
ซึ่งจะเกิดขึ้นก่อนที่ผลิตภัณฑ์ที่มีตัวเลือกที่กำหนดเองจะถูกแปลงเป็นรายการอ้างอิง
หากข้อมูล buyRequest ของตัวเองมีผลกระทบต่อคุณสมบัติหรือตัวเลือกของผลิตภัณฑ์ผู้สังเกตการณ์ในเหตุการณ์catalog_product_type_prepare_{$processMode}_options
เป็นตัวเลือกที่ดีซึ่ง$processMode
เป็นโหมดการตรวจสอบความถูกต้องและสามารถ“ เต็ม” หรือ“ ไลต์” โหมด“ เต็ม” จะใช้เมื่อมีการเพิ่มผลิตภัณฑ์ลงในรถเข็นอย่างสม่ำเสมอและตรวจสอบความถูกต้องหากมีการตั้งค่าตัวเลือกที่จำเป็นทั้งหมดและการกำหนดค่าทั้งหมดนั้นถูกต้อง ในโหมด„ lite ตัวเลือกเท่านั้นที่มีอยู่ในการตรวจสอบความถูกต้องมันจะใช้เมื่อมีการเพิ่มผลิตภัณฑ์ในสิ่งที่ปรารถนา แต่ยังเป็นไปได้เมื่อสร้างคำสั่งซื้อจากแบ็กเอนด์ ในการประมวลผลข้อมูลในกรณีใด ๆ คุณสามารถลงทะเบียนผู้สังเกตการณ์สำหรับเหตุการณ์ทั้งสอง หากมีการตรวจสอบคุณควรแยกเหตุการณ์แน่นอน
เหตุการณ์ถูกทริกเกอร์ใน Mage_Catalog_Model_Product_Type_Abstract :: _ PreparOptions () และพารามิเตอร์ต่อไปนี้จะพร้อมใช้งาน:
transport
: ขนส่งวัตถุสำหรับตัวเลือกที่กำหนดเองทั้งหมด (แต่ไม่มีตัวเลือกอื่น ๆ เช่นตัวเลือกบันเดิล) เพื่อให้คุณสามารถเปลี่ยนได้ในผู้สังเกตการณ์ transport-> options คืออาร์เรย์ในรูปแบบ option_id => option_value โปรดทราบว่าการขนส่งตัวเองเป็นวัตถุ stdClass ไม่ใช่อินสแตนซ์ของ Varien_Object ตามที่คุณคาดหวัง ดังนั้นจึงไม่มีวิธี getter และ setter สำหรับตัวเลือกการขนส่ง ->
buy_request
: วัตถุ buyRequest คุณสามารถอ่านได้ที่นี่และยังสามารถแก้ไขได้เช่นกัน
product
: ผลิตภัณฑ์ที่จะถูกแปลงเป็นรายการพูดในภายหลัง ที่นี่คุณสามารถปรับเปลี่ยนแอตทริบิวต์หรือเพิ่มคุณสมบัติแบบไดนามิก แต่คุณยังต้องพิจารณาในกระบวนการแปลง กิจกรรมที่ใช้สำหรับสิ่งนี้sales_quote_product_add_after
จะถูกเรียกใช้ในภายหลังเท่านั้น
ที่มา: The Magento buyRequest Object - เอกสารอ้างอิง
ดังนั้นผู้สังเกตการณ์อาจมีลักษณะเช่นนี้:
public function addCustomOption(Varien_Event_Observer $observer)
{
$transport = $observer->getTransport();
if (this_item_should_be_free()) { // implement your condition here
$transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
}
}
คุณไม่สามารถกำหนดราคาสำหรับตัวเลือกที่กำหนดเองซึ่งเพิ่มแบบไดนามิกนี้ แต่คุณสามารถเปลี่ยนราคาของรายการอ้างอิงโดยใช้ผู้สังเกตการณ์ที่สองสำหรับcatalog_product_get_final_price
สิ่งนี้:
public function adjustFinalPrice($observer) {
$product = $observer->getProduct();
// Set price to "0" if custom option "Free Gift" has been set
if ($product->getCustomOption('Free Gift')) {
$product->setFinalPrice(0);
}
}