คัดลอกตัวเลือกที่กำหนดเองแบบไดนามิกเพื่อพูดรายการสั่งซื้อรายการ


13

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

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

info_buyRequestแต่เมื่อผมสั่งซื้อตัวเลือกที่เลือกจะถูกบันทึกไว้เฉพาะใน มีวิธีให้บันทึกเช่นเดียวกับตัวเลือกผลิตภัณฑ์ที่สร้างขึ้นในผู้ดูแลระบบหรือไม่

คำตอบ:


6

ฉันทำสิ่งที่คล้ายกัน แต่ไม่มาก อาจช่วยได้ งานของฉันคือการมีช่องทำเครื่องหมายบนหน้าแต่ละผลิตภัณฑ์ที่เรียกว่า
gift wrapหากตรวจสอบแล้วทีมขายจะทราบว่าห่อผลิตภัณฑ์ (พวกเขามีเพียงตัวเลือกห่อเดียว)
ดังนั้นฉันจึงทำสิ่งนี้เพื่อให้สามารถพอร์ตwrapค่าช่องทำเครื่องหมายจากผลิตภัณฑ์เพื่อเสนอราคาการสั่งซื้อ (ฉันสามารถใช้ตัวเลือกที่กำหนดเองได้ แต่มันก็น่าเกลียดที่จะเพิ่มหนึ่งตัวเลือกในผลิตภัณฑ์ไม่กี่พันรายการ)

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

ฉันเขียนMage_Catalog_Helper_Product_Configuration::getCustomOptionsผู้ช่วยใหม่เพื่อบอก Magento ว่าตัวเลือกของฉันมีความสำคัญและควรปฏิบัติแยกต่างหาก

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

ด้วยเหตุผลเดียวกันกับที่ฉันเขียนใหม่Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsดังนั้นตัวเลือกของฉันจะปรากฏในรถเข็น

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

และคอลัมน์ชื่อผู้ดูแลระบบสำหรับตารางรายการสั่งซื้อ:

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

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

$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.

แค่นั้นแหละ. ฉันหวังว่าคุณจะได้ประโยชน์จากมัน


ที่ฉันมีปัญหาคือการได้รับตัวเลือก เมื่อฉันโทร $ item-> getOptionByCode ('license_code') ฉันจะได้รับ null ตัวเลือกของฉันไม่ปรากฏขึ้นเมื่อฉันเรียกสิ่งต่อไปนี้: $ helper = Mage :: helper ('catalog / product_configuration'); $ options = $ helper-> getCustomOptions ($ quoteItem); คุณตั้งค่าตัวเลือก 'wrap' อย่างไร
ลอร่า

@laura ฉันจะตรวจสอบว่าฉันพลาดบางสิ่งบางอย่างและกลับไปหาคุณ
Marius

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

ฉันสิ้นสุดการแยกวิเคราะห์คำขอซื้อหลังจากทั้งหมด ปัญหาคือตัวเลือกที่ฉันตั้งค่าในบล็อกรหัสเดิมของฉันไม่ได้รับการถ่ายโอนไปยังรายการใบเสนอราคาเลยนอกคำขอซื้อ
Laura

@Marius ฉันต้องการที่จะเพิ่มสินค้าลงตะกร้าด้วยตัวเลือกสร้างทันทีโดยไม่ต้องเพิ่มตัวเลือกผลิตภัณฑ์ในด้านผู้ดูแลระบบว่าเป็นไปได้อย่างไร
Pushpendra Singh

4

เมื่อตอบคำถามของ Marius นี่คือสิ่งที่ฉันคิดไว้:

ฉันมีคอนโทรลเลอร์แบบกำหนดเองที่จัดการการกำหนดค่าประเภทผลิตภัณฑ์ที่กำหนดเอง ตัวควบคุมนี้เพิ่มadditional_optionsในระหว่างการสั่งซื้อ

// 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();

ในผู้สังเกตการณ์เหตุการณ์sales_convert_quote_item_to_order_itemฉันก็คว้าadditional_optionsและตั้งค่าเป็นตัวเลือกในรายการสั่งซื้อ:

// 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;

เมื่อใช้additional_optionsคุณไม่ต้องกังวลเกี่ยวกับบล็อก / แม่แบบต่าง ๆ ที่แสดงตัวเลือก (แม้ว่าคุณอาจต้องการรูปแบบที่เปลี่ยนแปลง) เนื่องจากบล็อกเหล่านี้จะเรียก$options['additional_options']ดูที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.