Copia i dati personalizzati dal preventivo all'ordine e ordina l'articolo una volta che l'ordine è stato inserito in magento2


15

Sto costruendo un modulo personalizzato in Magento 2 che ha uno sconto personalizzato. Sto cercando di copiare lo sconto dal preventivo, quotare l'articolo per ordinare e ordinare l'articolo. Nel magento 1, dichiaro in config.xmlquesto modo:

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

e il mio importo di sconto personalizzato è stato copiato nelle tabelle: sales_flat_ordere sales_flat_order_itemcome previsto.

In Magento 2, ho creato un nome file: fieldset.xmlcon questo codice:

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

ma non c'è successo. Cos'altro devo fare in Magento 2 per farlo funzionare? Ragazzi, per favore, potete aiutarmi?

Risposte:


7

Sembra che i set di campi non siano più un'opzione per spostare i campi di dati personalizzati. Non è chiaro se questo è intenzionale o un effetto collaterale di altri cambiamenti.

Ho appena riscontrato lo stesso problema con i pagamenti. L'ho rintracciato in \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;
}

Si inizia elaborando il fieldset copiare dati da $objectnella $paymentDatamatrice, ma poi alimenta tale matrice in \Magento\Framework\Api\DataObjectHelper::populateWithArray()effettivamente impostare i valori sull'oggetto di destinazione (qui $orderPayment).

Anziché aggiungere direttamente l'array di dati all'oggetto come in Magento 1, DataObjectHelpercerca i metodi 'set__' o 'setIs__' corrispondenti a ciascuna chiave, quindi chiama tali metodi con il valore. Se tale metodo non esiste, la chiave dati viene ignorata completamente.

Gli indirizzi e gli articoli di preventivo vengono elaborati nello stesso modo, rispettivamente \Magento\Quote\Model\Quote\Address\ToOrderAddresse \Magento\Quote\Model\Quote\Item\ToOrderItemrispettivamente.

Cosa significa?

  1. L'aggiunta della chiave a un fieldset non è sufficiente, a meno che non esista già un metodo set sull'oggetto corrispondente a quella chiave.
  2. Sembra che la copia dei campi personalizzati dal preventivo all'ordine richiederà o l'override della classe target per aggiungere i metodi setter necessari (tramite iniezione di dipendenza) o l'utilizzo di osservatori come la sales_model_service_quote_submit_beforecopia manuale dei dati.

Si noti inoltre che il modulo preventivo ha i propri set di campi definiti, inclusi quote_convert_addresse quote_convert_item. Non sembra che i campi sales_convert_quote * siano più in uso.


: - Sono confuso dalla tua risposta, ho appena spostato i dati dal preventivo all'ordine è stato rimosso in magebnto2, quindi come posso farlo per i miei campi personalizzati? puoi pubblicare il codice, nella mia risposta ho dato una correzione per il problema principale di Magento (controlla la mia risposta sopra), hai qualche altra soluzione per questo problema?
Pradeep Kumar,

hai trovato una soluzione
Jibin George,

5

Le vendite di Magento2 si convertono dal preventivo all'ordine e il suo articolo non funziona Il
preventivo viene convertito dal modello al preventivo all'ordine e il suo articolo viene spostato dal modulo di vendita al modulo del preventivo in Magento2 Ma non funziona

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

convertire dall'ordine e ordinare l'articolo in fattura, spedizione e Creditmemo funziona bene in Magento2

di seguito è riportata la correzione per convertire il preventivo in ordine in magento2 altrimenti è necessario scrivere un evento per spostare tutto il valore archiviato dal preventivo alla tabella degli ordini 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 (linea n. 428)

prima

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

nella funzione submitQuote () aggiungi sotto il codice

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

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

dopo

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

nella funzione convert () aggiungi sotto il codice

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

funzionerà bene, ma
assicurati che, come ho già detto, fieldset.xml dovrebbe essere presente nel tuo modulo personalizzato e inoltre dovresti scrivere un evento per impostare l'attributo del prodotto una volta che il prodotto è stato aggiunto al carrello come in magento1.x e inoltre dovresti impostare un file personalizzato nella tabella dei preventivi, solo questo verrà copiato dal preventivo e dall'articolo all'ordine e dal suo articolo


Pradeep. Non è ancora supportato?
Awavi

0

Ho esaminato questo, e nel modulo Magento \ GiftMessage, c'è anche la conversione dei campi (fieldset.xml):

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

Il modo in cui lo aggiungono all'ordine è tramite osservatore (Observer / SalesEventQuoteSubmitBeforeObserver.php, registrato in etc / frontend / events.xml):

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

    return $this;
}

Quindi, immagino, questa è un'opzione praticabile da considerare.


È possibile fare in modo che Magento 2 copi automaticamente i valori per ordini, pagamenti ecc. Utilizzando gli attributi di estensione. Tuttavia, la creazione di attributi di estensione per order_items richiede osservatori personalizzati per gestire il caricamento e il salvataggio dei dati negli oggetti quote_item e order_item. Per questo motivo, è molto più semplice seguire l'approccio suggerito sopra per aggiungere una colonna alle tabelle pertinenti e utilizzare un singolo metodo di osservazione per copiare i dati. Purtroppo, Magento ha cercato di rendere l'estensibilità in v2 così flessibile che richiede troppa caldaia per far valere il nostro tempo.
Robert Egginton,

@ epson121: potresti condividere il tuo events.xml in questo caso?
Ipsita Rout,

@IpsitaRout puoi controllare il codice Magento predefinito (app / code / Magento / GiftMessage / etc / frontend / events.xml) o controllare questo estratto: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.