마 젠토 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>

내가 뭘 더해야합니까?


캐시를 지우셨습니까?
Marius

예 캐시와 생성을 모두 지운 다음 사용자 정의 필드 데이터가 견적에서 주문으로 복사되지 않습니다
Abhimanyu Singh

이에 대한 모든 솔루션
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

@ LM_Fielding 당신은 내 대답에서 그것을 복사 서비스와 함께 사용하는 방법을 볼 수 있습니다
warch

주문 주소가 작동하지 않습니다. 작성된 주문은 새 주문 주소 오브젝트에 대한 새 행을 작성합니다. 예를 들어 ID 500의 주문 주소에 내 사용자 정의 데이터가 삽입되면 새 주문의 주소는 501을 사용합니다.
Doni 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.