Sao chép dữ liệu tùy chỉnh từ trích dẫn để đặt hàng và đặt hàng sau khi đơn hàng được đặt trong magento2


15

Tôi đang xây dựng một mô-đun tùy chỉnh trong magento 2 có giảm giá tùy chỉnh. Tôi đang cố gắng sao chép giảm giá từ báo giá, báo giá để đặt hàng và đặt hàng. Trong magento 1, tôi tuyên bố config.xmlnhư thế này:

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

và số tiền chiết khấu tùy chỉnh của tôi đã được sao chép vào các bảng: sales_flat_ordersales_flat_order_itemnhư mong đợi.

Trong Magento 2, tôi đã tạo một tên tệp: fieldset.xmlvới mã này:

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

nhưng không có thành công. Tôi cần làm gì khác trong magento 2 để làm cho nó hoạt động? Các bạn có thể giúp tôi không?

Câu trả lời:


7

Nó xuất hiện các trường không còn là một tùy chọn để di chuyển các trường dữ liệu tùy chỉnh xung quanh. Không rõ nếu điều này là cố ý, hoặc tác dụng phụ của những thay đổi khác.

Tôi chỉ gặp vấn đề tương tự với các khoản thanh toán. Tôi truy tìm lại \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;
}

Nó bắt đầu bằng cách xử lý bộ trường để sao chép dữ liệu từ $objectvào $paymentDatamảng, nhưng sau đó đưa mảng đó vào \Magento\Framework\Api\DataObjectHelper::populateWithArray()để thực sự đặt các giá trị trên đối tượng đích (ở đây, $orderPayment).

Thay vì trực tiếp thêm mảng dữ liệu vào đối tượng như trong Magento 1, hãy DataObjectHelpertìm các phương thức 'set__' hoặc 'setIs__' tương ứng với mỗi khóa và sau đó gọi các phương thức đó bằng giá trị. Nếu phương thức đó không tồn tại, khóa dữ liệu sẽ bị bỏ qua hoàn toàn.

Địa chỉ trích dẫn và các mục được xử lý theo cùng một cách, trong \Magento\Quote\Model\Quote\Address\ToOrderAddress\Magento\Quote\Model\Quote\Item\ToOrderItemtương ứng.

Điều đó nghĩa là gì?

  1. Thêm khóa vào một bộ trường là không đủ, trừ khi một phương thức thiết lập đã tồn tại trên đối tượng tương ứng với khóa đó.
  2. Dường như việc sao chép các trường tùy chỉnh từ trích dẫn sang thứ tự sẽ yêu cầu ghi đè lớp mục tiêu để thêm (các) phương thức setter cần thiết (thông qua việc tiêm phụ thuộc) hoặc sử dụng các trình quan sát muốn sales_model_service_quote_submit_beforesao chép dữ liệu theo cách thủ công.

Cũng lưu ý rằng mô-đun trích dẫn có các trường riêng được xác định, bao gồm quote_convert_addressquote_convert_item. Dường như các trường sales_convert_quote * đang được sử dụng nữa.


: - tôi đang bối rối từ câu trả lời của bạn, tôi chỉ đang di chuyển dữ liệu từ trích dẫn sang đơn hàng đã bị xóa trong magebnto2, vậy làm thế nào để làm điều đó cho các trường tùy chỉnh của tôi? bạn có thể gửi mã, trong câu trả lời của tôi, tôi đã sửa lỗi cho vấn đề magento cốt lõi (kiểm tra câu trả lời của tôi ở trên), bạn có giải pháp nào khác cho vấn đề này không?
Pradeep Kumar

bạn có nhận được giải pháp nào không
jibin george

5

Bán hàng Magento2 chuyển đổi từ báo giá sang đơn hàng và mặt hàng của nó không hoạt động Báo
giá Chuyển đổi mô hình để báo giá để đặt hàng và mặt hàng của nó được chuyển từ mô-đun bán hàng sang mô-đun Trích dẫn trong Magento2 Nhưng nó không hoạt động

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

chuyển đổi từ đơn đặt hàng và đơn đặt hàng sang hóa đơn, giao hàng và Creditmemo đang hoạt động tốt trong Magento2

bên dưới là bản sửa lỗi để chuyển đổi trích dẫn thành đơn hàng trong magento2, bạn cần phải viết sự kiện để chuyển tất cả giá trị đã nộp từ bảng báo giá sang bảng đặt hàng 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>


ứng dụng \ code \ Magento \ Trích dẫn \ Model \ Trích dẫn quản lý.php (dòng số 428)

trước

$billingAddress = $this->quoteAddressToOrderAddress->convert(
            $quote->getBillingAddress(),
            [
                'address_type' => 'billing',
                'email' => $quote->getCustomerEmail()
            ]
        );

trong hàm submitQuote () thêm mã bên dưới

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

thay đổi trong ứng dụng \ code \ Magento \ Trích dẫn \ Model \ Trích dẫn \ Mục \ ToOrderItem.php (lin no khoảng 78)

sau

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

trong hàm convert () thêm mã bên dưới

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

nó sẽ hoạt động tốt nhưng
hãy chắc chắn như tôi đã đề cập ở trên fieldset.xml nên có trong mô-đun tùy chỉnh của bạn và bạn cũng nên viết sự kiện để đặt thuộc tính sản phẩm khi sản phẩm được thêm vào giỏ hàng như trong magento1.x và bạn cũng nên đặt tùy chỉnh trong bảng báo giá thì chỉ có nó sẽ sao chép từ trích dẫn và mục này để đặt hàng và mục của nó


Thương hiệu. Nó vẫn không được hỗ trợ?
awavi

0

Tôi đã xem xét điều này và trong mô-đun Magento \ GiftMessage, cũng có chuyển đổi các trường (fieldset.xml):

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

Cách họ thêm nó vào đơn đặt hàng là thông qua người quan sát (Observer / SalesEventQuoteSubmitB BeforeObserver.php, đã đăng ký trong etc / frontend / event.xml):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $observer->getEvent()->getOrder()->setGiftMessageId($observer->getEvent()->getQuote()->getGiftMessageId());

    return $this;
}

Vì vậy, tôi đoán, đây là một lựa chọn khả thi để xem xét.


Có thể để Magento 2 tự động sao chép các giá trị cho đơn hàng, thanh toán, v.v. bằng cách sử dụng các thuộc tính mở rộng. Tuy nhiên, việc tạo các thuộc tính mở rộng cho order_items yêu cầu người quan sát tùy chỉnh để xử lý việc tải và lưu dữ liệu vào các đối tượng quote_item và order_item. Do đó, việc thực hiện theo cách tiếp cận được đề xuất ở trên sẽ đơn giản hơn nhiều để thêm một cột vào các bảng có liên quan và sử dụng một phương thức quan sát duy nhất để sao chép dữ liệu. Đáng buồn thay, Magento đã cố gắng làm cho khả năng mở rộng trong v2 linh hoạt đến mức nó đòi hỏi quá nhiều nồi hơi để làm cho nó đáng giá thời gian của chúng tôi.
Robert Egginton

@ epson121: bạn có thể chia sẻ sự kiện của bạn trong trường hợp này không?
Tuyến đường Ipsita

@IpsitaRout bạn có thể kiểm tra mã Magento mặc định (app / code / Magento / GiftMessage / etc / frontend / event.xml) hoặc kiểm tra đoạn trích này: <event name="sales_model_service_quote_submit_before"> <observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteSubmitBeforeObserver" shared="false" /> </event>
epson121
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.