Magento2 में ऑर्डर करने के बाद बोली से ऑर्डर और ऑर्डर आइटम तक कस्टम डेटा कॉपी करें


15

मैं Magento 2 में एक कस्टम मॉड्यूल का निर्माण कर रहा हूं जिसमें एक कस्टम छूट है। मैं उद्धरण से उद्धरण की नकल करने की कोशिश कर रहा हूं, आइटम को ऑर्डर और ऑर्डर करने के लिए उद्धरण आइटम। Magento 1 में, मैं config.xmlइस तरह से घोषणा करता हूं :

<fieldsets>
    <sales_convert_quote_address>
        <custom_discount_amount><to_order>*</to_order></custome_discount_amount>
        <base_custom_discount_amount><to_order>*</to_order></base_custome_discount_amount>
    </sales_convert_quote_address>
    <sales_convert_quote_item>
        <custome_discount_amount><to_order_item>*</to_order_item></custome_discount_amount>
        <base_custom_discount_amount><to_order_item>*</to_order_item></base_custom_discount_amount>
    </sales_convert_quote_item>
</fieldsets> 

और मेरी कस्टम छूट राशि को तालिकाओं में कॉपी किया गया था: sales_flat_orderऔर sales_flat_order_itemजैसा कि अपेक्षित था।

Magento 2 में, मैंने एक फ़ाइल नाम बनाया: fieldset.xmlइस कोड के साथ:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
<scope id="global">
    <fieldset id="sales_convert_quote_item">
        <field name="custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
    </fieldset>         
      <fieldset id="sales_convert_quote_address">
        <field name="custom_discount_amount">
            <aspect name="to_order" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order" />
        </field>
    </fieldset>   
</scope>

लेकिन कोई सफलता नहीं मिली। इसे बनाने के लिए मुझे Magento 2 में और क्या करने की आवश्यकता है? क्या तुम लोग मेरी मदद कर सकते हो?

जवाबों:


7

ऐसा प्रतीत होता है कि फ़ील्ड अब कस्टम डेटा फ़ील्ड को चारों ओर ले जाने का विकल्प नहीं है। यह स्पष्ट नहीं है कि क्या यह जानबूझकर है, या अन्य परिवर्तनों का साइड-इफेक्ट है।

मैं सिर्फ भुगतान के साथ एक ही समस्या में भाग गया। मैंने उसे वापस पता लगाया \Magento\Quote\Model\Quote\Payment\ToOrderPayment::convert():

public function convert(Payment $object, $data = [])
{
    $paymentData = $this->objectCopyService->getDataFromFieldset(
        'quote_convert_payment',
        'to_order_payment',
        $object
    );

    $orderPayment = $this->orderPaymentFactory->create();
    $this->dataObjectHelper->populateWithArray(
        $orderPayment,
        array_merge($paymentData, $data),
        '\Magento\Sales\Api\Data\OrderPaymentInterface'
    );
    $orderPayment->setAdditionalInformation(
        array_merge(
            $object->getAdditionalInformation(),
            [Substitution::INFO_KEY_TITLE => $object->getMethodInstance()->getTitle()]
        )
    );
    // set directly on the model
    $orderPayment->setCcNumber($object->getCcNumber());
    $orderPayment->setCcCid($object->getCcCid());

    return $orderPayment;
}

यह सरणी $objectमें से डेटा को कॉपी करने के लिए फ़ील्डसेट को संसाधित करने से शुरू होता है $paymentData, लेकिन फिर उस सरणी \Magento\Framework\Api\DataObjectHelper::populateWithArray()को वास्तव में लक्ष्य ऑब्जेक्ट (यहां, $orderPayment) पर मान सेट करने के लिए खिलाता है ।

Magento 1 के रूप में ऑब्जेक्ट में डेटा सरणी को सीधे जोड़ने के बजाय DataObjectHelper, प्रत्येक कुंजी के अनुरूप 'set__' या 'setIs__' विधियों की तलाश करता है, और फिर उन विधियों को मान के साथ कॉल करता है। यदि ऐसी विधि मौजूद नहीं है, तो डेटा कुंजी पूरी तरह से छोड़ दी जाती है।

उद्धरण पते और आइटम उसी तरह संसाधित किए जाते हैं, \Magento\Quote\Model\Quote\Address\ToOrderAddressऔर \Magento\Quote\Model\Quote\Item\ToOrderItemक्रमशः।

इसका क्या मतलब है?

  1. किसी फ़ील्ड में कुंजी जोड़ना तब तक पर्याप्त नहीं है, जब तक कि उस कुंजी के अनुरूप ऑब्जेक्ट पर कोई सेट विधि पहले से मौजूद न हो।
  2. ऐसा प्रतीत होता है कि बोली से ऑर्डर करने के लिए कस्टम फ़ील्ड की प्रतिलिपि करने के लिए आवश्यक सेटर विधि (एस) (निर्भरता इंजेक्शन के माध्यम से) को जोड़ने के लिए लक्ष्य वर्ग को ओवरराइड करने की आवश्यकता होगी, या पर्यवेक्षकों का उपयोग sales_model_service_quote_submit_beforeमैन्युअल रूप से डेटा कॉपी करना होगा।

यह भी ध्यान दें कि उद्धरण मॉड्यूल में अपने स्वयं के फ़ील्डसेट परिभाषित, सहित quote_convert_addressऔर हैं quote_convert_item। ऐसा प्रतीत नहीं होता है कि Sales_convert_quote * फ़ील्डसेट अब उपयोग में हैं।


: - मैं आपके उत्तर से भ्रमित हो रहा हूँ, मैं अभी तक magebnto2 में उद्धरण से ऑर्डर करने के लिए डेटा स्थानांतरित करने के लिए खड़ा था, फिर यह मेरे कस्टम फ़ील्ड के लिए कैसे करें? क्या आप कोड पोस्ट कर सकते हैं, मेरे जवाब में मैंने कोर मैगेंटो इश्यू (ऊपर मेरे उत्तर की जांच करें) के लिए फिक्स दिया, क्या आपके पास इस मुद्दे का कोई अन्य समाधान है?
प्रदीप कुमार

क्या आपको कोई समाधान मिला
जिबीन जॉर्ज

5

Magento2 की बिक्री बोली से ऑर्डर में परिवर्तित हो जाती है और इसका आइटम काम नहीं कर रहा है।
उद्धरण के लिए मॉडल को ऑर्डर करने के लिए कन्वर्ट करें और इसके आइटम को बिक्री मॉड्यूल से उद्धरण मॉड्यूल से Magento2 में ले जाया जाता है, लेकिन इसका काम नहीं हो रहा है

<fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset> 

Magento2 में ऑर्डर और ऑर्डर आइटम से इनवॉइस, शिपमेंट और क्रेडिटमेमो में परिवर्तित करना ठीक काम कर रहा है

नीचे मैगेंटो 2 में ऑर्डर करने के लिए कन्वर्ट कोटे के लिए ठीक किया गया है, अन्यथा आपको ईवेंट को टेबल से ऑर्डर टेबल मेजेंटो 2 ए \ एप \ कोड \ शूगरकोड / टेस्ट \ आदि \ फिल्ड.एक्सएमएल पर स्थानांतरित करने की आवश्यकता है।

    <?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset>         
        <fieldset id="sales_convert_order">
            <field name="custom_field">
                <aspect name="to_quote" />
                <aspect name="to_invoice" />
                <aspect name="to_shipment" />
                <aspect name="to_cm" />
            </field>
        </fieldset>        
        <fieldset id="sales_convert_order_item">
            <field name="custom_sku">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>            
        </fieldset>
    </scope>
</config>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php (पंक्ति संख्या 428)

इससे पहले

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

फ़ंक्शन में submitQuote () कोड नीचे जोड़ें

$order=$this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData);

एप्लिकेशन \ कोड \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php में परिवर्तन (लगभग कोई 78 नहीं)

उपरांत

$orderItem = $this->orderItemFactory->create();

फ़ंक्शन कन्वर्ट में () नीचे कोड जोड़ें

$this->objectCopyService->copyFieldsetToTarget('quote_convert_item', 'to_order_item', $item, $orderItem);

यह ठीक काम करेगा, लेकिन
सुनिश्चित करें कि जैसा कि मैंने कहा कि उपर्युक्त फ़ील्डसेट। xml में आप में होना चाहिए कस्टम मॉड्यूल और आपको उत्पाद की विशेषता सेट करने के लिए घटना लिखना चाहिए एक बार उत्पाद को Magento1.x की तरह कार्ट में जोड़ा जाता है और साथ ही आपको कस्टम दर्ज करना चाहिए उद्धरण तालिका में केवल तभी यह बोली और आइटम से ऑर्डर और उसके आइटम पर कॉपी होगी


प्रदीप। क्या यह अभी भी समर्थित नहीं है?
अववि

0

मैं इसे देख रहा हूं, और Magento \ GiftMessage मॉड्यूल में, फ़ील्ड्स (फ़ील्डसेट। Xml) का रूपांतरण भी है:

<fieldset id="sales_convert_quote_address">
    <field name="gift_message_id">
        <aspect name="to_order" />
    </field>
</fieldset>

जिस तरह से वे इसे ऑर्डर करने के लिए जोड़ते हैं वह ऑब्जर्वर (ऑब्जर्वर / सेल्सएवेंटक्वाओटसबमिटबियरऑवर्सऑब्जर्वर। एफपी, आदि / फ्रंटेंड / इवेंट्स.एक्सएमएल में पंजीकृत) के माध्यम से होता है:

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

तो, मुझे लगता है, यह विचार करने के लिए एक व्यवहार्य विकल्प है।


विस्तार विशेषताओं का उपयोग करके आदेशों, भुगतानों आदि के लिए स्वचालित रूप से Magento 2 को मानों की प्रतिलिपि बनाना संभव है। हालाँकि, ऑर्डर_इटीम्स के लिए एक्सटेंशन एट्रिब्यूट्स बनाने के लिए कस्टम ऑब्जर्वर की आवश्यकता होती है ताकि डेटा की लोडिंग और सेविंग को quot_item और order_item ऑब्जेक्ट्स में सहेजा जा सके। इस वजह से, संबंधित तालिकाओं में एक कॉलम जोड़ने के लिए ऊपर दिए गए दृष्टिकोण का पालन करना बहुत सरल है और डेटा को कॉपी करने के लिए एकल प्रेक्षक विधि का उपयोग करना चाहिए। अफसोस की बात है, Magento ने v2 में एक्स्टेंसिबिलिटी को इतना लचीला बनाने की कोशिश की है कि इसे हमारे समय के लायक बनाने के लिए बहुत अधिक बॉयलरप्लेट की आवश्यकता होती है।
रॉबर्ट एगिंटन

@ epson121: क्या आप इस मामले में अपनी घटनाओं को साझा कर सकते हैं।
इप्टा राउत जूल

@IpsitaRout आप डिफ़ॉल्ट Magento कोड (ऐप / कोड / Magento / GiftMessage / etc / frontend / event.xml) की जांच कर सकते हैं या इस अंश की जांच कर सकते हैं: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.