आइटम, ऑर्डर आइटम को उद्धृत करने के लिए गतिशील कस्टम विकल्पों की नकल करना


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को यह बताने के लिए सहायक को फिर से लिखा है कि मेरा विकल्प महत्वपूर्ण है और इसे अलग से व्यवहार करना चाहिए

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

बस। मुझे आशा है कि आपको इससे कुछ उपयोगी मिल सकता है।


जहां मुझे परेशानी हो रही है वहां विकल्प मिल रहा है। जब मैं $ आइटम कहता हूं-> getOptionByCode ('लाइसेंस_कोड') मैं शून्य हो रहा हूं। जब मैं निम्नलिखित कॉल करता हूं तो मेरे विकल्प भी दिखाई नहीं देते हैं: $ सहायक = दाना :: सहायक ('कैटलॉग / product_configuration); $ विकल्प = $ सहायक-> getCustomOptions ($ quotItem); आप 'रैप' विकल्प कैसे सेट कर रहे हैं?
लौरा

@Laura। अगर मैं कुछ याद किया और आप को वापस पाने के लिए जाँच करता हूँ।
मेरियस

@Laura। मैंने दोबारा जाँच की और यह मुझे कुछ याद आया। मेरे लिए, गिफ्टवॉर्पिंग जोड़ने का विकल्प केवल कार्ट में दिखाया गया है। मैं भूल गया कि मैंने इसे बदल दिया क्योंकि ग्राहक ने इसका अनुरोध किया था। मैंने कस्टम एक्शन में उपयोग किए गए कोड के साथ उत्तर को अपडेट किया। हो सकता है कि आप इसे कार्ट इवेंट पर्यवेक्षक में जोड़ सकते हैं।
मेरियस

मैंने आखिरकार खरीदने के अनुरोध को समाप्त कर दिया। समस्या यह है कि जो विकल्प मैं अपने मूल कोड ब्लॉक में सेट कर रहा हूं, वे खरीद अनुरोध के बाहर बोली मद में स्थानांतरित नहीं हो रहे थे।
लौरा

@ मार्स मैं फ्लाइट जनरेट के साथ कार्ट में प्रोडक्ट जोड़ना चाहता हूं, बिना एड ऑप्शन के प्रोडक्ट ऑप्शन में कैसे संभव हो सकता है
पुष्पेन्द्र सिंह

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']यहां बुलाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.