将订单放置在magento2中后,将自定义数据从报价复制到订单和订单项目


15

我正在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_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中做什么?你们能帮我吗?

Answers:


7

似乎字段集不再是移动自定义数据字段的选项。不清楚这是否是有意的,还是其他更改的副作用。

我在付款时遇到了同样的问题。我追溯到\Magento\Quote\Model\Quote\Payment\ToOrderPayment::convert()

public function convert(Payment $object, $data = [])
{
    $paymentData = $this->objectCopyService->getDataFromFieldset(
        'quote_convert_payment',
        'to_order_payment',
        $object
    );

    $orderPayment = $this->orderPaymentFactory->create();
    $this->dataObjectHelper->populateWithArray(
        $orderPayment,
        array_merge($paymentData, $data),
        '\Magento\Sales\Api\Data\OrderPaymentInterface'
    );
    $orderPayment->setAdditionalInformation(
        array_merge(
            $object->getAdditionalInformation(),
            [Substitution::INFO_KEY_TITLE => $object->getMethodInstance()->getTitle()]
        )
    );
    // set directly on the model
    $orderPayment->setCcNumber($object->getCcNumber());
    $orderPayment->setCcCid($object->getCcCid());

    return $orderPayment;
}

它首先处理字段集以将数据从中复制$object$paymentData数组中,然后将该数组供入\Magento\Framework\Api\DataObjectHelper::populateWithArray()以实际设置目标对象(此处为$orderPayment)上的值。

与其像Magento 1中那样直接向对象添加数据数组,不如DataObjectHelper寻找与每个键相对应的'set__'或'setIs__'方法,然后使用该值调用这些方法。如果不存在这种方法,则数据密钥将被完全跳过。

报价地址和项目分别在\Magento\Quote\Model\Quote\Address\ToOrderAddress和中以相同的方式处理\Magento\Quote\Model\Quote\Item\ToOrderItem

这意味着什么?

  1. 将键添加到字段集中是不够的,除非与该键对应的对象上已经存在set方法。
  2. 看来,将自定义字段从引用复制到顺序将需要覆盖目标类以添加必要的setter方法(通过依赖项注入),或者使用观察者sales_model_service_quote_submit_before来手动复制数据。

另请注意,quote模块定义了自己的字段集,包括quote_convert_addressquote_convert_item。似乎不再使用sales_convert_quote *字段集。


:-我很困惑您的回答,我正站在magebnto2中删除了从报价到订单的移动数据,然后如何针对我的自定义字段呢?您能张贴代码吗,在我的回答中我已解决了magento核心问题(请检查上述答案),您对此问题还有其他解决方案吗?
Pradeep Kumar 2015年

你有没有解决的办法
吉宾乔治

5

Magento2的销售从报价
转换为订单,并且其物料无法正常工作。

<fieldset id="sales_convert_quote">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset> 

从订单和订单项转换为发票,装运,并且Creditmemo在Magento2中工作正常

以下是在magento2中将报价转换为订单的解决方案,否则您需要编写事件以将所有归档的值从报价移至订单表 magento2a \ app \ code \ Sugarcode \ Test \ etc \ fieldset.xml

    <?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<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">
            <field name="custom_field">
                <aspect name="to_order" />
            </field>
        </fieldset>        
        <fieldset id="quote_convert_item">
            <field name="custom_sku">
                <aspect name="to_order_item" />
            </field>
        </fieldset>         
        <fieldset id="sales_convert_order">
            <field name="custom_field">
                <aspect name="to_quote" />
                <aspect name="to_invoice" />
                <aspect name="to_shipment" />
                <aspect name="to_cm" />
            </field>
        </fieldset>        
        <fieldset id="sales_convert_order_item">
            <field name="custom_sku">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>            
        </fieldset>
    </scope>
</config>


app \ code \ Magento \ Quote \ Model \ QuoteManagement.php(第428行)

之前

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

在函数commitQuote()中添加以下代码

$order=$this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData);

在app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.php中进行更改(第78行左右)

$orderItem = $this->orderItemFactory->create();

在函数convert()中添加以下代码

$this->objectCopyService->copyFieldsetToTarget('quote_convert_item', 'to_order_item', $item, $orderItem);

它将正常工作,但请
确保如上我提到的fieldset.xml应该在您的自定义模块中,并且一旦将产品添加到购物车中(如在magento1.x中),您还应该编写事件以设置产品属性,并且还应该设置自定义文件在报价表中,那么只有它会从报价和项目复制到订单及其项目


Pradeep。仍然不受支持吗?
2016年

0

我一直在研究这一点,在Magento \ GiftMessage模块中,还存在字段的转换(fieldset.xml):

<fieldset id="sales_convert_quote_address">
    <field name="gift_message_id">
        <aspect name="to_order" />
    </field>
</fieldset>

他们将其添加到订单的方式是通过观察者(在etc / frontend / events.xml中注册的Observer / SalesEventQuoteSubmitBeforeObserver.php):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

因此,我想这是一个可行的选择。


Magento 2可以使用扩展属性自动复制订单,付款等的值。但是,为order_items创建扩展属性需要自定义观察者,以便处理将数据加载和保存到quote_item和order_item对象的过程。因此,遵循上面建议的方法将一列添加到相关表中并使用单个观察者方法来复制数据要容易得多。可悲的是,Magento试图使v2的可扩展性如此灵活,以至于需要太多样板才能使它值得我们的时间。
罗伯特·艾金顿

@ epson121:在这种情况下,您可以共享您的events.xml吗?
Ipsita Rout

@IpsitaRout,您可以检查默认的Magento代码(app / code / Magento / GiftMessage / etc / frontend / events.xml)或检查以下摘录: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121 '16
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.