Magento 2 fieldset.xml; скопировать поля из цитаты в заказ


11

Я создал пользовательскую модель для создания заказа из цитаты; Я использую fieldset.xml для копирования пользовательских кодов цитат на заказ. Я создал пользовательские столбцы в кавычках и порядке с соответствующими полями. При размещении заказа значения сохраняются в пользовательских полях цитаты, но не копируются в заказ. Ниже мой 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>

Что еще мне нужно сделать?


ты очистил кеш?
Мариус

да, я очистил кеш и генерацию обоих, тогда также данные пользовательских полей не копируются из цитаты в порядок
Абхиманью Сингх

Любое решение для этого
Абхиманью Сингх

Пожалуйста, добавьте <? Xml version = "1.0"?> В этот файл code.i, который отсутствует
Ramki

Ответы:


10

Если вы посмотрите на текущую кодовую базу magento2.1, то заметите, что в папке moduleName / etc есть файл fieldset.xml с командой для копирования информации из одной таблицы в другую. Однако это НЕ работает. Если вы посмотрите поближе, вы также заметите, что есть наблюдатель, который делает то же самое. Посмотрите на https://github.com/magento/magento2/issues/5823

Для копирования из таблицы * в заказ * вам потребуется использовать наблюдателя и / или плагин.

В свой пользовательский модуль events.xml добавьте

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

затем

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

Чтобы скопировать элемент из quote_item в order_item, magento, похоже, удалил лучшего наблюдателя, чтобы получить работу, которая была sales_convert_quote_item_to_order_item. Посмотрите на этот пример, который должен помочь вам скопировать поле из quote_item в таблицу order_item. Как «добавить в корзину» товар с настраиваемым полем ввода и сохранить его в базе данных?


Если вы дошли до этого места, вы можете также использовать службу копирования ...
LM_Fielding

@LM_Fielding вы можете увидеть в моем ответе , как вы могли бы использовать это с сервисом копирования
warch

это не работает адрес заказа. Созданный заказ создаст новую строку для нового объекта адреса заказа. Например, мои заказные данные вставляются в адрес заказа с идентификатором 500, новый заказ будет использовать адрес 501.
Дони Вибово

8

Ответ Ренона Стюарта мне очень помог, но я мог бы улучшить его с помощью официальной документации разработчика magento ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

В свой пользовательский модуль events.xml добавьте:

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

И в 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;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.