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_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>

しかし、成功はありません。magento 2で機能させるには、他に何をする必要がありますか?助けてくれませんか?

回答:


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. カスタムフィールドを見積から注文にコピーするには、ターゲットクラスをオーバーライドして必要なセッターメソッドを追加する(依存性注入を介して)か、オブザーバーを使用しsales_model_service_quote_submit_beforeてデータを手動でコピーする必要があります。

また、引用モジュールには、quote_convert_addressおよびなどの独自のフィールドセットが定義されていることに注意してくださいquote_convert_item。sales_convert_quote *フィールドセットはもう使用されていないようです。


:-私はあなたの答えを混乱させています、私はちょうど引用から注文へのデータの移動がmagebnto2で削除されたことを理解していましたが、カスタムフィールドでそれを行う方法は?コードを投稿してもらえますか?私の答えでは、コアmagento問題の修正を提供しました(上記の私の答えを確認してください)、この問題の他の解決策はありますか?
プラディープクマー

あなたはすべてのソリューションを手に入れた
jibinジョージ

5

Magento2の売上が見積から注文に変換され、そのアイテムが機能しない
見積用のモデルを注文に変換すると、そのアイテムは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> 

注文および注文アイテムから請求書、発送に変換し、Magento2でCreditmemoが正常に機能する

以下は、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()
            ]
        );

関数submitQuote()で以下のコードを追加

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

app \ code \ Magento \ Quote \ Model \ Quote \ Item \ ToOrderItem.phpの変更(lin no 78)

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

関数convert()で以下のコードを追加します

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

それはうまく動作しますが
、上記のfieldset.xmlがカスタムモジュールにあることを確認し、製品がmagento1.xのようにカートに追加されたらカスタム属性を設定するイベントを記述し、カスタムファイルを設定する必要があります引用テーブルでは、引用とアイテムから注文とそのアイテムにコピーするだけです


プラディープ。まだサポートされていませんか?
awavi

0

私はこれを調査してきましたが、Magento \ GiftMessageモジュールには、フィールドの変換(fieldset.xml)もあります。

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

注文に追加する方法は、オブザーバ(Observer / SalesEventQuoteSubmitBeforeObserver.php、etc / frontend / events.xmlに登録されている)を使用する方法です。

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を共有できますか?
イプシタラウト

@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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.