【问题标题】:Magento2- How to copy custom data from quote to order and order itemMagento2-如何将自定义数据从报价复制到订单和订单项目
【发布时间】:2015-08-08 02:05:02
【问题描述】:

我正在 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_ordersales_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 中做什么才能使其正常工作?你们能帮帮我吗?

【问题讨论】:

  • 你知道应该怎么做吗?

标签: magento2


【解决方案1】:

在不使用字段集的 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'
    }

}

【讨论】:

    【解决方案2】:

    在花了一些时间研究问题之后,我卡在这里: 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;
    }
    

    忽略转换的属性,因为基于目标模型\接口的存在获取器和设置器的合并逻辑。因此,如果您转换目标模型中没有 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
            );
    

    也许你可以使用观察者或插件来避免这个问题。 (2.0.6 Magento版本遇到的问题)

    【讨论】:

      【解决方案3】:

      对于将来看到这个的任何人,字段集 XML 不起作用的事实已被 Magento 承认为一个错误。票证中有一个可用的核心补丁(此处未复制,因为它可能需要使用新的 Magento 版本进行调整)。

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

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 1970-01-01
        • 2012-07-13
        • 2018-07-12
        • 2023-03-15
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多