Magento 2 fieldset.xml; copier les champs du devis à la commande

11

J'ai créé un modèle personnalisé pour créer une commande à partir d'un devis; J'utilise fieldset.xml pour copier les codes personnalisés de devis à commander. J'ai créé des colonnes personnalisées dans les devis et les commandes avec des champs correspondants. Lorsque la commande est passée, les valeurs sont stockées dans des champs personnalisés de devis mais ne sont pas copiées dans la commande. Ci-dessous est mon 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>

Que dois-je faire d'autre?

Abhimanyu Singh
la source
avez-vous vidé le cache?
Marius
oui j'ai effacé le cache et la génération à la fois, puis les données des champs personnalisés ne sont pas copiées du devis à la commande
Abhimanyu Singh
Toute solution pour cela
Abhimanyu Singh
Veuillez ajouter <? Xml version = "1.0"?> Dans cette chose code.i qui manque
Ramki

Réponses:

10

Si vous jetez un œil à la base de code actuelle de magento2.1, vous remarquerez que dans le dossier moduleName / etc , il y a un fieldset.xml avec une commande pour copier les informations d'une table vers une autre. Cependant, cela ne fonctionne PAS. Si vous regardez de plus près, vous remarquerez également qu'un observateur fait exactement la même chose. Jetez un œil à https://github.com/magento/magento2/issues/5823

Pour copier du devis * au tableau de commande *, vous devrez utiliser un observateur et / ou un plugin.

Dans votre module events.xml personnalisé, ajoutez

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

Puis

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

Pour copier un élément de quote_item vers order_item, magento semble avoir supprimé le meilleur observateur pour obtenir le travail qui était sales_convert_quote_item_to_order_item. Jetez un œil à cet exemple qui devrait vous aider à copier le champ de quote_item vers la table order_item. Comment "ajouter au panier" un produit avec un champ de saisie personnalisé et l'enregistrer dans la base de données?

Renon Stewart
la source
Si vous êtes arrivé jusqu'ici, vous pourriez aussi bien utiliser le service de copie ...
LM_Fielding
@LM_Fielding vous pouvez voir dans ma réponse comment vous pouvez l'utiliser avec le service de copie
warch
cela ne fonctionne pas de l'adresse de commande. La commande créée créera une nouvelle ligne pour un nouvel objet d'adresse de commande. pour exmaple mes données personnalisées sont insérées à l'adresse de commande avec ID 500, la nouvelle commande utilisera l'adresse 501.
Doni Wibowo
8

La réponse de Renon Stewart m'a beaucoup aidé mais j'ai pu l'améliorer avec la documentation officielle du développeur magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

Dans votre module events.xml personnalisé, ajoutez:

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

Et dans le 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
la source