Magento 2 fieldset.xml; Kopieren Sie die Felder vom Angebot in die Bestellung

11

Ich habe ein benutzerdefiniertes Modell erstellt, um eine Bestellung aus dem Angebot zu erstellen. Ich verwende fieldset.xml, um benutzerdefinierte Angebotscodes auf Bestellung zu kopieren. Ich habe benutzerdefinierte Spalten in Angebot und Reihenfolge mit übereinstimmenden Feldern erstellt. Wenn eine Bestellung aufgegeben wird, werden Werte in benutzerdefinierten Angebotsfeldern gespeichert, jedoch nicht in die Bestellung kopiert. Unten ist meine 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>

Was muss ich noch tun?

Abhimanyu Singh
quelle
Hast du den Cache geleert?
Marius
Ja, ich habe sowohl den Cache als auch die Generierung geleert, dann werden auch die Daten der benutzerdefinierten Felder nicht vom Angebot in die Bestellung kopiert
Abhimanyu Singh
Jede Lösung dafür
Abhimanyu Singh
Bitte fügen Sie <? Xml version = "1.0"?> In die fehlende code.i-Sache ein
Ramki

Antworten:

10

Wenn Sie sich die aktuelle magento2.1-Codebasis ansehen, werden Sie feststellen, dass sich im Ordner moduleName / etc eine fieldset.xml mit dem Befehl befindet, Informationen von einer Tabelle in eine andere zu kopieren. Dies funktioniert jedoch NICHT. Wenn Sie genauer hinschauen, werden Sie auch feststellen, dass es einen Beobachter gibt, der genau das Gleiche tut. Schauen Sie sich https://github.com/magento/magento2/issues/5823 an

Um von der Angebots- * zur Bestell * -Tabelle zu kopieren, müssen Sie einen Beobachter und / oder ein Plugin verwenden.

Fügen Sie in Ihrem benutzerdefinierten Modul events.xml hinzu

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

Dann

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

Um den Artikel von quote_item nach order_item zu kopieren, hat magento anscheinend den besten Beobachter entfernt, um den Job zu erhalten, der war sales_convert_quote_item_to_order_item. Schauen Sie sich dieses Beispiel an, das Ihnen beim Kopieren des Felds von quote_item in die Tabelle order_item helfen soll. Wie kann ich ein Produkt mit einem benutzerdefinierten Eingabefeld in den Warenkorb legen und in der Datenbank speichern?

Renon Stewart
quelle
Wenn Sie so weit gekommen sind, können Sie auch den Kopierservice nutzen ...
LM_Fielding
@LM_Fielding Sie können es in meiner Antwort sehen, wie Sie dies mit dem Kopierservice verwenden könnten
Warch
Dies funktioniert nicht mit der Bestelladresse. Die erstellte Bestellung erstellt eine neue Zeile für ein neues Bestelladressobjekt. Zum Beispiel werden meine benutzerdefinierten Daten in die Bestelladresse mit der ID 500 eingefügt. In der neuen Bestellung wird die Adresse 501 verwendet.
Doni Wibowo
8

Die Antwort von Renon Stewart hat mir sehr geholfen, aber ich konnte sie mit der offiziellen Magento-Entwicklerdokumentation verbessern ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html ).

Fügen Sie in Ihrem benutzerdefinierten Modul events.xml Folgendes hinzu:

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

Und in der Datei 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
quelle