การสร้างตัวเลือกที่กำหนดเองและรางวัลให้กับสินค้าที่เพิ่งเพิ่มเข้าสู่ตะกร้าโดยใช้ผู้สังเกตการณ์


15

ฉันต้องการที่จะเพิ่มตัวเลือกที่กำหนดเองเพื่ออ้างคำพูดโดยใช้ผู้สังเกตการณ์ที่ผู้สังเกตการณ์ checkoutCartProductAddAfter เหตุการณ์และไฟหลังจากสินค้าเพิ่มลงในรถเข็น

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

ผู้สังเกตการณ์ของฉันทำงาน แต่ฉันไม่สามารถเพิ่มตัวเลือกที่กำหนดเองให้กับผลิตภัณฑ์ที่เพิ่มเข้ามาได้ โปรดให้ความช่วยเหลือในการเพิ่มตัวเลือกที่กำหนดเองโดยใช้ผู้สังเกตการณ์เพื่อเพิ่งเพิ่มผลิตภัณฑ์


ยังให้ฉันเปลี่ยนราคาที่กำหนดเองของผลิตภัณฑ์ในผู้สังเกตการณ์ ฉันต้องการเพิ่มราคาที่กำหนดเองเป็นศูนย์ ขอบคุณล่วงหน้า
Keyur Patel

คำตอบ:


19

@Tim ได้พูดคุยเกี่ยวกับปัญหานี้ในช่วงสุดสัปดาห์: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

สิ่งที่คุณต้องการคือวิธีที่ 2: เพิ่มเหตุการณ์ต่อไปนี้ใน Config.xml

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

ใน Observer.php เพิ่มวิธีการต่อไปนี้

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

นี่คือเพิ่มเติมเกี่ยวกับหัวข้อนี้:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

และอื่น ๆ:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266


1
ครั้งแรก: โปรดใช้ความคิดเห็นแทนคำตอบใหม่ จากนั้นแทรกการตรวจสอบผลิตภัณฑ์ของคุณในลูปดังนั้นเฉพาะผลิตภัณฑ์ที่คุณต้องการเท่านั้นที่จะได้รับตัวเลือก
Fabian Blechschmidt

1
โปรดดูคำตอบการแก้จุดบกพร่องที่ยอดเยี่ยมนี้และแสดงความคิดเห็นกลับมา: magento.stackexchange.com/a/429/217
Fabian Blechschmidt

1
เป็นไปได้ด้วยขั้นตอนที่อธิบายไว้ข้างต้น
Fabian Blechschmidt

2
ขอบคุณสำหรับข้อเสนอแนะเมื่อฉันสั่งซื้อฉันมีสองรายการเพราะฉันใช้ผลิตภัณฑ์ที่กำหนดค่าได้และฉันได้แก้ไขปัญหาด้วยการอัพเดตรายการใบเสนอราคาล่าสุด
Milople Inc

1
ฉันไม่ได้ แต่ฉันอัพเดทลิงค์ ขอบคุณ!
Fabian Blechschmidt

3

เหตุการณ์ที่เหมาะสมเพื่อเพิ่มตัวเลือกที่กำหนดเองได้ทันทีคือ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);
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.