주문이 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로 복사하기 위해 fieldset을 처리하는 것으로 시작 $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_addressand를 포함하여 자체 필드 세트가 정의 되어 quote_convert_item있습니다. sales_convert_quote * 필드 세트가 더 이상 사용되지 않는 것 같습니다.


:-나는 당신의 대답과 혼동되고 있습니다. 나는 단지 인용에서 주문으로 이동하는 데이터가 magebnto2에서 제거되었다고 생각했습니다. 내 대답에 핵심 magento 문제에 대한 수정 사항을 제공 한 코드를 게시 할 수 있습니까 (위의 내 대답을 확인하십시오),이 문제에 대한 다른 해결책이 있습니까?
Pradeep Kumar

당신은 어떤 솔루션 거지
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 변경 (약 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의 확장 성을 유연하게 만들어서 시간이 너무 많이 걸리지 않도록 상용구를 너무 많이 요구했습니다.
Robert Egginton 2016 년

@ epson121 :이 경우 events.xml을 공유 할 수 있습니까?
Ipsita Rout

@IpsitaRout 기본 마 젠토 코드 (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.