Magento 2 fieldset.xml; 将字段从报价复制到订单


11

我创建了一个自定义模型以根据报价创建订单;我正在使用fieldset.xml将报价定制代码复制到订单中。我已经创建了具有匹配字段的引号和顺序自定义列。下订单时,值存储在报价定制字段中,但不复制到订单中。以下是我的fieldset.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:DataObject/etc/fieldset.xsd">
<scope id="global">
    <!--quote convert to order-->
    <fieldset id="sales_convert_quote">            
        <field name="preorder_number">
            <aspect name="to_order" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order" />
        </field>
        <field name="reference_number">
            <aspect name="to_order" />
        </field>
    </fieldset>
    <!--quote item convert to order item-->
    <fieldset id="quote_convert_item">
        <field name="preorder_number">
            <aspect name="to_order_item" />
        </field>
        <field name="purchase_order_number">
            <aspect name="to_order_item" />
        </field>
        <field name="reference_number">
            <aspect name="to_order_item" />
        </field>
    </fieldset>
</scope>

我还需要做什么?


您是否清除了缓存?
马吕斯

是的,我清除了缓存和生成两者,然后自定义字段数据也未从报价复制到订单
Abhimanyu Singh

对此的任何解决方案
Abhimanyu Singh

请在该code.i中添加<?xml version =“ 1.0”?>,这是我所缺少的
Ramki

Answers:


10

如果看一下当前的magento2.1代码库,您会注意到在moduleName / etc文件夹中有一个fieldset.xml,其中包含用于将信息从一个表复制到另一个表的命令。但是,这不起作用。如果仔细观察,您还会注意到有观察者在做同样的事情。看看 https://github.com/magento/magento2/issues/5823

要将报价从报价*复制到订单*表,您将需要使用观察器和/或插件。

在您的自定义模块events.xml中添加

 <event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

然后

<?php

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * List of attributes that should be added to an order.
     *
     * @var array
     */
    private $attributes = [
        'field_1_name_here',
        'field_2_name_here',
        'field_...._here'
    ];


    /**

     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        foreach ($this->attributes as $attribute) {
            if ($quote->hasData($attribute)) {
                $order->setData($attribute, $quote->getData($attribute));
            }
        }

        return $this;
    }
}

要将项目从quote_item复制到order_item,magento似乎已经删除了最佳观察者以获取工作sales_convert_quote_item_to_order_item。看一下这个示例,它可以帮助您将字段从quote_item复制到order_item表。如何使用自定义输入字段将产品“添加到购物车”并将其保存到数据库?


如果您已经走了那么远,不妨使用复制服务...
LM_Fielding

@LM_Fielding你可以看到它在我的回答你能如何与复制服务使用
warch

这对订单地址无效。创建的订单将为新的订单地址对象创建一个新行。对于〔实施例我的自定义数据插入到订单地址ID为500,新的订单将使用地址501
多尼Wibowo

8

雷农·斯图尔特(Renon Stewart)的回答对我很有帮助,但我可以通过magento官方开发人员文档(http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html)进行改进。

在您的自定义模块events.xml中添加:

<event name="sales_model_service_quote_submit_before">
    <observer name="[moduelname]_sales_model_service_quote_submit_before" instance="Company\ModuleName\Observer\SaveOrderBeforeSalesModelQuoteObserver" />
</event>

在saveOrderBeforeSalesModelQuoteObserver.php中:

namespace Company\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;

class SaveOrderBeforeSalesModelQuoteObserver implements ObserverInterface
{

    /**
     * @var \Magento\Framework\DataObject\Copy
     */
    protected $objectCopyService;


    /**
     * @param \Magento\Framework\DataObject\Copy $objectCopyService
     */
    public function __construct(
        \Magento\Framework\DataObject\Copy $objectCopyService
    )
    {
        $this->objectCopyService = $objectCopyService;
    }

    /**
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return $this
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /* @var Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');
        /* @var Magento\Quote\Model\Quote $quote */
        $quote = $observer->getEvent()->getData('quote');

        $this->objectCopyService->copyFieldsetToTarget('sales_convert_quote', 'to_order', $quote, $order);

        return $this;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.