Magento2 Sie müssen Grid mit mehreren Tabellensammlungen mithilfe von UI-Komponenten erstellen

9

Es wurde mit dem Erstellen eines benutzerdefinierten Moduls begonnen und verfügt über eine Funktion zum Anzeigen der GRID-Ansicht, für die mehrere Tabellen in der Sammlung verknüpft und in GRID und Filtern gerendert werden müssen.

Ich habe die UI-Komponente von magento2 verwendet, kann jedoch die Aufgaben des Zusammenfügens mehrerer Tabellen in der Sammlung nicht ausführen und die Rasteransicht vorbereiten.

Jeder kann mir dabei helfen.

amit
quelle

Antworten:

7

Ich habe ein Admin-Raster erstellt, das aus zwei benutzerdefinierten Tabellen besteht. Sie können dies nicht tun, indem Sie den virtuellen Typ in di.xml verwenden. Befolgen Sie daher diese Schritte und aktualisieren Sie Ihre

etc / di.xml,

Model / Resource / Modulename / Collection.php Join in dieser Datei hinzufügen,

Modell / Ressource / Modulname / Grid / Collection.php,

IN Ihrer etc / di.xml

<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 Ihrem Model / Resource / Modulename / Collection.php

<?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 Ihrem Model / Resource / Modulename / Grid / Collection.php

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

?>

Ich hoffe, das hilft.

Ekta Puri
quelle
@ Ekta Puri, ich habe dies verwendet, aber leere Seite angezeigt
Vigna S
@vigna können Sie Arbeitsmodul von ekvitech.com/blog/…
Ekta Puri
@ Ekta Puri, wie kann ich URL-Parameter in _initSelect () Methode der Sammlung erhalten
Nidhi
5

Verbinde 2 Tische

Fügen Sie in Ihrem Vendor\Module\Model\ResourceModel\ModelName\Grid\Collectiondie Funktion _initSelect () wie unten hinzu

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']
    );
}

Verbinden Sie 3 Tische und mehr

Verwenden Sie ThirdTable , FourthTable , um weitere Tabellen wie die folgenden zu verknüpfen :

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
}

Beispiel

Datei app/code/SAdmin/Cart/etc/di.xml.

Der Elementname ist der Name der Datenquelle, die in Ihren UI-Komponenten verwendet wird.

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

Datei app/code/SAdmin/Cart/Model/ResourceModel/Quote/Grid/Collection.php

Bitte beachten Sie die Magento\Framework\View\Element\UiComponent\DataProvider\SearchResultund stellen Sie die Parameter $mainTableund ein $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']
        );
    }
}
Schlüssel Shang
quelle
Es arbeitet an der Anfangsphase, aber wir versuchen herauszufiltern, dass es mir einen Fehler gibt. Spalte nicht gefunden. Bitte überprüfen Spalte nicht gefunden: 1054 Unbekannte Spalte 'designation_title' in 'where-Klausel', Abfrage war: SELECT COUNT (*) ... ......
Savoo
Ich habe das getan, aber es funktioniert nicht :(
Waqar Ali
@ Savoo Ihr Sammlungsbedarf erweitert denMagento\Framework\View\Element\UiComponent\DataProvider\SearchResult
Key Shang