Magento2-如何将自定义数据从报价复制到订单和订单项

Magento2-如何将自定义数据从报价复制到订单和订单项,magento2,Magento2,我正在Magento 2中构建一个自定义模块,该模块具有自定义折扣。我正在尝试将折扣从报价、报价项复制到订单和订单项。 在Magento 1中,我声明config.xml如下: * * * * 我的自定义折扣金额被复制到表:sales\u flat\u order和sales\u flat\u order\u item 在Magento 2中,我用以下代码创建了一个名为fieldset.xml的文件: 但是没有成功。 在Magento 2中,我还需要做什么才能使其正常工作?你们能帮帮我吗

我正在Magento 2中构建一个自定义模块,该模块具有自定义折扣。我正在尝试将折扣从报价、报价项复制到订单和订单项。 在Magento 1中,我声明config.xml如下:


*
*
*
*
我的自定义折扣金额被复制到表:
sales\u flat\u order
sales\u flat\u order\u item

在Magento 2中,我用以下代码创建了一个名为
fieldset.xml
的文件:


但是没有成功。
在Magento 2中,我还需要做什么才能使其正常工作?你们能帮帮我吗?

在花了一些时间研究这个问题之后,我在这里结巴了: Magento\Quote\Model\QuoteManagement.php 第446行

它忽略已转换的属性,因为合并逻辑基于目标模型\接口的状态获取程序和设置程序。所以,如果您转换目标模型中没有setter和getter的属性,它们将被忽略:
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
        );

也许您可以使用observer或插件来避免这个问题。(2.0.6 Magento版本中遇到的问题)

在Magento 2中,不使用字段集,您还可以使用插件将自定义数据从报价项复制到订单项

在模块etc文件夹中创建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'
    }

}

对于将来关注此问题的任何人来说,字段集XML不起作用的事实已经被Magento确认为一个bug。票证中提供了一个核心补丁(此处不复制,因为可能需要使用新的Magento版本对其进行调整)


你有没有计划好该怎么做?
<?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'
    }

}