Magento 2 fieldset.xml; sao chép các trường từ trích dẫn để đặt hàng


11

Tôi đã tạo một mô hình tùy chỉnh để tạo thứ tự từ trích dẫn; Tôi đang sử dụng fieldset.xml để sao chép mã tùy chỉnh để đặt hàng. Tôi đã tạo các cột tùy chỉnh trong cả trích dẫn và thứ tự với các trường phù hợp. Khi thứ tự được đặt, các giá trị được lưu trữ trong các trường tùy chỉnh trích dẫn nhưng không sao chép để đặt hàng. Dưới đây là fieldset.xml của tôi

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

Tôi cần làm gì nữa?


bạn đã xóa bộ nhớ cache?
Marius

vâng tôi đã xóa bộ nhớ cache và tạo cả hai, sau đó dữ liệu trường tùy chỉnh không được sao chép từ trích dẫn để đặt hàng
Abhimanyu Singh

Bất kỳ giải pháp nào cho việc này
Abhimanyu Singh

Vui lòng thêm <? Xml version = "1.0"?> Trong mã đó. Tôi bị thiếu
Ramki

Câu trả lời:


10

Nếu bạn nhìn vào cơ sở mã magento2.1 hiện tại, bạn sẽ nhận thấy rằng trong thư mục moduleName / etc có một fieldset.xml với lệnh sao chép thông tin từ bảng này sang bảng khác. Tuy nhiên điều này KHÔNG làm việc. Nếu bạn nhìn kỹ hơn, bạn cũng sẽ nhận thấy rằng có một người quan sát thực hiện điều tương tự chính xác. Hãy xem https://github.com/magento/magento2/issues/5823

Để sao chép từ bảng trích dẫn * để đặt hàng *, bạn sẽ cần sử dụng trình quan sát và / hoặc plugin.

Trong mô-đun sự kiện tùy chỉnh của bạn, hãy thêm

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

Sau đó

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

Để sao chép mục từ quote_item sang order_item, magento dường như đã loại bỏ người quan sát tốt nhất để có được công việc đó sales_convert_quote_item_to_order_item. Hãy xem ví dụ này sẽ giúp bạn sao chép trường từ bảng quote_item sang bảng order_item. Làm cách nào để "thêm vào giỏ hàng" một sản phẩm với trường nhập liệu tùy chỉnh và lưu nó vào Cơ sở dữ liệu?


Nếu bạn đã đạt được điều này, bạn cũng có thể sử dụng dịch vụ sao chép ...
LM_Fielding

@LM_Fielding bạn có thể thấy nó trong câu trả lời của tôi về cách bạn có thể sử dụng điều này với dịch vụ sao chép
warch

Điều này không làm việc của địa chỉ đặt hàng. Đơn hàng được tạo sẽ tạo một hàng mới cho một đối tượng địa chỉ đơn hàng mới. để lấy sơ đồ, dữ liệu tùy chỉnh của tôi được chèn vào địa chỉ đặt hàng với ID 500, đơn hàng mới sẽ sử dụng địa chỉ 501.
Doni Wibowo

8

Câu trả lời của Renon Stewart (đã giúp tôi rất nhiều nhưng tôi có thể cải thiện nó bằng tài liệu dành cho nhà phát triển magento chính thức ( http://devdocs.magento.com/guides/v2.1/ext-best-practices/tutorials/copy-fieldsets.html )

Trong mô-đun sự kiện tùy chỉnh của bạn, hãy thêm:

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

Và trong saveOrderB BeforeSalesModelQuoteObserver.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;
    }
}
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.