Скопируйте пользовательские данные из цитаты в заказ и позицию заказа после размещения заказа в magento2

15

Я создаю пользовательский модуль в magento 2, который имеет пользовательскую скидку. Я пытаюсь скопировать скидку из цитаты, цитата товара на заказ и заказ товара. В magento 1 я заявляю config.xmlтак:

<fieldsets>
    <sales_convert_quote_address>
        <custom_discount_amount><to_order>*</to_order></custome_discount_amount>
        <base_custom_discount_amount><to_order>*</to_order></base_custome_discount_amount>
    </sales_convert_quote_address>
    <sales_convert_quote_item>
        <custome_discount_amount><to_order_item>*</to_order_item></custome_discount_amount>
        <base_custom_discount_amount><to_order_item>*</to_order_item></base_custom_discount_amount>
    </sales_convert_quote_item>
</fieldsets> 

и моя сумма скидки была скопирована в таблицы: sales_flat_orderи, sales_flat_order_itemкак и ожидалось.

В Magento 2 я создал имя файла: fieldset.xmlс этим кодом:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
<scope id="global">
    <fieldset id="sales_convert_quote_item">
        <field name="custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order_item" />
        </field>
    </fieldset>         
      <fieldset id="sales_convert_quote_address">
        <field name="custom_discount_amount">
            <aspect name="to_order" />
        </field>
        <field name="base_custom_discount_amount">
            <aspect name="to_order" />
        </field>
    </fieldset>   
</scope>

но успеха нет. Что еще мне нужно сделать в magento 2, чтобы это работало? Ребята, не могли бы вы мне помочь?

FireKirin
источник

Ответы:

7

Похоже, наборы полей больше не являются опцией для перемещения пользовательских полей данных. Не ясно, является ли это преднамеренным или побочным эффектом других изменений.

Я просто столкнулся с той же проблемой с платежами. Я проследил это до \Magento\Quote\Model\Quote\Payment\ToOrderPayment::convert():

public function convert(Payment $object, $data = [])
{
    $paymentData = $this->objectCopyService->getDataFromFieldset(
        'quote_convert_payment',
        'to_order_payment',
        $object
    );

    $orderPayment = $this->orderPaymentFactory->create();
    $this->dataObjectHelper->populateWithArray(
        $orderPayment,
        array_merge($paymentData, $data),
        '\Magento\Sales\Api\Data\OrderPaymentInterface'
    );
    $orderPayment->setAdditionalInformation(
        array_merge(
            $object->getAdditionalInformation(),
            [Substitution::INFO_KEY_TITLE => $object->getMethodInstance()->getTitle()]
        )
    );
    // set directly on the model
    $orderPayment->setCcNumber($object->getCcNumber());
    $orderPayment->setCcCid($object->getCcCid());

    return $orderPayment;
}

Он начинается с обработки набора полей для копирования данных $objectв $paymentDataмассив, но затем подает этот массив \Magento\Framework\Api\DataObjectHelper::populateWithArray()для фактической установки значений целевого объекта (здесь, $orderPayment).

Вместо непосредственного добавления массива данных к объекту, как в Magento 1, DataObjectHelperищет методы 'set__' или 'setIs__', соответствующие каждому ключу, а затем вызывает эти методы со значением. Если такой метод не существует, ключ данных пропускается полностью.

Цитата адрес и элементы обрабатываются таким же образом, в \Magento\Quote\Model\Quote\Address\ToOrderAddressи \Magento\Quote\Model\Quote\Item\ToOrderItemсоответственно.

Что это обозначает?

  1. Добавление ключа в набор полей недостаточно, если только метод set не существует для объекта, соответствующего этому ключу.
  2. Похоже, что копирование пользовательских полей из цитаты в порядок потребует либо переопределения целевого класса для добавления необходимого метода (методов) установки (посредством внедрения зависимости), либо использования наблюдателей, подобных sales_model_service_quote_submit_beforeкопированию данных вручную.

Также обратите внимание, что у модуля quote есть свои собственные наборы полей, включая quote_convert_addressи quote_convert_item. Похоже, что наборы полей sales_convert_quote * больше не используются.

Райан Херр
источник
: - Я запутался в вашем ответе, я просто понял, что перемещение данных из цитаты в заказ было удалено в magebnto2, тогда как это сделать для моих пользовательских полей? Можете ли вы опубликовать код, в моем ответе я дал исправление для основной проблемы magento (проверьте мой ответ выше), есть ли у вас какое-либо другое решение для этой проблемы?
Прадип Кумар
Вы получили какое-либо решение
Джибин Джордж
5

Продажи в Magento2 конвертируются из предложения в заказ, и его элемент не работает.
Предложение преобразует модель для предложения в заказ, и его элемент перемещается из модуля продаж в модуль Quote в Magento2, но он не работает.

<fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset> 

конвертировать из заказа и позиции заказа в накладную, отгрузку и Creditmemo отлично работает в Magento2

ниже приведено исправление для преобразования котировки в заказ в magento2, в противном случае вам нужно написать событие для перемещения всех значений поля из цитаты в таблицу заказов magento2a \ app \ code \ Sugarcode \ Test \ etc \ fieldset.xml

    <?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset>         
        <fieldset id="sales_convert_order">
            <field name="custom_field">
                <aspect name="to_quote" />
                <aspect name="to_invoice" />
                <aspect name="to_shipment" />
                <aspect name="to_cm" />
            </field>
        </fieldset>        
        <fieldset id="sales_convert_order_item">
            <field name="custom_sku">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>            
        </fieldset>
    </scope>
</config>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php (строка № 428)

перед

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

в функции submitQuote () добавьте ниже код

$order=$this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData);

изменить в приложении \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php (номер строки около 78)

после

$orderItem = $this->orderItemFactory->create();

в функции convert () добавьте код ниже

$this->objectCopyService->copyFieldsetToTarget('quote_convert_item', 'to_order_item', $item, $orderItem);

он будет работать нормально, но
убедитесь, что, как я упоминал выше, в вашем пользовательском модуле должен присутствовать fieldset.xml, а также вы должны написать событие для установки атрибута продукта, как только продукт будет добавлен в корзину, как в magento1.x, а также вы должны установить пользовательский файл в таблице котировок, то только он будет копировать из цитаты и товара в заказ и его товар

Прадип Кумар
источник
Прадип. Это все еще не поддерживается?
Авави
0

Я изучал это, и в модуле Magento \ GiftMessage есть также преобразование полей (fieldset.xml):

<fieldset id="sales_convert_quote_address">
    <field name="gift_message_id">
        <aspect name="to_order" />
    </field>
</fieldset>

Они добавляют его в заказ через наблюдателя (Observer / SalesEventQuoteSubmitBeforeObserver.php, зарегистрированный в etc / frontend / events.xml):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

Так что, я думаю, это жизнеспособный вариант для рассмотрения.

epson121
источник
Magento 2 может автоматически копировать значения для заказов, платежей и т. Д. С помощью атрибутов расширения. Однако создание атрибутов расширения для order_items требует пользовательских наблюдателей для обработки загрузки и сохранения данных в объекты quote_item и order_item. Из-за этого намного проще следовать предложенному выше подходу, чтобы добавить столбец в соответствующие таблицы и использовать один метод наблюдателя для копирования данных. К сожалению, Magento пытался сделать расширяемость в v2 настолько гибкой, что для этого нужно слишком много шаблонов, чтобы оно стоило нашего времени.
Роберт Эггинтон
@ epson121: не могли бы вы поделиться своим events.xml в этом случае?
Ипсита Рут
@IpsitaRout вы можете проверить код Magento по умолчанию (app / code / Magento / GiftMessage / etc / frontend / events.xml) или проверить эту выдержку: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121