Magento 2 fieldset.xml; salin bidang dari kutipan ke pesanan

11

Saya telah membuat model khusus untuk membuat pesanan dari penawaran; Saya menggunakan fieldset.xml untuk menyalin kode kustom kutipan untuk memesan. Saya telah membuat kolom khusus dalam kutipan dan pesanan dengan bidang yang cocok. Ketika pesanan ditempatkan, nilai-nilai disimpan di kolom kustom harga tetapi tidak menyalin ke pesanan. Di bawah ini adalah fieldset.xml saya

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

Apa lagi yang perlu saya lakukan?

Abimanyu Singh
sumber
apakah Anda menghapus cache?
Marius
ya saya membersihkan cache dan menghasilkan keduanya, kemudian juga data bidang khusus tidak menyalin dari kutipan ke pesanan
Abhimanyu Singh
Solusi apa pun untuk ini
Abhimanyu Singh
Silakan tambahkan <? Xml version = "1.0"?> Dalam hal code.i yang hilang
Ramki

Jawaban:

10

Jika Anda melihat pada basis kode Magento2.1 saat ini, Anda akan melihat bahwa di folder moduleName / etc ada fieldset.xml dengan perintah untuk menyalin informasi dari satu tabel ke yang lain. Namun ini JANGAN bekerja. Jika Anda melihat lebih dekat, Anda juga akan melihat bahwa ada pengamat yang melakukan hal yang persis sama. Lihatlah https://github.com/magento/magento2/issues/5823

Untuk menyalin dari quote * to order * table Anda harus menggunakan pengamat dan / atau plugin.

Dalam tambahan events.xml Modul khusus Anda

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

Kemudian

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

Untuk menyalin item dari quote_item ke order_item, magento tampaknya telah menghapus pengamat terbaik untuk mendapatkan pekerjaan yang sebelumnya sales_convert_quote_item_to_order_item. Lihatlah contoh ini yang akan membantu Anda menyalin bidang dari tabel quote_item ke order_item. Bagaimana cara "menambah keranjang" suatu produk dengan bidang input khusus dan menyimpannya ke Database?

Renon Stewart
sumber
Jika sejauh ini, Anda sebaiknya menggunakan layanan salin ...
LM_Fielding
@LM_Fielding Anda bisa melihatnya di jawaban saya bagaimana Anda bisa menggunakan ini dengan layanan fotokopi
warch
ini tidak berfungsi dari alamat pesanan. Pesanan yang dibuat akan membuat baris baru untuk objek alamat pesanan baru. untuk exmaple data khusus saya dimasukkan ke alamat pesanan dengan ID 500, pesanan baru akan menggunakan alamat 501.
Doni Wibowo
8

Jawaban Renon Stewart banyak membantu saya tetapi saya dapat memperbaikinya dengan dokumentasi pengembang magento resmi ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

Dalam events.xml Modul khusus Anda, tambahkan:

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

Dan di 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;
    }
}
warch
sumber