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

问题描述:

我正在magento 2中建立一个自定义折扣的客户模块。我试图从报价,报价项目到订单和订单项目复制折扣。 在Magento 1,我宣布在config.xml中这样的:Magento2-如何将自定义数据从报价复制到订单和订单项目

<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中做些什么才能使它工作?你们能帮我吗?

+0

你有没有想过应该怎么做? – awavi

花一些时间和研究的问题后,我在这里stucked: Magento的\报价\型号\ 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; 
} 

而忽略转换属性,因为逻辑合并基于存在的getter和setter的目标模型\界面。所以,如果你将它没有制定者和目标模型干将属性,他们将在这里忽略:
Magento的\框架\反射\ 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版本中遇到的问题)

在没有使用fieldset的Magento 2中,您还可以使用插件将报价项目的自定义数据复制到订购项目。

创建di.xml在您的模块等文件夹中。
应用程序/代码/销售者/ 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> 

创建一个类来你的模块并定义一个函数。 应用程序/代码/销售者/ Yourmodule /型号/插件/报价
创建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版本进行调整)。

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