Membuat opsi dan hadiah Kustom untuk hanya menambahkan produk ke keranjang menggunakan pengamat

15

Saya ingin menambahkan opsi kustom untuk mengutip menggunakan pengamat yang mengamati checkoutCartProductAddAfter acara dan kebakaran setelah produk ditambahkan ke keranjang.

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;

}

Pengamat saya berfungsi tetapi saya tidak dapat menambahkan opsi khusus ke produk yang ditambahkan. berikan bantuan untuk menambahkan opsi khusus menggunakan pengamat ke produk yang baru saja ditambahkan.

Keyur Patel
sumber
juga memberi saya untuk mengubah harga custom produk di pengamat. saya ingin menambahkan harga khusus ke nol. terima kasih sebelumnya
Keyur Patel

Jawaban:

19

@Tim memberi ceramah tentang masalah ini pada akhir pekan: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Apa yang Anda inginkan adalah Metode 2: Tambahkan Acara Mengikuti di 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>

Di Observer.php tambahkan Metode berikut

   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),
                )
            );
        }
    }

Berikut ini lebih banyak tentang topik ini:

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

dan lainnya:

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

Fabian Blechschmidt
sumber
1
Pertama: Silakan gunakan komentar, bukan jawaban baru. Dan kemudian masukkan cek untuk produk Anda dalam loop, jadi hanya produk yang Anda inginkan yang memiliki opsi.
Fabian Blechschmidt
1
Silakan lihat jawaban debugging yang hebat ini dan beri komentar balik: magento.stackexchange.com/a/429/217
Fabian Blechschmidt
1
Ini dimungkinkan dengan langkah
Fabian Blechschmidt
2
Terima kasih atas sarannya. Ketika saya menambah keranjang saya mendapat dua item karena saya menggunakan produk yang dapat dikonfigurasi dan saya telah memecahkan masalah dengan memperbarui item kutipan terakhir.
Milople Inc
1
Saya juga tidak, tetapi saya memperbarui tautannya. Terima kasih!
Fabian Blechschmidt
3

Acara yang tepat untuk menambahkan opsi kustom dengan cepat adalah catalog_product_type_prepare_full_options, yang dipicu tepat sebelum produk dengan opsi kustomnya dikonversi ke item penawaran.

Jika data buyRequest sendiri berpengaruh pada atribut atau opsi produk, pengamat pada acara tersebut catalog_product_type_prepare_{$processMode}_optionsadalah pilihan yang baik, di mana$processMode mode validasi dan dapat "penuh" atau "lite". Mode "penuh" digunakan ketika suatu produk ditambahkan secara teratur ke troli dan memvalidasi jika semua opsi yang diperlukan ditetapkan dan seluruh konfigurasi valid. Dalam mode "lite" hanya opsi yang terkandung dalam permintaan divalidasi, ini digunakan saat menambahkan produk ke daftar harapan, tetapi juga memungkinkan saat membuat pesanan dari backend. Untuk memproses data dalam hal apa pun Anda dapat mendaftarkan pengamat untuk kedua acara. Jika ada validasi, Anda harus membedakan peristiwa tentu saja.

Peristiwa dipicu dalam Mage_Catalog_Model_Product_Type_Abstract :: _ prepOptions () dan parameter berikut tersedia:

  • transport: Transport objek untuk semua opsi khusus (tetapi tidak ada opsi lain, misalnya opsi bundel), sehingga Anda dapat mengubahnya di pengamat. transport-> options adalah array dalam bentuk option_id => option_value. Perhatian, transport itu sendiri adalah objek stdClass, bukan turunan dari Varien_Object, seperti yang Anda harapkan. Jadi tidak ada metode pengambil dan penyetel untuk opsi transport->.
  • buy_request: Objek buyRequest, Anda dapat membacanya di sini dan masih memodifikasinya juga.
  • product: Produk yang akan dikonversi menjadi item kutipan di kemudian hari. Di sini Anda dapat memanipulasi atribut atau menambahkannya secara dinamis. Tetapi Anda masih perlu mempertimbangkannya dalam proses konversi. Acara yang digunakan untuk ini,, sales_quote_product_add_afterdipicu nanti saja.

Sumber: Objek buyRequest Magento - Referensi

Jadi pengamat mungkin terlihat seperti ini:

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';
    }
}

Anda tidak dapat menetapkan harga untuk opsi kustom yang ditambahkan secara dinamis ini, tetapi Anda dapat mengubah harga item penawaran menggunakan pengamat kedua catalog_product_get_final_priceseperti ini:

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);
    }
}
Fabian Schmengler
sumber