Magento 2 fieldset.xml; copiar campos da cotação para o pedido

11

Eu criei um modelo personalizado para criar pedidos a partir de cotações; Estou usando o fieldset.xml para copiar códigos personalizados de cotação para solicitar. Criei colunas personalizadas na cotação e na ordem com os campos correspondentes. Quando o pedido é feito, os valores são armazenados nos campos personalizados de cotação, mas não são copiados no pedido. Abaixo está o meu 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>

O que mais eu preciso fazer?

Abhimanyu Singh
fonte
você limpou o cache?
Marius
sim eu limpou o cache e geração de ambos, então também campos personalizados dados não está copiando a partir de citação para fim
Abhimanyu Singh
Qualquer solução para isso #
Abhimanyu Singh
Por favor, adicione <? Xml version = "1.0"?> Nessa coisa code.i que está faltando?
Ramki

Respostas:

10

Se você der uma olhada na base de código atual do magento2.1, notará que na pasta moduleName / etc existe um fieldset.xml com comando para copiar informações de uma tabela para outra. No entanto, isso NÃO funciona. Se você olhar mais de perto, também notará que existe um observador que faz exatamente a mesma coisa. Dê uma olhada em https://github.com/magento/magento2/issues/5823

Para copiar da tabela de cotação * para pedido *, você precisará usar um observador e / ou plugin.

No seu módulo events.xml personalizado, inclua

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

Então

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

Para copiar o item de quote_item para order_item, o magento parece ter removido o melhor observador para conseguir o trabalho que era sales_convert_quote_item_to_order_item. Dê uma olhada neste exemplo que deve ajudá-lo a copiar o campo da tabela quote_item para order_item. Como "adicionar ao carrinho" um produto com campo de entrada personalizado e salvá-lo no banco de dados?

Renon Stewart
fonte
Se você chegou até aqui, também pode usar o serviço de cópia ...
LM_Fielding
@LM_Fielding você pode vê-lo na minha resposta como você poderia usar isso com o serviço de cópia
warch
isso não funciona no endereço do pedido. O pedido criado criará uma nova linha para um novo objeto de endereço do pedido. por exemplo, meus dados personalizados são inseridos no endereço do pedido com o ID 500, o novo pedido usará o endereço 501.
Doni Wibowo
8

A resposta de Renon Stewart me ajudou muito, mas eu poderia melhorá-la com a documentação oficial do desenvolvedor do magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

No seu módulo customizado events.xml, adicione:

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

E no 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
fonte