Làm cách nào để tham gia bộ sưu tập lưới đặt hàng vào bảng tùy chỉnh trong Magento2?


12

Tôi đang cố gắng thêm một cột mới để đặt hàng lưới trong Magento 2.0. Vì vậy, tôi cần phải tham gia để đặt hàng bộ sưu tập lưới. Làm thế nào tôi có thể đạt được điều này ? Bởi vì, trong magento2, lưới sử dụng thành phần UI.

Câu trả lời:


12

Magento 2 thêm các cột tùy chỉnh vào lưới đặt hàng bán hàng,

Tham gia

Magento \ Bán hàng \ Đặt hàng \ Lưới \ Bộ sưu tập

đối với bất kỳ bảng nào, sử dụng plugin sẽ là lựa chọn tốt nhất vì điều này không phụ thuộc vào việc viết lại và làm cho mã nạc.

Tạo plugin trong etc / di.xml của mô-đun của bạn

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <plugin name="sales_order_additional_columns" type="Vendor\ModuleName\Plugins\AddColumnsSalesOrderGridCollection" sortOrder="100" disabled="false" />
</type>

Vì vậy, chúng tôi đang chặn

Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory

bởi vì nếu bạn nhìn vào

Magento \ Sales \ etc \ di.xml

bạn sẽ thấy

Magento \ Bán hàng \ Đặt hàng \ Lưới \ Bộ sưu tập

đã được tiêm vào

Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ CollectionFactory

Tạo thư mục Plugin và lớp plugin trong mô-đun của bạn

<?php namespace Vendor\ModuleName\Plugins;

use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;

class AddColumnsSalesOrderGridCollection
{
    private $messageManager;
    private $collection;

    public function __construct(MessageManager $messageManager,
        SalesOrderGridCollection $collection
    ) {

        $this->messageManager = $messageManager;
        $this->collection = $collection;
    }

    public function aroundGetReport(
        \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
        \Closure $proceed,
        $requestName
    ) {
        $result = $proceed($requestName);
        if ($requestName == 'sales_order_grid_data_source') {
            if ($result instanceof $this->collection
            ) {
                $select = $this->collection->getSelect();
                $select->join(
                    ["soi" => "sales_order_item"],
                    'main_table.entity_id = soi.order_id AND soi.product_type="simple"',
                    array('weight', 'product_type')
                )
                    ->distinct();

                $select->join(
                    ["soa" => "sales_order_address"],
                    'main_table.entity_id = soa.parent_id AND soa.address_type="shipping"',
                    array('email', 'country_id', 'postcode', 'city', 'telephone')
                )
                    ->distinct();
            }

        }
        return $this->collection;
    }
}

Ở đây chúng tôi đang quan sát xung quanh sự kiện của phương thức getReport ().

Sao chép

nhà cung cấp / magento / mô-đun bán hàng / lượt xem / adminhtml / ui_component / sales_order_grid.xml

đến phạm vi mô-đun của bạn

Nhà cung cấp / ModuleName / view / adminhtml / ui_component / sales_order_grid.xml

Xóa tất cả nội dung của sales_order_grid.xml đã sao chép của bạn vì chúng tôi không muốn ghi đè tất cả nội dung.

Nhập mã sau vào sales_order_grid.xml của mô-đun của bạn

    <?xml version="1.0" encoding="UTF-8"?>

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">

    <columns name="sales_order_columns">

        <!-- sales_order_item weight -->
        <column name="weight">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Weight</item>
                    <item name="sortOrder" xsi:type="number">222</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_item product_type-->
        <column name="product_type">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\ModuleName\Ui\Component\Listing\Column\ProductTypes</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Product Type</item>
                    <item name="sortOrder" xsi:type="number">232</item>
                    <item name="align" xsi:type="string">right</item>
                    <!--<item name="filter" xsi:type="string">select</item>-->
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address country_id -->
        <column name="country_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Country ID</item>
                    <item name="sortOrder" xsi:type="number">242</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address post_code -->
        <column name="postcode">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Postcode</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address city -->
        <column name="city">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">City</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address telephone -->
        <column name="telephone">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Telephone</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

    </columns>

</listing>

Bây giờ, xóa bộ đệm từ thư mục var / cache hoặc làm mới bộ đệm của bạn. Bạn sẽ có thể thấy các cột được thêm vào của mình trong lưới đặt hàng bán hàng.


Cảm ơn rất nhiều vì điều đó, vấn đề duy nhất của tôi (với Magento 2.2.0) là tôi phải thêm tiền tố bảng trên các dòng ["soi" => "sales_order_item"]["soa" => "sales_order_address"].
David

Tôi nghĩ rằng nó hoạt động tốt, nhưng dường như nó cũng gây rối với lưới hóa đơn .. Với mô-đun được bật, ID đơn hàng và trạng thái trống một cách kỳ lạ trong lưới hóa đơn .. Bạn có biết điều gì có thể sai không?
David

Cảm ơn bạn đã thông tin này, nó đã giúp tôi thêm tên công ty. Nhưng làm thế nào tôi có thể hiển thị thông tin thanh toán và vận chuyển thay vì chỉ vận chuyển? Tôi có thể hiển thị 1 hoặc khác nhưng dường như tôi không thể đổi tên 'công ty' để nói 'billing_company' và 'Shipping_company' để sử dụng trong sales_order_grid.xml
RLTcode

1
Gặp lỗi trong các trang CMS, Khối CMS, lưới khách hàng và Creditmemo khi sử dụng lớp plugin, Vui lòng cho tôi biết nếu có bất kỳ giải pháp thay thế nào để sửa đổi bộ sưu tập lưới.
Vishal

Những lỗi bạn có thể thấy cho lưới hóa đơn và vv?
Asrar

9

Khi bạn nhìn vào \Magento\Framework\Data\Collection\AbstractDbmagento2, nó cung cấp thao tác hook cho bộ sưu tập của bạn.

protected function _renderFilters()
{
    if ($this->_isFiltersRendered) {
        return $this;
    }

    $this->_renderFiltersBefore(); // Hook for operations before rendering filters

    ....................
}

Vì vậy, những gì bạn cần để làm điều này bằng cách chỉ cần thêm vào bộ sưu tập của bạn [ NAMESPACE\MODULENAME\Model\ResourceModel\YOUR_CLASSNAME\Grid\Collection]

protected function _renderFiltersBefore() {
    $joinTable = $this->getTable('catalog_product_entity_varchar');
    $this->getSelect()->join($joinTable.' as cpev','main_table.entity_id = cpev.entity_id', array('*'));
    parent::_renderFiltersBefore();
}

tôi cần hiển thị trường bảng tùy chỉnh của mình trong lưới theo thứ tự trong trường hợp này để hiển thị nó?
Pradeep Kumar

@Keyur Shah Cảm ơn nó giúp tôi rất nhiều.
Rohit Goel

Rất vui khi biết rằng nó giúp bạn :) @RohitGoel Keep giúp thành viên cộng đồng khác
Keyur Shah

Chắc chắn rồi
Rohit Goel

1
Thay vì _renderFiltersBefore, bạn cũng có thể ghi đè / mở rộng _initSelect.
Jāni Elmeris

3

Tôi đã tạo lưới quản trị có nối hai bảng tùy chỉnh. bạn không thể làm điều này bằng cách sử dụng loại ảo là di.xml, vì vậy bạn cần làm theo các bước sau và cập nhật

vv / di.xml,

Model / Resource / Modulename / Collection.php thêm tham gia vào tệp này,

Mô hình / Tài nguyên / Modulename / Grid / Collection.php,

IN etc / di.xml của bạn

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="namespace_modulename_listing_data_source" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename\Grid\Collection</item>
            </argument>
        </arguments>
</type>
<type name="Namespace\Modulename\Model\Resource\Modulename\Grid\Collection">
    <arguments>
        <argument name="mainTable" xsi:type="string">tablename</argument>
        <argument name="eventPrefix" xsi:type="string">namespace_modulename_grid_collection</argument>
        <argument name="eventObject" xsi:type="string">namespace_grid_collection</argument>
        <argument name="resourceModel" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename</argument>
    </arguments>
</type>

IN Model / Resource / Modulename / Collection.php của bạn

<?php
namespace Namespace\Modulename\Model\Resource\Modulename;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    /**
     * Define model & resource model
     */
    const YOUR_TABLE = 'tablename';

    public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        $this->_init(
            'Namespace\Modulename\Model\Modulename',
            'Namespace\Modulename\Model\Resource\Modulename'
        );
        parent::__construct(
            $entityFactory, $logger, $fetchStrategy, $eventManager, $connection,
            $resource
        );
        $this->storeManager = $storeManager;
    }
    protected function _initSelect()
    {
        parent::_initSelect();

        $this->getSelect()->joinLeft(
                ['secondTable' => $this->getTable('tablename')],
                'main_table.columnname = secondTable.columnname',
                ['columnname1','columnname2','columnname3']
            );
    }
}
?>

IN Model / Resource / Modulename / Grid / Collection.php của bạn

<?php
namespace Namespace\Modulename\Model\Resource\Modulename\Grid;

use Magento\Framework\Api\Search\SearchResultInterface;
use Magento\Framework\Search\AggregationInterface;
use Namespace\Modulename\Model\Resource\Modulename\Collection as ModulenameCollection;

/**
 * Class Collection
 * Collection for displaying grid
 */
class Collection extends ModulenameCollection implements SearchResultInterface
{
    /**
     * Resource initialization
     * @return $this
     */
   public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        $mainTable,
        $eventPrefix,
        $eventObject,
        $resourceModel,
        $model = 'Magento\Framework\View\Element\UiComponent\DataProvider\Document',
        $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        parent::__construct(
            $entityFactory,
            $logger,
            $fetchStrategy,
            $eventManager,
            $storeManager,
            $connection,
            $resource
        );
        $this->_eventPrefix = $eventPrefix;
        $this->_eventObject = $eventObject;
        $this->_init($model, $resourceModel);
        $this->setMainTable($mainTable);
    }

    /**
     * @return AggregationInterface
     */
    public function getAggregations()
    {
        return $this->aggregations;
    }

    /**
     * @param AggregationInterface $aggregations
     *
     * @return $this
     */
    public function setAggregations($aggregations)
    {
        $this->aggregations = $aggregations;
    }


    /**
     * Get search criteria.
     *
     * @return \Magento\Framework\Api\SearchCriteriaInterface|null
     */
    public function getSearchCriteria()
    {
        return null;
    }

    /**
     * Set search criteria.
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setSearchCriteria(
        \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria = null
    ) {
        return $this;
    }

    /**
     * Get total count.
     *
     * @return int
     */
    public function getTotalCount()
    {
        return $this->getSize();
    }

    /**
     * Set total count.
     *
     * @param int $totalCount
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setTotalCount($totalCount)
    {
        return $this;
    }

    /**
     * Set items list.
     *
     * @param \Magento\Framework\Api\ExtensibleDataInterface[] $items
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setItems(array $items = null)
    {
        return $this;
    }
}

?>

Nó không hoạt động
saravanavelu

làm việc tốt cho tôi .. lỗi gì cho bạn?
Ekta Puri

lỗi máy chủ nội bộ. bạn có thể kiểm tra và định dạng lại mã của mình không
saravanavelu

tôi có thể xem các tập tin của bạn ở đâu đó không? bởi vì điều này làm việc cho tôi một cách hoàn hảo, Still tôi sẽ lại cố gắng định dạng lại
Ekta Puri

etc / di.xml Model / Resource / Modulename / Collection không có bất cứ thứ gì giống như trong này trong di.xml
saravanavelu

2

Trong định nghĩa ui xml có một nút nguồn dữ liệu tương tự như thế này

<dataSource name="listing_name_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">UniqueNameGridDataProvider</argument>
        <argument name="name" xsi:type="string">listing_name_data_source</argument>

nơi listing_name_data_sourcecó thể được định nghĩa trong của bạn di.xmlhoặc chỉ tham chiếu một lớp trực tiếp. Bản thân lớp nên mở rộng từ Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactorycollectionstranh luận về bộ sưu tập tùy chỉnh của bạn. Trong _initSelect()phương thức của lớp bộ sưu tập đó, bạn có thể tham gia các bảng của mình.


1
trong doanh số bán hàng mã bộ sưu tập lưới, tôi hy vọng điều đó sẽ rõ hơn
Pradeep Kumar

Nó định nghĩa ở đây github.com/magento/magento2/blob/develop/app/code/Magento/Sales/... và là một loại ảo kéo dài từ Magento \ Framework \ View \ Yếu tố \ UIComponent \ DataProvider \ SearchResult
Kristof tại Fooman

sau đó ho để thêm tham gia vào lớp đó. Bạn có thể đưa ra mã ví dụ
Pradeep Kumar


@KristofatFooman bạn đưa ra một ví dụ sai vì đây là loại ảo, bạn có thể đưa ra một ví dụ cho bộ sưu tập lưới được xác định là loại ảo không?
LucScu

2

Đối với bất kỳ ai gặp vấn đề với giải pháp @Asrar chỉ cần làm điều này:

public function aroundGetReport(
    \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
    \Closure $proceed,
    $requestName
) {
    $result = $proceed($requestName);
    if ($requestName == 'sales_order_grid_data_source_firsty') {
        if ($result instanceof $this->collection
        ) {
            $select = $this->collection->getSelect();
            $select->join(
                ["soi" => "sales_order_item"],
                'main_table.entity_id = soi.order_id',
                array('sku', 'name','item_id')
            )
                ->distinct();
            return $this->collection;
        }

    }
    return $result;
}

Điều này có vẻ là làm việc ok cho tôi.

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.