Magento 2 fieldset.xml; copia i campi dal preventivo all'ordine


11

Ho creato un modello personalizzato per creare l'ordine dal preventivo; Sto usando fieldset.xml per copiare i codici personalizzati delle quote da ordinare. Ho creato colonne personalizzate sia in preventivo che in ordine con campi corrispondenti. Quando l'ordine viene inserito, i valori vengono archiviati nei campi personalizzati del preventivo ma non copiati nell'ordine. Di seguito è il mio 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>

Cos'altro devo fare?


hai cancellato la cache?
Marius

sì, ho cancellato la cache e la generazione di entrambi, quindi anche i dati dei campi personalizzati non vengono copiati dal preventivo all'ordine
Abhimanyu Singh

Qualsiasi soluzione per questo
Abhimanyu Singh

Aggiungi <? Xml version = "1.0"?> In quella cosa code.i mancante
Ramki

Risposte:


10

Se dai un'occhiata all'attuale base di codice magento2.1 noterai che nella cartella moduleName / etc c'è un fieldset.xml con il comando per copiare le informazioni da una tabella all'altra. Tuttavia, questo NON funziona. Se dai un'occhiata più da vicino noterai anche che esiste un osservatore che fa la stessa cosa esatta. Dai un'occhiata a https://github.com/magento/magento2/issues/5823

Per copiare dalla tabella preventivo * per ordinare * dovrai utilizzare un osservatore e / o un plugin.

Nel modulo personalizzato events.xml aggiungi

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

Poi

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

Per copiare l'oggetto da quote_item a order_item, Magento sembra aver rimosso il miglior osservatore per ottenere il lavoro che era sales_convert_quote_item_to_order_item. Dai un'occhiata a questo esempio che dovrebbe aiutarti a copiare il campo da quote_item alla tabella order_item. Come "aggiungere al carrello" un prodotto con campo di input personalizzato e salvarlo nel database?


Se sei arrivato così lontano, potresti anche utilizzare il servizio di copia ...
LM_Fielding

@LM_Fielding puoi vederlo nella mia risposta come potresti usarlo con il servizio di copia
warch,

questo non funziona con l'indirizzo dell'ordine. L'ordine creato creerà una nuova riga per un nuovo oggetto indirizzo ordine. per esempio i miei dati personalizzati vengono inseriti per ordinare l'indirizzo con ID 500, il nuovo ordine utilizzerà l'indirizzo 501.
Doni Wibowo,

8

La risposta di Renon Stewart mi ha aiutato molto, ma ho potuto migliorarlo con la documentazione ufficiale per gli sviluppatori di magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

Nel modulo personalizzato events.xml aggiungi:

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

E nel 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;
    }
}
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.