คัดลอกข้อมูลที่กำหนดเองจากคำพูดไปยังการสั่งซื้อและรายการสั่งซื้อเมื่อสั่งซื้อสินค้าใน magento2


15

ฉันกำลังสร้างโมดูลที่กำหนดเองใน magento 2 ที่มีส่วนลดแบบกำหนดเอง ฉันกำลังพยายามคัดลอกส่วนลดจากใบเสนอราคาเสนอราคาไปยังใบสั่งและรายการสั่งซื้อ ในวีโอไอพี 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>

แต่ก็ไม่ประสบความสำเร็จ ฉันต้องทำอะไรในวีโอไอพี 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;
}

มันเริ่มต้นด้วยการประมวลผล fieldset เพื่อคัดลอกข้อมูลจาก$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. การเพิ่มคีย์ไปยัง fieldset ไม่เพียงพอยกเว้นว่ามีวิธีการตั้งค่าอยู่แล้วบนวัตถุที่สอดคล้องกับคีย์นั้น
  2. ปรากฏว่าการคัดลอกฟิลด์ที่กำหนดเองจาก quote to order จะต้องมีการแทนที่คลาสเป้าหมายเพื่อเพิ่มเมธอด setter (ผ่านการพึ่งพาการฉีด) หรือการใช้ผู้สังเกตการณ์ต้องการsales_model_service_quote_submit_beforeคัดลอกข้อมูลด้วยตนเอง

นอกจากนี้ทราบว่าโมดูลอ้างมี fieldsets ของตัวเองที่กำหนดไว้รวมทั้งและquote_convert_address quote_convert_itemไม่ปรากฏว่ามีการใช้ชุดเขตข้อมูล sales_convert_quote * อีกต่อไป


: - ฉันสับสนจากคำตอบของคุณฉันเพิ่งย้ายข้อมูลจากการอ้างถึงคำสั่งที่ยืนอยู่ถูกลบใน magebnto2 แล้ววิธีการทำสำหรับเขตข้อมูลที่กำหนดเองของฉัน? คุณสามารถโพสต์รหัสได้หรือไม่ในคำตอบของฉันฉันได้แก้ไขปัญหา core magento (ตรวจสอบคำตอบของฉันด้านบน) คุณมีวิธีแก้ไขปัญหาอื่นสำหรับปัญหานี้หรือไม่?
Pradeep Kumar

คุณได้รับการแก้ปัญหาใด ๆ
jibin george

5

Magento2 sales ทำการแปลงจาก quote เป็น order และสินค้าไม่ทำงาน
quote quote แปลง model สำหรับ quote เป็น order และสินค้าถูกย้ายจากโมดูลขายไปเป็นโมดูของโมดูลใน 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> 

แปลงจากคำสั่งซื้อและรายการสั่งซื้อเป็นใบแจ้งหนี้การจัดส่งและ Creditmemo ทำงานได้ดีใน Magento2

ด้านล่างคือการแก้ไขสำหรับการแปลง quote เป็น order ใน magento2 มิฉะนั้นคุณต้องเขียน event เพื่อย้ายค่าที่ยื่นทั้งหมดจาก quote ไปเป็น table magento2a \ app \ code \ Sugarcode \ Test \ etc \ fieldset.xml

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


แอพ \ 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);

การเปลี่ยนแปลงในแอป \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (ไม่มีหลินประมาณ 78)

หลังจาก

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

ในฟังก์ชั่นแปลง () เพิ่มรหัสด้านล่าง

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

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


Pradeep ยังไม่รองรับหรือไม่
awavi

0

ฉันเคยดูเรื่องนี้แล้วและใน Magento \ GiftMessage โมดูลนอกจากนี้ยังมีการแปลงฟิลด์ (fieldset.xml):

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

วิธีที่พวกเขาเพิ่มลงในการสั่งซื้อคือผ่านผู้สังเกตการณ์ (Observer / SalesEventQuoteSubmitBeforeObserver.php ลงทะเบียนใน etc / frontend / events.xml):

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

    return $this;
}

ดังนั้นฉันคิดว่านี่เป็นตัวเลือกที่เหมาะสมสำหรับการพิจารณา


เป็นไปได้ที่ Magento 2 จะคัดลอกค่าสำหรับคำสั่งซื้อการชำระเงินและอื่น ๆ โดยอัตโนมัติโดยใช้แอตทริบิวต์ส่วนขยาย อย่างไรก็ตามการสร้างแอ็ตทริบิวต์ส่วนขยายสำหรับ order_items ต้องการผู้สังเกตการณ์แบบกำหนดเองเพื่อจัดการการโหลดและการบันทึกข้อมูลไปยังวัตถุ quote_item และ order_item ด้วยเหตุนี้จึงง่ายกว่ามากที่จะปฏิบัติตามวิธีที่แนะนำข้างต้นเพื่อเพิ่มคอลัมน์ลงในตารางที่เกี่ยวข้องและใช้วิธีสังเกตการณ์เดี่ยวเพื่อคัดลอกข้อมูลข้าม น่าเสียดายที่วีโอไอพีได้พยายามทำให้การเพิ่มความยืดหยุ่นใน v2 นั้นยืดหยุ่นได้นั้นมันต้องใช้หม้อไอน้ำมากเกินไปเพื่อให้คุ้มค่ากับเวลาของเรา
Robert Egginton

@ epson121: คุณแบ่งปัน events.xml ของคุณในกรณีนี้ได้ไหม?
Ipsita Rout

@IpsitaRout คุณสามารถตรวจสอบรหัส Magento เริ่มต้น (แอพ / รหัส / Magento / GiftMessage / ฯลฯ / ส่วนหน้า / events.xml) หรือตรวจสอบข้อความที่ตัดตอนมานี้: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.