Magento 2 fieldset.xml; alanları tekliften siparişe kopyala


11

Alıntıdan sipariş oluşturmak için özel bir model oluşturdum; Sipariş için özel kod alıntı kopyalamak için fieldset.xml kullanıyorum. Eşleşen alanlarla hem teklif hem de siparişte özel sütunlar oluşturdum. Sipariş verildiğinde değerler teklif özel alanlarında saklanır ancak siparişe kopyalanmaz. Aşağıda benim 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>

Başka ne yapmam gerekiyor?


önbelleği temizledin mi?
Marius

evet önbellek ve nesil hem temizledi, o zaman da özel alan verileri alıntı siparişe kopyalama değil
Abhimanyu Singh

Bunun için herhangi bir çözüm
Abhimanyu Singh

Lütfen eksik olan kod.i'ye <? Xml version = "1.0"?> Ekleyin
Ramki

Yanıtlar:


10

Geçerli magento2.1 kod tabanına bakarsanız, moduleName / etc klasöründe bilgileri bir tablodan diğerine kopyalama komutuyla bir fieldset.xml olduğunu göreceksiniz . Ancak bu işe yaramaz. Daha yakından bakarsanız , aynı şeyi yapan bir gözlemci olduğunu da fark edeceksiniz . Https://github.com/magento/magento2/issues/5823 adresine bakın.

Fiyat teklifinden * sipariş * tablosuna kopyalamak için bir gözlemci ve / veya eklenti kullanmanız gerekir.

Özel Modül events.xml dosyasında

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

Sonra

<?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;
    }
}

Ürünü quote_item'den order_item'e kopyalamak için, magento, işi almak için en iyi gözlemciyi kaldırmış gibi görünüyor sales_convert_quote_item_to_order_item. Alıntı_itemi alanından sipariş_öğesi tablosuna kopyalamanıza yardımcı olacak bu örneğe bir göz atın. Özel giriş alanına sahip bir ürün "sepete nasıl eklenir" ve Veritabanına nasıl kaydedilir?


Şimdiye kadar aldıysanız, kopyalama hizmetini de kullanabilirsiniz ...
LM_Fielding

@LM_Fielding cevabımda bunu kopya servisi ile nasıl kullanabileceğinizi görebilirsiniz
warch

bu sipariş adresi çalışmıyor. Oluşturulan sipariş, yeni bir sipariş adresi nesnesi için yeni bir satır oluşturur. exmaple için özel verilerim ID 500 numaralı sipariş adresine eklenir, yeni sipariş 501 adresini kullanır.
Doni Wibowo

8

Renon Stewart'ın cevabı bana çok yardımcı oldu ama resmi magento geliştirici belgeleriyle geliştirebilirim ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

Özel Modül events.xml dosyasında şunları ekleyin:

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

Ve saveOrderBeforeSalesModelQuoteObserver.php dosyasında:

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.