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 2016

これに対する任意の解決策
Abhimanyu Singh

欠落しているcode.iに<?xml version = "1.0"?>を追加してください
Ramki

回答:


10

現在のmagento2.1コードベースを見ると、moduleName / etcフォルダーに、あるテーブルから別のテーブルに情報をコピーするコマンドを含むfieldset.xmlがあることがわかります。ただし、これは機能しません。よく見ると、まったく同じことをするオブザーバーがいることにも気づくでしょう。見てください https://github.com/magento/magento2/issues/5823を

quote *テーブルからorder *テーブルにコピーするには、オブザーバーやプラグインを使用する必要があります。

カスタムモジュールの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 2017

@LM_Fieldingでは、コピーサービスでこれを使用する方法を答えに見ることができます
ワーチ

これは注文アドレスでは機能しません。作成された注文は、新しい注文アドレスオブジェクトの新しい行を作成します。exmaple私のカスタムデータは、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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.