Menyalin opsi kustom dinamis untuk mengutip item, item pesanan

13

Saya memiliki pengamat yang menambahkan opsi kustom dinamis ke halaman detail produk, yang disebut pada catalog_controller_product_viewacara tersebut. Ini memungkinkan pelanggan untuk memilih dari dropdown dari kode lisensi yang ada.

public function addLicenseOptions(Varien_Event_Observer $observer) {
    $product = $observer->getEvent()->getProduct();
    if ($product->isSubscriptionProduct()) {
        $optionModel = Mage::getModel('catalog/product_option')
            ->setTitle('License Code')
            ->setProductId($product->getId())
            ->setStoreId($product->getStoreId())
            ->setId('license_code')
            ->setType('drop_down')
            ->setPrice(null)
            ->setPriceType(null)
            ->setIsRequire(true);

        $customer = Mage::getSingleton('customer/session')->getCustomer();
        if ($customer->getId()) {
            $linksPurchased = Mage::getResourceModel('downloadable/link_purchased_collection')
                        ->addFieldToFilter('customer_id', $customer->getId());

            if ($linksPurchased->count() > 0) {
                foreach ($linksPurchased as $linkPurchased) {
                    $valueModel = Mage::getModel('catalog/product_option_value')
                        ->setTitle($linkPurchased->getData('key_code'))
                        ->setProduct($product)
                        ->setOption($optionModel)
                        ->setId($linkPurchased->getData('license_code'))
                        ->setPrice(null)
                        ->setPriceType('fixed')
                        ->setSku(null);
                    $optionModel->addValue($valueModel);
                }
                $product->setHasOptions(1);
                $product->addOption($optionModel);
            }
        }
    }
}

Tetapi, ketika saya melakukan pemesanan, opsi yang dipilih hanya disimpan di menu info_buyRequest. Apakah ada cara untuk mendapatkannya agar disimpan seolah-olah itu adalah opsi produk yang dibuat di admin?

Laura
sumber

Jawaban:

6

Saya telah melakukan sesuatu yang serupa tetapi tidak cukup. Mungkin itu membantu.
tugas saya adalah memiliki kotak centang pada setiap halaman produk yang disebut gift wrap. Jika dicentang maka, tim penjualan akan tahu untuk membungkus produk (mereka hanya punya satu opsi pembungkus).
Jadi saya melakukan ini untuk dapat mem-porting nilai wrapkotak centang dari produk ke kutipan ke pesanan. (Saya bisa menggunakan opsi kustom tetapi jelek untuk menambahkan satu opsi ke beberapa ribu produk).

Saya memiliki pengamat untuk acara tersebut sales_convert_quote_item_to_order_item.

public function checkGiftWrap($observer)
{
    $orderItem = $observer->getEvent()->getOrderItem();
    $item = $observer->getEvent()->getItem();
    $wrap = $item->getOptionByCode('wrap');
    if ($wrap){
        $options = $orderItem->getProductOptions();
        $options['wrap'] = unserialize($wrap->getValue());
        $orderItem->setProductOptions($options);
    }
    return $this;
}

Saya telah menulis ulang Mage_Catalog_Helper_Product_Configuration::getCustomOptionspembantu untuk memberi tahu Magento bahwa opsi saya penting dan harus memperlakukannya secara terpisah

<?php
class [Namespace]_[Module]_Helper_Product_Configuration extends Mage_Catalog_Helper_Product_Configuration
{
    public function getCustomOptions(Mage_Catalog_Model_Product_Configuration_Item_Interface $item){
        $options = parent::getCustomOptions($item);
        $wrap = $item->getOptionByCode('wrap');
        if ($wrap){
            $options = array_merge($options, array(unserialize($wrap->getValue())));
        }
        return $options;
    }
}

Untuk alasan yang sama saya telah menulis ulang Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionssehingga opsi saya akan ditampilkan di troli

<?php
class [Namespace]_[Module]_Block_Sales_Order_Item_Renderer_Default extends Mage_Sales_Block_Order_Item_Renderer_Default
{
    public function getItemOptions(){
        $result = parent::getItemOptions();
        $options = $this->getOrderItem()->getProductOptions();
        if (isset($options['wrap'])){
            $result = array_merge($result, array($options['wrap']));
        }
        return $result;
    }
}

dan kolom nama admin untuk kisi item pesanan:

<?php
class [Namespace]_[Module]_Block_Adminhtml_Sales_Items_Column_Name extends Mage_Adminhtml_Block_Sales_Items_Column_Name
{
    public function getOrderOptions(){
        $result = parent::getOrderOptions();
        if ($options = $this->getItem()->getProductOptions()) {
            if (isset($options['wrap'])) {
                $result = array_merge($result, array($options['wrap']));
            }
        }
        return $result;
    }
}

[EDIT]
Sepertinya saya melewatkan sesuatu. Saya hanya menerapkan opsi untuk menambahkan giftwrap setelah produk ada di troli.
Tapi saya pikir Anda dapat menggunakan kode yang sama dalam suatu acara sebelum atau setelah menambahkan item ke troli.

$data = array();
$data['label'] = Mage::helper('helper_alias')->__('Giftwrapping');
$data['value'] = Mage::helper('helper_alias')->__('Yes');
$product->addCustomOption('wrap', serialize($data));
$item->addOption($product->getCustomOption('wrap'));
$item->save(); //this line should be called only if it's not called by default after your event is dispatched.

Itu dia. Saya harap Anda bisa mendapatkan sesuatu yang bermanfaat darinya.

Marius
sumber
Di mana saya mengalami masalah adalah mendapatkan opsi. Ketika saya memanggil $ item-> getOptionByCode ('license_code') saya mendapatkan null. Pilihan saya bahkan tidak muncul ketika saya memanggil yang berikut: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); Bagaimana Anda mengatur opsi 'bungkus'?
Laura
@Laura. Saya akan memeriksa apakah saya melewatkan sesuatu dan kembali kepada Anda.
Marius
@Laura. Saya memeriksa dua kali dan sepertinya saya melewatkan sesuatu. Bagi saya, opsi untuk menambahkan pembungkus kado hanya ditampilkan di troli. Saya lupa saya mengubah ini karena klien memintanya. Saya memperbarui jawabannya dengan kode yang saya gunakan dalam tindakan khusus. Mungkin Anda bisa menambahkannya di pengamat acara keranjang.
Marius
Saya akhirnya parsing permintaan beli. Masalahnya adalah bahwa opsi yang saya atur di blok kode asli saya tidak ditransfer ke item kutipan sama sekali di luar permintaan beli.
Laura
@Marius Saya ingin menambahkan produk dalam troli dengan opsi on the fly menghasilkan tanpa menambahkan opsi produk di sisi admin bagaimana mungkin
Pushpendra Singh
4

Mengaitkan pada jawaban Marius, berikut adalah sesuatu yang saya buat:

Saya memiliki pengontrol khusus yang menangani konfigurasi jenis produk khusus. Pengontrol ini ditambahkan additional_optionssaat menambahkan ke keranjang.

// My_Module_CartController::addToCartAction
// Get your product model
$product = $this->getProduct();

// Create options
$options = array();
$options['my_option'] = array(
    'label' => 'My Label',
    'value' => 'my_value'
);

$cartRequest = array(
    'product' => $product->getId(),
    'qty' => '1'
);

$cart = Mage::getModel('checkout/cart');
$cart->init();

// Add options
$product->addCustomOption('additional_options', serialize($options));

// Add to cart
$cart->addProduct($product, $cartRequest);
$cart->save();

Dalam pengamat di acara tersebut sales_convert_quote_item_to_order_item, saya kemudian mengambil additional_optionsdan menetapkan sebagai opsi pada item pesanan:

// My_Module_Model_Order_Observer::convertQuoteToOrder(Varien_Event_Observer $o)
// Get quote and order items
$orderItem = $o->getEvent()->getOrderItem();
$quoteItem = $o->getEvent()->getItem();

// Get serialized options set on product earlier
$myOptions = $item->getProduct()->getCustomOption('additional_options')->getValue();

// Add these options into the order item's options
$options = $orderItem->getProductOptions();
$options['additional_options'] = unserialize($myOptions);
$orderItem->setProductOptions($options);

return $this;

Dengan menggunakan additional_optionsAnda tidak perlu khawatir tentang berbagai blok / templat memberikan opsi (meskipun Anda mungkin lebih suka format yang diubah) karena blok ini akan memanggil $options['additional_options']Lihat Di Sini

pspahn
sumber