Magento 2 fieldset.xml; คัดลอกฟิลด์จากคำพูดไปยังการสั่งซื้อ


11

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

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:DataObject/etc/fieldset.xsd">
<scope id="global">
    <!--quote convert to order-->
    <fieldset id="sales_convert_quote">            
        <field name="preorder_number">
            <aspect name="to_order" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order" />
        </field>
        <field name="reference_number">
            <aspect name="to_order" />
        </field>
    </fieldset>
    <!--quote item convert to order item-->
    <fieldset id="quote_convert_item">
        <field name="preorder_number">
            <aspect name="to_order_item" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order_item" />
        </field>
        <field name="reference_number">
            <aspect name="to_order_item" />
        </field>
    </fieldset>
</scope>

ฉันต้องทำอะไรอีก


คุณล้างแคชหรือไม่
Marius

ใช่ฉันล้างแคชและสร้างทั้งสองแล้วข้อมูลในฟิลด์ที่กำหนดเองจะไม่คัดลอกจากอัญประกาศตามคำสั่ง
Abhimanyu Singh

ทางออกสำหรับเรื่องนี้
Abhimanyu Singh

โปรดเพิ่ม <? xml version = "1.0"?> ใน code.i สิ่งที่ขาดหายไป
Ramki

คำตอบ:


10

หากคุณดูที่ฐานรหัส magento2.1 ปัจจุบันคุณจะสังเกตเห็นว่าในโฟลเดอร์moduleName / etcมีfieldset.xmlพร้อมคำสั่งเพื่อคัดลอกข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่ง อย่างไรก็ตามสิ่งนี้ไม่ทำงาน หากคุณมองใกล้ ๆ คุณจะสังเกตเห็นว่ามีผู้สังเกตการณ์ที่ทำสิ่งเดียวกัน ดูที่ https://github.com/magento/magento2/issues/5823

ในการคัดลอกจาก quote * to order * table คุณจะต้องใช้ผู้สังเกตการณ์และ / หรือปลั๊กอิน

ใน Module events.xml ที่กำหนดเองของคุณเพิ่ม

 <event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

แล้วก็

<?php

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * List of attributes that should be added to an order.
     *
     * @var array
     */
    private $attributes = [
        'field_1_name_here',
        'field_2_name_here',
        'field_...._here'
    ];


    /**

     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        foreach ($this->attributes as $attribute) {
            if ($quote->hasData($attribute)) {
                $order->setData($attribute, $quote->getData($attribute));
            }
        }

        return $this;
    }
}

ในการคัดลอกรายการจาก quote_item เพื่อ order_item, sales_convert_quote_item_to_order_itemวีโอไอพีดูเหมือนจะมีการออกสังเกตการณ์ที่ดีที่สุดเพื่อให้ได้งานซึ่งเป็น ดูตัวอย่างนี้ที่จะช่วยคุณคัดลอกฟิลด์จาก quote_item ไปยังตาราง order_item วิธี "เพิ่มสินค้าลงตะกร้า" ผลิตภัณฑ์ที่มีฟิลด์ป้อนข้อมูลที่กำหนดเองและบันทึกลงในฐานข้อมูลได้อย่างไร


หากคุณเดินทางมาไกลขนาดนี้คุณอาจใช้บริการถ่ายเอกสาร ...
LM_Fielding

@LM_Fielding คุณสามารถเห็นมันในคำตอบของฉันว่าคุณสามารถใช้สิ่งนี้กับบริการถ่ายสำเนาได้อย่างไร
warch

นี่ไม่ได้ผลกับที่อยู่ในการสั่งซื้อ คำสั่งซื้อที่สร้างขึ้นจะสร้างแถวใหม่สำหรับวัตถุที่อยู่คำสั่งซื้อใหม่ สำหรับ exmaple ข้อมูลที่กำหนดเองของฉันถูกแทรกไปยังที่อยู่ในการสั่งซื้อด้วย ID 500 คำสั่งซื้อใหม่จะใช้ที่อยู่ 501
Doni Wibowo

8

คำตอบของ Renon Stewart ช่วยฉันได้มาก แต่ฉันสามารถปรับปรุงด้วยเอกสารนักพัฒนาคุณภาพเยี่ยมอย่างเป็นทางการ ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

ใน Module events.xml ที่กำหนดเองของคุณเพิ่ม:

<event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

และใน saveOrderBeforeSalesModelQuoteObserver.php:

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * @var \Magento\Framework\DataObject\Copy
     */
    protected $objectCopyService;


    /**
     * @param \Magento\Framework\DataObject\Copy $objectCopyService
     */
    public function __construct(
        \Magento\Framework\DataObject\Copy $objectCopyService
    )
    {
        $this->objectCopyService = $objectCopyService;
    }

    /**
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        $this->objectCopyService->copyFieldsetToTarget('sales_convert_quote', 'to_order', $quote, $order);

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