Sipariş magento2'ye yerleştirildikten sonra özel verileri fiyattan siparişe ve sipariş öğesine kopyalayın


15

Magento 2'de özel bir indirime sahip özel bir modül inşa ediyorum. Alıntıdan alıntıyı, alıntı öğesini siparişe ve sipariş öğesine kopyalamaya çalışıyorum. Magento 1'de şöyle beyan ederim 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> 

ve özel indirim tutarım tablolara kopyalandı: sales_flat_orderve sales_flat_order_itembeklendiği gibi.

Magento 2'de, fieldset.xmlşu kodla bir dosya adı oluşturdum :

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

ama başarı yok. Magento 2'de çalışmasını sağlamak için başka ne yapmam gerekir? Lütfen bana yardım eder misiniz?

Yanıtlar:


7

Alan kümelerinin artık özel veri alanlarını taşımak için bir seçenek olmadığı anlaşılıyor. Bunun kasıtlı veya diğer değişikliklerin yan etkisi olup olmadığı net değildir.

Ödemelerde de aynı sorunla karşılaştım. Bunu izledim \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;
}

Bu veri kopyalamak fieldset işleyerek başlar $objectiçine $paymentDatadizide, ama sonra içine diziyi beslemeleri \Magento\Framework\Api\DataObjectHelper::populateWithArray()aslında (burada, hedef nesne üzerinde değerleri ayarlamak için $orderPayment).

Veri dizisini doğrudan Magento 1'deki gibi nesneye eklemek yerine DataObjectHelper, her bir tuşa karşılık gelen 'set__' veya 'setIs__' yöntemlerini arar ve ardından bu yöntemleri değerle çağırır. Böyle bir yöntem yoksa, veri anahtarı tamamen atlanır.

Teklif adresleri ve kalemleri sırasıyla \Magento\Quote\Model\Quote\Address\ToOrderAddressve şekilde aynı şekilde işlenir \Magento\Quote\Model\Quote\Item\ToOrderItem.

Bu ne anlama geliyor?

  1. Bir tuşa karşılık gelen nesnede önceden ayarlanmış bir yöntem mevcut değilse, anahtarı bir alan kümesine eklemek yeterli değildir.
  2. Özel alanların tekliften siparişe kopyalanmasının, gerekli ayarlayıcı yöntem (ler) i eklemek için hedef sınıfın geçersiz kılınması (bağımlılık enjeksiyonu yoluyla) veya sales_model_service_quote_submit_beforeverileri manuel olarak kopyalamak isteyen gözlemcilerin kullanılması gerektiği görülüyor .

Teklif modülünün quote_convert_addressve dahil olmak üzere kendi alan kümeleri tanımlandığını unutmayın quote_convert_item. Sales_convert_quote * alan kümelerinin artık kullanımda olduğu görülmemektedir.


: - Ben senin cevabından kafa karıştırıcı, ben sadece teklif altında sipariş hareketli veri durdu magebnto2 kaldırıldı, sonra benim özel alanlar için nasıl? kodu gönderebilir misin, cevabımda çekirdek magento sorunu için düzeltme verdim (yukarıdaki cevabımı kontrol et), bu sorun için başka bir çözümün var mı?
Pradeep Kumar

herhangi bir çözüm aldın mı
jibin george

5

Magento2 satış teklifinden siparişe
dönüştürür ve öğesi çalışmaz

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

Sipariş ve sipariş kaleminden faturaya, gönderiye dönüştürün ve Creditmemo Magento2'de iyi çalışıyor

Aşağıda, alıntıyı magento2'de siparişe dönüştürmek için düzeltme, diğer tüm değeri alıntıdan sipariş tablosuna taşımak için olay yazmanız gerekir. 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 (satır no 428)

önce

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

sendQuote () fonksiyonunda aşağıdaki kodu ekleyin

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

app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (lin no around 78)

sonra

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

in function convert () aşağıdaki kodu ekle

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

iyi çalışacaktır, ancak
yukarıda bahsettiğim gibi emin olun fieldset.xml özel modülünüzde olmalı ve ayrıca ürün magento1.x'teki gibi ürün sepete eklendiğinde ürün özelliğini ayarlamak için olay yazmalısınız ve ayrıca özel dosyalanmış ayarlamanız gerekir teklif tablosunda sadece teklif ve öğeden siparişe ve öğesine kopyalayacaktır


Pradeep. Hala desteklenmiyor mu?
awavi

0

Bunu inceledim ve Magento \ GiftMessage modülünde, alanların (fieldset.xml) dönüşümü de var:

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

Siparişe ekleme şekilleri gözlemci yoluyladır (etc / frontend / events.xml'de kayıtlı Observer / SalesEventQuoteSubmitBeforeObserver.php):

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

    return $this;
}

Yani, sanırım, bu dikkate alınması gereken uygun bir seçenek.


Magento 2'nin uzantı özniteliklerini kullanarak siparişler, ödemeler vb. İçin değerleri otomatik olarak kopyalaması mümkündür. Bununla birlikte, order_items için uzantı öznitelikleri oluşturmak, verinin quote_item ve order_item nesnelerine yüklenmesini ve kaydedilmesini sağlamak için özel gözlemciler gerektirir. Bu nedenle, ilgili tablolara bir sütun eklemek ve verileri kopyalamak için tek bir gözlemci yöntemi kullanmak için yukarıda önerilen yaklaşımı izlemek çok daha basittir. Maalesef Magento, v2'deki genişletilebilirliği o kadar esnek hale getirmeye çalıştı ki, zamanımıza değer vermek için çok fazla kazan plakası gerektiriyor.
Robert Egginton

@ epson121: bu durumda events.xml dosyasını paylaşabilir misiniz?
Ipsita Rout

@IpsitaRout varsayılan Magento kodunu (app / code / Magento / GiftMessage / etc / frontend / events.xml) kontrol edebilir veya bu alıntıyı kontrol edebilirsiniz:<event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.