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中做些什么才能使它工作?你们能帮我吗?
花一些时间和研究的问题后,我在这里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版本进行调整)。
你有没有想过应该怎么做? – awavi