Magento2- Как скопировать пользовательские данные из предложения в заказ и позицию заказа

Я создаю собственный модуль в 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>
</config>

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


person FireKirin    schedule 08.08.2015    source источник
comment
Вы узнали, как это должно быть сделано?   -  person awavi    schedule 02.03.2016


Ответы (3)


В Magento 2 без использования fieldset вы также можете копировать пользовательские данные из элемента котировки в элемент заказа с помощью плагина.

создайте di.xml в папке вашего модуля и т. д.
app/code/Vender/Yourmodule/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <type name="Magento\Quote\Model\Quote\Item\ToOrderItem">
        <plugin name="cedapi_quote_to_order_item" type="Vender\Yourmodule\Model\Plugin\Quote\QuoteToOrderItem"/>
    </type>
</config>

Создайте класс для своего модуля и определите функцию. app/code/Vender/Yourmodule/Model/Plugin/Quote
Создайте файл QuoteToOrderItem.php

<?php
namespace Vender\Yourmodule\Model\Plugin\Quote;

use Closure;

class QuoteToOrderItem
{
    /**
     * @param \Magento\Quote\Model\Quote\Item\ToOrderItem $subject
     * @param callable $proceed
     * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
     * @param array $additional
     * @return \Magento\Sales\Model\Order\Item
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
  public function aroundConvert(
        \Magento\Quote\Model\Quote\Item\ToOrderItem $subject,
        Closure $proceed,
        \Magento\Quote\Model\Quote\Item\AbstractItem $item,
        $additional = []
    ) {
        /** @var $orderItem \Magento\Sales\Model\Order\Item */
        $orderItem = $proceed($item, $additional);//result of function 'convert' in class 'Magento\Quote\Model\Quote\Item\ToOrderItem' 
        $orderItem->setCustomDesign($item->getCustomDesign());//set your required
        return $orderItem;// return an object '$orderItem' which will replace result of function 'convert' in class 'Magento\Quote\Model\Quote\Item\ToOrderItem'
    }

}
person Jitendra Mohanta    schedule 07.08.2016

Потратив некоторое время и изучив проблему, я застрял здесь: Magento\Quote\Model\QuoteManagement.php, строка 446.

public function mergeDataObjects(
    $interfaceName,
    $firstDataObject,
    $secondDataObject
) {
    if (!$firstDataObject instanceof $interfaceName || !$secondDataObject instanceof $interfaceName) {
        throw new \LogicException('Wrong prototype object given. It can only be of "' . $interfaceName . '" type.');
    }
    $secondObjectArray = $this->objectProcessor->buildOutputDataArray($secondDataObject, $interfaceName);
    $this->_setDataValues($firstDataObject, $secondObjectArray, $interfaceName);
    return $this;
}

Который игнорирует преобразованные атрибуты, потому что логика слияния основана на геттерах присутствия и сеттерах целевой модели\интерфейса. Итак, если вы конвертируете атрибуты, которые не имеют сеттеров и геттеров в целевой модели, они будут проигнорированы здесь:
Magento\Framework\Reflection\DataObjectProcessor.php строка 75

public function buildOutputDataArray($dataObject, $dataObjectType)
{
    $methods = $this->methodsMapProcessor->getMethodsMap($dataObjectType);
    $outputData = [];

    /** @var MethodReflection $method */
    foreach (array_keys($methods) as $methodName) {
        if (!$this->methodsMapProcessor->isMethodValidForDataField($dataObjectType, $methodName)) {
            continue;
        }

        $value = $dataObject->{$methodName}();
        $isMethodReturnValueRequired = $this->methodsMapProcessor->isMethodReturnValueRequired(
            $dataObjectType,
            $methodName
        );

Возможно, вы могли бы использовать наблюдатель или плагин, чтобы избежать этой проблемы. (проблема возникла в версии 2.0.6 Magento)

person vkir    schedule 08.06.2016

Для тех, кто задумается об этом в будущем, тот факт, что набор полей XML не работает, был признан Magento ошибкой. В заявке доступен основной патч (здесь он не воспроизводится, так как его может потребоваться настроить в новых версиях Magento).

https://github.com/magento/magento2/issues/5823

person Scott Buchanan    schedule 15.08.2017