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"?> У той код.і речі, якої не вистачає
— Ramki

Відповіді:


10

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

Щоб скопіювати таблицю *, щоб замовити *, вам потрібно буде використовувати спостережник та / або плагін.

У свій власний модуль events.xml add

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

Щоб скопіювати елемент з quo_item в order_item, магенто, здається, видалив найкращого спостерігача, щоб отримати роботу, яка була sales_convert_quote_item_to_order_item. Погляньте на цей приклад, який повинен допомогти вам скопіювати поле з quo_item в таблицю order_item. Як "додати в кошик" продукт із спеціальним полем для введення та зберегти його в базі даних?


Якщо ви дійшли до цього часу, ви можете скористатися послугою копіювання ...
— LM_Fielding

@LM_Fielding ви можете побачити у моїй відповіді, як ви могли використовувати це за допомогою служби копіювання
— 1717

це не працює над адресою замовлення. Створений порядок створить новий рядок для нового об’єкта адреси замовлення. для прикладу мої спеціальні дані вставляються для адреси замовлення з ідентифікатором 500, у новому замовлення буде використовувати адресу 501.
— Доні Wibowo

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.