Kopieren Sie benutzerdefinierte Daten aus dem Angebot in die Bestellung und bestellen Sie den Artikel, sobald die Bestellung in magento2 eingegangen ist

15

Ich erstelle ein benutzerdefiniertes Modul in Magento 2, das einen benutzerdefinierten Rabatt hat. Ich versuche, den Rabatt von Angebot, Angebotsposition zu Bestellung und Bestellposition zu kopieren. In Magento 1 erkläre ich in config.xmletwa so:

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

und mein benutzerdefinierter Rabattbetrag wurde in Tabellen kopiert: sales_flat_orderund sales_flat_order_itemwie erwartet.

In Magento 2 habe ich einen Dateinamen erstellt: fieldset.xmlmit diesem Code:

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

aber es gibt keinen Erfolg. Was muss ich in Magento 2 noch tun, damit es funktioniert? Könnt ihr mir bitte helfen?

FireKirin
quelle

Antworten:

7

Anscheinend sind Feldsätze keine Option mehr, um benutzerdefinierte Datenfelder zu verschieben. Nicht klar, ob dies beabsichtigt ist oder eine Nebenwirkung anderer Änderungen ist.

Ich bin gerade auf das gleiche Problem mit Zahlungen gestoßen. Ich habe das zurückverfolgt auf \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;
}

Zunächst wird das Fieldset verarbeitet, um Daten $objectin das $paymentDataArray zu kopieren. Anschließend wird das Array in das Array eingespeist, \Magento\Framework\Api\DataObjectHelper::populateWithArray()um die Werte für das Zielobjekt (hier, $orderPayment) festzulegen .

Anstatt DataObjectHelperdas Datenarray wie in Magento 1 direkt zum Objekt hinzuzufügen, wird nach den Methoden 'set__' oder 'setIs__' gesucht, die den einzelnen Schlüsseln entsprechen, und diese Methoden werden dann mit dem Wert aufgerufen. Wenn eine solche Methode nicht existiert, wird der Datenschlüssel vollständig übersprungen.

Quote Adressen und Gegenstände werden auf die gleiche Art und Weise, in verarbeitet \Magento\Quote\Model\Quote\Address\ToOrderAddressund \Magento\Quote\Model\Quote\Item\ToOrderItemjeweils.

Was bedeutet das?

  1. Das Hinzufügen des Schlüssels zu einem Fieldset ist nicht ausreichend, es sei denn, für das Objekt, das diesem Schlüssel entspricht, ist bereits eine Set-Methode vorhanden.
  2. Es scheint, dass das Kopieren benutzerdefinierter Felder von Angebot zu Auftrag entweder das Überschreiben der Zielklasse zum Hinzufügen der erforderlichen Setter-Methode (n) (über Abhängigkeitsinjektion) oder die Verwendung von Beobachtern sales_model_service_quote_submit_beforezum manuellen Kopieren der Daten erfordert .

Beachten Sie auch, dass für das Angebotsmodul eigene Feldsätze definiert sind, einschließlich quote_convert_addressund quote_convert_item. Es scheint, dass die Felder "sales_convert_quote *" nicht mehr verwendet werden.

Ryan Hoerr
quelle
: - Ich bin verwirrend von Ihrer Antwort, ich habe gerade verstanden, dass bewegliche Daten vom Angebot zum Auftrag in magebnto2 entfernt wurden. Wie mache ich das für meine benutzerdefinierten Felder? Kannst du den Code posten, in meiner Antwort habe ich das Problem mit dem Kern von Magento behoben (siehe meine Antwort oben)? Hast du eine andere Lösung für dieses Problem?
Pradeep Kumar
Hast
5

Magento2-Verkauf konvertiert von Angebot zu Bestellung und sein Artikel funktioniert nicht
Angebot Modell für Angebot zu Bestellung konvertieren und sein Artikel wird in Magento2 vom Verkaufsmodul zum Angebotsmodul verschoben Aber es funktioniert nicht

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

Umstellung von Bestellung und Bestellposition auf Rechnung, Versand und Creditmemo funktioniert in Magento2 einwandfrei

Im Folgenden finden Sie das Update zum Konvertieren des Angebots in eine Bestellung in Magento2. Andernfalls müssen Sie ein Ereignis schreiben, um den gesamten abgelegten Wert aus dem Angebot in die Bestellungstabelle Magento2a \ app \ code \ Sugarcode \ Test \ etc \ fieldset.xml zu verschieben

    <?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 (Zeile Nr. 428)

Vor

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

Fügen Sie in der Funktion submitQuote () den folgenden Code hinzu

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

Änderung in App \ Code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (Lin-Nr. ca. 78)

nach

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

in function convert () füge den folgenden Code hinzu

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

es wird gut funktionieren, aber
stellen Sie sicher, wie oben erwähnt, dass fieldset.xml in Ihrem benutzerdefinierten Modul vorhanden sein sollte und Sie sollten auch ein Ereignis schreiben, um das Produktattribut festzulegen, sobald das Produkt wie in magento1.x in den Warenkorb gelegt wurde In der Angebotstabelle wird dann nur von Angebot und Artikel zu Bestellung und seinem Artikel kopiert

Pradeep Kumar
quelle
Pradeep. Wird es immer noch nicht unterstützt?
Awavi
0

Ich habe dies untersucht und im Magento \ GiftMessage-Modul gibt es auch eine Konvertierung von Feldern (fieldset.xml):

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

Die Art und Weise, wie sie es zur Bestellung hinzufügen, erfolgt über Observer (Observer / SalesEventQuoteSubmitBeforeObserver.php, registriert in etc / frontend / events.xml):

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

    return $this;
}

Ich denke, dies ist eine realisierbare Option.

epson121
quelle
Es ist möglich, dass Magento 2 automatisch Werte für Bestellungen, Zahlungen usw. mithilfe von Erweiterungsattributen kopiert. Das Erstellen von Erweiterungsattributen für order_items erfordert jedoch benutzerdefinierte Beobachter, um das Laden und Speichern von Daten in die quote_item- und order_item -Objekte zu handhaben. Aus diesem Grund ist es viel einfacher, dem oben vorgeschlagenen Ansatz zu folgen, um eine Spalte zu den relevanten Tabellen hinzuzufügen und die Daten mithilfe einer einzelnen Beobachtermethode zu kopieren. Leider hat Magento versucht, die Erweiterbarkeit in v2 so flexibel zu gestalten, dass es zu viel Boilerplate benötigt, um unsere Zeit wert zu sein.
Robert Egginton
@ epson121: könntest du in diesem Fall deine events.xml teilen?
Ipsita Rout
@IpsitaRout Sie können den Standard-Magento-Code (app / code / Magento / GiftMessage / etc / frontend / events.xml) oder den folgenden Auszug überprüfen: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121