Magento 2 fieldset.xml; kopiuj pola z wyceny na zamówienie

11

Stworzyłem niestandardowy model, aby utworzyć zamówienie z oferty; Korzystam z fieldset.xml, aby skopiować niestandardowe kody na zamówienie. Utworzyłem niestandardowe kolumny zarówno w wycenie, jak i w porządku z pasującymi polami. Po złożeniu zamówienia wartości są przechowywane w niestandardowych polach wyceny, ale nie są kopiowane na zamówienie. Poniżej znajduje się mój plik 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>

Co jeszcze muszę zrobić?

Abhimanyu Singh
źródło
wyczyściłeś pamięć podręczną?
Marius
tak, wyczyściłem pamięć podręczną i wygenerowałem oba, a następnie dane pól niestandardowych nie są kopiowane z oferty na zamówienie
Abhimanyu Singh
Każde rozwiązanie tego
Abhimanyu Singh
Dodaj <? Xml version = "1.0"?> W tym kodzie. Brakuje czegoś
Ramki,

Odpowiedzi:

10

Jeśli spojrzysz na aktualną bazę kodu magento2.1, zauważysz, że w folderze moduleName / etc znajduje się plik fieldset.xml z poleceniem kopiowania informacji z jednej tabeli do drugiej. Jednak to NIE działa. Jeśli przyjrzysz się bliżej, zauważysz również , że jest obserwator, który robi dokładnie to samo. Spójrz na https://github.com/magento/magento2/issues/5823

Aby skopiować z tabeli wyceny * na zamówienie *, musisz użyć obserwatora i / lub wtyczki.

W swoim niestandardowym module events.xml dodaj

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

Następnie

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

Aby skopiować element z quote_item do order_item, wydaje się, że magento usunął najlepszego obserwatora, aby uzyskać zadanie, które było sales_convert_quote_item_to_order_item. Spójrz na ten przykład, który powinien pomóc Ci skopiować pole z quote_item do tabeli order_item. Jak „dodać do koszyka” produkt z niestandardowym polem wprowadzania i zapisać go w bazie danych?

Renon Stewart
źródło
Jeśli zaszedłeś tak daleko, równie dobrze możesz skorzystać z usługi kopiowania ...
LM_Fielding
@LM_Fielding możesz to zobaczyć w mojej odpowiedzi, jak możesz tego użyć z usługą kopiowania
warch
to nie działa z adresem zamówienia. Utworzone zamówienie utworzy nowy wiersz dla nowego obiektu adresu zamówienia. na przykład moje niestandardowe dane są wstawiane do adresu zamówienia o numerze ID 500, nowe zamówienie będzie korzystało z adresu 501.
Doni Wibowo
8

Odpowiedź Renona Stewarta bardzo mi pomogła, ale mogłem to poprawić dzięki oficjalnej dokumentacji dewelopera Magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

W niestandardowym module events.xml dodaj:

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

I w 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
źródło