Skopiuj dane niestandardowe z wyceny do zamówienia i zamów element po złożeniu zamówienia w magento2

15

Buduję moduł niestandardowy w Magento 2, który ma niestandardową zniżkę. Próbuję skopiować rabat z oferty, wycenić przedmiot na zamówienie i zamówić przedmiot. W magento 1 deklaruję w config.xmlnastępujący sposób:

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

a moja niestandardowa kwota rabatu została skopiowana do tabel: sales_flat_orderi sales_flat_order_itemzgodnie z oczekiwaniami.

W Magento 2 stworzyłem nazwę pliku: fieldset.xmlz tym kodem:

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

ale nie ma sukcesu. Co jeszcze muszę zrobić w Magento 2, aby działało? Czy możecie mi pomóc?

FireKirin
źródło

Odpowiedzi:

7

Wygląda na to, że zestawy pól nie są już opcją przenoszenia niestandardowych pól danych. Nie jest jasne, czy jest to celowe, czy efekt uboczny innych zmian.

Właśnie spotkałem ten sam problem z płatnościami. Prześledziłem to z powrotem do \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;
}

Zaczyna przez przetwarzanie zestaw pól skopiować dane $objectdo $paymentDatatablicy, ale potem karmi tej tablicy do \Magento\Framework\Api\DataObjectHelper::populateWithArray()faktycznie ustawić wartości od obiektu docelowego (tutaj $orderPayment).

Zamiast bezpośrednio dodawać tablicę danych do obiektu, jak w Magento 1, DataObjectHelperszuka metod „set__” lub „setIs__” odpowiadających każdemu kluczowi, a następnie wywołuje te metody z wartością. Jeśli taka metoda nie istnieje, klucz danych jest całkowicie pomijany.

Adresy wyceny i elementy są przetwarzane w ten sam sposób, odpowiednio \Magento\Quote\Model\Quote\Address\ToOrderAddressi \Magento\Quote\Model\Quote\Item\ToOrderItem.

Co to znaczy?

  1. Dodanie klucza do zestawu pól nie jest wystarczające, chyba że istnieje już metoda zestawu dla obiektu odpowiadającego temu kluczowi.
  2. Wygląda na to, że skopiowanie niestandardowych pól z wyceny na zamówienie będzie wymagało albo przesłonięcia klasy docelowej, aby dodać niezbędne metody ustawiające (poprzez wstrzyknięcie zależności), albo użycia obserwatorów, takich jak sales_model_service_quote_submit_beforeręczne kopiowanie danych.

Zauważ też, że moduł wyceny ma zdefiniowane własne zestawy pól, w tym quote_convert_addressi quote_convert_item. Wygląda na to, że zestawy pól sales_convert_quote * nie są już używane.

Ryan Hoerr
źródło
: - mylę się z twoją odpowiedzią, właśnie zrozumiałem, że przenoszenie danych z oferty do zamówienia zostało usunięte w magebnto2, a potem jak to zrobić dla moich pól niestandardowych? czy możesz napisać kod, w mojej odpowiedzi podałem poprawkę dotyczącą podstawowego problemu z magento (sprawdź moją odpowiedź powyżej), czy masz jakieś inne rozwiązanie tego problemu?
Pradeep Kumar,
czy dostałeś jakieś rozwiązanie
jibin George
5

Sprzedaż Magento2 konwertuje z oferty na zamówienie, a jej produkt nie działa
oferta Konwertuj model oferty z oferty na zamówienie, a jej produkt jest przenoszony z modułu sprzedaży do modułu oferty w Magento2 Ale nie działa

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

Konwertuj z zamówienia i pozycji zamówienia na fakturę, wysyłkę i Creditmemo działa dobrze w Magento2

poniżej znajduje się poprawka do konwersji wyceny na zamówienie w magento2, w przeciwnym razie musisz napisać zdarzenie, aby przenieść całą zapisaną wartość z wyceny do tabeli zamówień 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 (linia nr 428)

przed

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

w funkcji submQuote () dodaj poniższy kod

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

zmiana w aplikacji \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (nr linii około 78)

po

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

w funkcji convert () dodaj poniższy kod

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

będzie działał dobrze, ale
upewnij się, że jak wspomniałem powyżej, fieldset.xml powinien być w twoim module niestandardowym, a także powinieneś napisać zdarzenie, aby ustawić atrybut produktu, gdy produkt zostanie dodany do koszyka, jak w magento1.x, a także powinieneś ustawić niestandardowe pole w tabeli wycen tylko wtedy skopiuje wycenę i przedmiot na zamówienie oraz jego przedmiot

Pradeep Kumar
źródło
Pradeep Czy nadal nie jest obsługiwany?
awavi
0

Patrzyłem na to, aw module Magento \ GiftMessage jest także konwersja pól (fieldset.xml):

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

Dodają go do zamówienia za pośrednictwem obserwatora (Observer / SalesEventQuoteSubmitBeforeObserver.php, zarejestrowanego w etc / frontend / events.xml):

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

    return $this;
}

Myślę, że jest to realna opcja do rozważenia.

epson121
źródło
Możliwe jest, aby Magento 2 automatycznie kopiował wartości dla zamówień, płatności itp. Za pomocą atrybutów rozszerzenia. Jednak tworzenie atrybutów rozszerzenia dla elementów zamówienia wymaga niestandardowych obserwatorów, aby obsłużyć ładowanie i zapisywanie danych w obiektach quote_item i order_item. Z tego powodu znacznie łatwiej jest zastosować powyższe podejście, aby dodać kolumnę do odpowiednich tabel i użyć jednej metody obserwatora do skopiowania danych. Niestety, Magento próbowało uczynić rozszerzalność w v2 tak elastyczną, że wymaga ona zbyt wiele płyt kotłowych, aby była warta naszego czasu.
Robert Egginton
@ epson121: czy możesz w tym przypadku udostępnić plik events.xml?
Ipsita Rout,
@IpsitaRout możesz sprawdzić domyślny kod Magento (app / code / Magento / GiftMessage / etc / frontend / events.xml) lub sprawdzić ten fragment: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121