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.