Copiez les données personnalisées du devis dans la commande et l'article de commande une fois la commande passée dans magento2

15

Je crée un module personnalisé dans magento 2 qui a une remise personnalisée. J'essaie de copier la remise du devis, de l'article de devis sur la commande et de l'article de commande. Dans magento 1, je déclare config.xmlcomme ceci:

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

et mon montant de remise personnalisé a été copié dans les tableaux: sales_flat_orderet sales_flat_order_itemcomme prévu.

Dans Magento 2, j'ai créé un nom de fichier: fieldset.xmlavec ce 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>

mais il n'y a pas de succès. Que dois-je faire d'autre dans magento 2 pour que cela fonctionne? Pouvez-vous m'aider s'il vous plaît?

FireKirin
la source

Réponses:

7

Il semble que les ensembles de champs ne soient plus une option pour déplacer des champs de données personnalisés. Pas clair si c'est intentionnel ou un effet secondaire d'autres changements.

Je viens de rencontrer le même problème avec les paiements. Je l'ai retracée à \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;
}

Il commence par traiter l'ensemble de champs pour copier des données depuis $objectdans le $paymentDatatableau, puis alimente ce tableau \Magento\Framework\Api\DataObjectHelper::populateWithArray()pour définir réellement les valeurs sur l'objet cible (ici, $orderPayment).

Plutôt que d'ajouter directement le tableau de données à l'objet comme dans Magento 1, DataObjectHelperrecherche les méthodes 'set__' ou 'setIs__' correspondant à chaque clé, puis appelle ces méthodes avec la valeur. Si une telle méthode n'existe pas, la clé de données est entièrement ignorée.

Les adresses de devis et les articles sont traités de la même manière, dans \Magento\Quote\Model\Quote\Address\ToOrderAddresset \Magento\Quote\Model\Quote\Item\ToOrderItemrespectivement.

Qu'est-ce que ça veut dire?

  1. L'ajout de la clé à un jeu de champs n'est pas suffisant, sauf si une méthode set existe déjà sur l'objet correspondant à cette clé.
  2. Il semble que la copie de champs personnalisés de devis à commande nécessite soit de remplacer la classe cible pour ajouter la ou les méthodes de définition nécessaires (via l'injection de dépendances), soit d'utiliser des observateurs comme sales_model_service_quote_submit_beforepour copier les données manuellement.

Notez également que le module de devis a ses propres ensembles de champs définis, y compris quote_convert_addresset quote_convert_item. Il ne semble pas que les ensembles de champs sales_convert_quote * soient plus utilisés.

Ryan Hoerr
la source
: - Je suis déroutant de votre réponse, je viens de comprendre que le déplacement des données du devis à la commande a été supprimé dans magebnto2, alors comment le faire pour mes champs personnalisés? pouvez-vous poster le code, dans ma réponse j'ai donné un correctif pour le problème principal de magento (vérifiez ma réponse ci-dessus), avez-vous une autre solution pour ce problème?
Pradeep Kumar
avez-vous eu une solution
jibin george
5

Les ventes de Magento2 convertissent de devis en commande et son article ne fonctionne pas
devis convertit le modèle de devis en commande et son article est déplacé du module de vente en module de devis dans Magento2 Mais cela ne fonctionne pas

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

convertir de la commande et du poste de commande en facture, expédition et Creditmemo fonctionne bien dans Magento2

ci-dessous est le correctif pour convertir le devis en commande dans magento2 sinon vous devez écrire l'événement pour déplacer toutes les valeurs déposées du devis vers la table de commande 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 (ligne n ° 428)

avant

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

dans la fonction submitQuote () ajoutez le code ci-dessous

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

changement dans app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (lin no 78 environ)

après

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

dans la fonction convert () ajoutez le code ci-dessous

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

cela fonctionnera bien, mais
assurez-vous que, comme je le mentionne ci-dessus, fieldset.xml doit être présent dans votre module personnalisé et vous devez également écrire un événement pour définir l'attribut du produit une fois le produit ajouté au panier comme dans magento1.x et vous devez également définir un fichier personnalisé dans le tableau des devis alors seulement il copiera du devis et de l'article à la commande et son article

Pradeep Kumar
la source
Pradeep. N'est-il toujours pas pris en charge?
awavi
0

J'ai étudié cela, et dans le module Magento \ GiftMessage, il y a aussi la conversion des champs (fieldset.xml):

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

La façon dont ils l'ajoutent à la commande est via Observer (Observer / SalesEventQuoteSubmitBeforeObserver.php, enregistré dans etc / frontend / events.xml):

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

    return $this;
}

Donc, je suppose que c'est une option viable à considérer.

epson121
la source
Il est possible que Magento 2 copie automatiquement les valeurs des commandes, des paiements, etc. en utilisant des attributs d'extension. Cependant, la création d'attributs d'extension pour order_items nécessite des observateurs personnalisés afin de gérer le chargement et l'enregistrement des données dans les objets quote_item et order_item. Pour cette raison, il est beaucoup plus simple de suivre l'approche suggérée ci-dessus pour ajouter une colonne aux tableaux pertinents et utiliser une méthode d'observation unique pour copier les données. Malheureusement, Magento a essayé de rendre l'extensibilité de la v2 si flexible qu'elle nécessite trop de passe-partout pour que cela en vaille la peine.
Robert Egginton
@ epson121: pourriez-vous partager votre events.xml dans ce cas?
Ipsita Rout
@IpsitaRout vous pouvez vérifier le code Magento par défaut (app / code / Magento / GiftMessage / etc / frontend / events.xml) ou consulter cet extrait: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121