Magento2 Cần xây dựng Grid với bộ sưu tập nhiều bảng bằng các thành phần UI


9

Bắt đầu xây dựng mô-đun tùy chỉnh, nó có tính năng hiển thị chế độ xem GRID cần tham gia nhiều bảng trong bộ sưu tập và hiển thị chúng trên GRID và các bộ lọc.

Tôi đã sử dụng Thành phần UI từ magento2 nhưng tôi không thể hoàn thành các nhiệm vụ tham gia nhiều bảng trong bộ sưu tập và chuẩn bị chế độ xem lưới.

Bất cứ ai cũng có thể giúp tôi về điều này.

Câu trả lời:


7

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

?>

Mong rằng sẽ giúp.


@Ekta Puri, tôi đã sử dụng trang này nhưng hiển thị trang trống
Vigna S

@vigna bạn có thể tải xuống mô-đun làm việc từ ekvitech.com/blog/ Nhật
Ekta Puri

@Ekta Puri, làm cách nào tôi có thể nhận được các tham số url trong phương thức thu thập _initSelect ()
Nidhi

5

Tham gia 2 bàn

Trong của bạn Vendor\Module\Model\ResourceModel\ModelName\Grid\Collection, thêm hàm _initSelect () như bên dưới

protected function _initSelect()
{
    parent::_initSelect();

    $this->getSelect()->joinLeft(
        ['secondTable' => $this->getTable('admin_user')], //2nd table name by which you want to join
        'main_table.user_id= secondTable.user_id', // common column which available in both table 
        '*' // '*' define that you want all column of 2nd table. if you want some particular column then you can define as ['column1','column2']
    );
}

Tham gia 3 bàn và hơn thế nữa

Sử dụng thirdTable , thirdTable để tham gia nhiều bảng hơn như bên dưới:

protected function _initSelect()
{
    parent::_initSelect();

    $this->getSelect()->joinLeft(
        ['secondTable' => $this->getTable('admin_user')],
        'main_table.user_id = secondTable.user_id',
        ['username']
    )->joinLeft(
        ['thirdTable' => $this->getTable('catalog_product_entity')],
        'main_table.product_id = thirdTable.entity_id',
        ['sku']
    );//use fourthTable, fifthTable to join more tables
}

Thí dụ

Tập tin app/code/SAdmin/Cart/etc/di.xml.

Tên mục là tên của data_source được sử dụng trong Thành phần giao diện người dùng của bạn.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="sadmin_cart_index_index_listing_data_source" xsi:type="string">SAdmin\Cart\Model\ResourceModel\Quote\Grid\Collection</item>
            </argument>
        </arguments>
    </type>
</config>

Tập tin app/code/SAdmin/Cart/Model/ResourceModel/Quote/Grid/Collection.php

Xin lưu ý mở rộng Magento\Framework\View\Element\UiComponent\DataProvider\SearchResultvà thiết lập các tham số $mainTable$resourceModel.

namespace SAdmin\Cart\Model\ResourceModel\Quote\Grid;


use Magento\Framework\Data\Collection\Db\FetchStrategyInterface as FetchStrategy;
use Magento\Framework\Data\Collection\EntityFactoryInterface as EntityFactory;
use Magento\Framework\Event\ManagerInterface as EventManager;
use Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult;
use Psr\Log\LoggerInterface as Logger;

class Collection extends SearchResult
{
    public function __construct(
        EntityFactory $entityFactory, Logger $logger, FetchStrategy $fetchStrategy, EventManager $eventManager,
        $mainTable = 'quote',
        $resourceModel = 'Magento\Quote\Model\ResourceModel\Quote',
        $identifierName = null, $connectionName = null
    )
    {
        parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $mainTable, $resourceModel, $identifierName, $connectionName);
    }

    public function _initSelect()
    {
        parent::_initSelect();
        return $this->getSelect()->joinLeft(
            ['secondTable' => $this->getTable('customer_group')], //2nd table name by which you want to join
            'main_table.customer_group_id= secondTable.customer_group_id', // common column which available in both table
            ['customer_group_code']// '*' define that you want all column of 2nd table. if you want some particular column then you can define as ['column1','column2']
        );
    }
}

CNTT đang hoạt động ở giai đoạn quan hệ nhưng chúng tôi cố gắng lọc ra lỗi của tôi. Không tìm thấy lỗi. Vui lòng kiểm tra Cột không tìm thấy: 1054 Cột không xác định 'designation_title' trong 'mệnh đề where', truy vấn là: CHỌN COUNT (*) ... ......
Savoo

tôi đã làm điều đó nhưng nó không hoạt động :(
Waqar Ali

@Savoo Bộ sưu tập của bạn cần mở rộngMagento\Framework\View\Element\UiComponent\DataProvider\SearchResult
Key Shang
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.