Salin data khusus dari kutipan ke pesanan dan pesan item setelah pesanan ditempatkan di magento2

15

Saya sedang membangun modul khusus di Magento 2 yang memiliki diskon khusus. Saya mencoba untuk menyalin diskon dari kutipan, item kutipan untuk memesan dan memesan barang. Di magento 1, saya menyatakan config.xmlseperti ini:

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

dan jumlah diskon khusus saya disalin ke tabel: sales_flat_orderdan sales_flat_order_itemseperti yang diharapkan.

Di Magento 2, saya membuat nama file: fieldset.xmldengan kode ini:

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

tetapi tidak ada kesuksesan. Apa lagi yang perlu saya lakukan di magento 2 untuk membuatnya berfungsi? Bisakah kalian bantu saya?

FireKirin
sumber

Jawaban:

7

Tampaknya bidang tidak lagi menjadi pilihan untuk memindahkan bidang data khusus. Tidak jelas apakah ini disengaja, atau efek samping dari perubahan lain.

Saya hanya mengalami masalah yang sama dengan pembayaran. Saya melacaknya kembali ke \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;
}

Ini dimulai dengan memproses fieldset untuk menyalin data dari $objectke dalam $paymentDataarray, tetapi kemudian memasukkan array itu ke dalam \Magento\Framework\Api\DataObjectHelper::populateWithArray()untuk benar-benar mengatur nilai-nilai pada objek target (di sini,$orderPayment ).

Daripada langsung menambahkan array data ke objek seperti di Magento 1, DataObjectHelper cari metode 'set__' atau 'setIs__' yang terkait dengan setiap kunci, dan kemudian panggil metode tersebut dengan nilainya. Jika metode seperti itu tidak ada, kunci data dilewati seluruhnya.

Alamat kutipan dan barang diproses dengan cara yang sama, di \Magento\Quote\Model\Quote\Address\ToOrderAddressdan \Magento\Quote\Model\Quote\Item\ToOrderItemmasing - masing.

Apa artinya?

  1. Menambahkan kunci ke bidang tidak cukup, kecuali metode yang ditetapkan sudah ada pada objek yang sesuai dengan kunci itu.
  2. Tampaknya menyalin bidang khusus dari kutipan ke pesanan akan mengharuskan baik mengesampingkan kelas target untuk menambahkan metode penyetel yang diperlukan (melalui injeksi ketergantungan), atau menggunakan pengamat ingin sales_model_service_quote_submit_beforemenyalin data secara manual.

Juga perhatikan bahwa modul kutipan memiliki bidang yang ditentukan, termasuk quote_convert_addressdan quote_convert_item. Tidak terlihat bahwa bidang penjualan * konversi_quote sedang digunakan lagi.

Ryan Hoerr
sumber
: - saya bingung dengan jawaban Anda, saya hanya di bawah data pemindahan berdiri dari kutipan ke pesanan telah dihapus di magebnto2, lalu bagaimana cara melakukannya untuk bidang khusus saya? dapatkah Anda memposting kode, dalam jawaban saya saya berikan perbaikan untuk masalah inti magento (lihat jawaban saya di atas), apakah Anda punya solusi lain untuk masalah ini?
Pradeep Kumar
apakah Anda mendapatkan solusi
jibin george
5

Konversi penjualan Magento2 dari kutipan ke pemesanan dan itemnya tidak berfungsi.
Kutip

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

mengkonversi dari pesanan dan pesanan barang ke faktur, pengiriman dan Creditmemo berfungsi dengan baik di Magento2

di bawah ini adalah perbaikan untuk kutipan konversi ke pesanan di magento2 lain Anda perlu menulis acara untuk memindahkan semua nilai yang diajukan dari kutipan ke tabel pesanan 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>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php (baris no 428)

sebelum

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

dalam fungsi submitQuote () tambahkan kode di bawah ini

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

perubahan dalam aplikasi \ kode \ Magento \ Penawaran \ Model \ Penawaran \ Item \ ToOrderItem.php (tidak ada sekitar 78)

setelah

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

dalam fungsi convert () tambahkan kode di bawah ini

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

itu akan berfungsi dengan baik tetapi
pastikan seperti yang saya sebutkan di atas fieldset.xml harus ada di modul kustom Anda dan juga Anda harus menulis acara untuk mengatur atribut produk setelah produk ditambahkan ke keranjang seperti di magento1.x dan juga Anda harus mengatur custom diajukan dalam tabel kutipan maka hanya itu yang akan disalin dari kutipan dan item sesuai pesanan dan itemnya

Pradeep Kumar
sumber
Pradeep. Apakah masih belum didukung?
awavi
0

Saya telah melihat ini, dan dalam modul Magento \ GiftMessage, ada juga konversi bidang (fieldset.xml):

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

Cara mereka menambahkannya ke pesanan adalah melalui pengamat (Pengamat / SalesEventQuoteSubmitBeforeObserver.php, terdaftar di etc / frontend / events.xml):

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

    return $this;
}

Jadi, saya kira, ini adalah opsi yang layak dipertimbangkan.

epson121
sumber
Dimungkinkan untuk memiliki Magento 2 secara otomatis menyalin nilai untuk pesanan, pembayaran dll dengan menggunakan atribut ekstensi. Namun, membuat atribut ekstensi untuk order_items membutuhkan pengamat khusus untuk menangani pemuatan dan penyimpanan data ke objek quote_item dan order_item. Karena itu, jauh lebih mudah untuk mengikuti pendekatan yang disarankan di atas untuk menambahkan kolom ke tabel yang relevan dan menggunakan metode pengamat tunggal untuk menyalin data. Sayangnya, Magento telah mencoba membuat ekstensibilitas dalam v2 begitu fleksibel sehingga membutuhkan terlalu banyak pelat untuk membuatnya layak untuk waktu kita.
Robert Egginton
@ epson121: dapatkah Anda membagikan acara Anda.xml dalam hal ini?
Ipsita Rout
@IpsitaRout Anda dapat memeriksa kode Magento default (app / code / Magento / GiftMessage / etc / frontend / events.xml) atau periksa kutipan ini: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121