मैं Magento 2.0 में ग्रिड ऑर्डर करने के लिए एक नया कॉलम जोड़ने की कोशिश कर रहा हूं। तो, मुझे ग्रिड कलेक्शन ऑर्डर करने के लिए जॉइनिंग करने की जरूरत है। इसे कैसे प्राप्त किया जा सकता है ? क्योंकि, magento2 में, ग्रिड UI घटक का उपयोग करता है।
मैं Magento 2.0 में ग्रिड ऑर्डर करने के लिए एक नया कॉलम जोड़ने की कोशिश कर रहा हूं। तो, मुझे ग्रिड कलेक्शन ऑर्डर करने के लिए जॉइनिंग करने की जरूरत है। इसे कैसे प्राप्त किया जा सकता है ? क्योंकि, magento2 में, ग्रिड UI घटक का उपयोग करता है।
जवाबों:
Magento 2 बिक्री आदेश ग्रिड में कस्टम कॉलम जोड़ें,
शामिल होना
Magento \ बिक्री \ आदेश \ ग्रिड \ संग्रह
किसी भी तालिका में, प्लगइन का उपयोग करना सबसे अच्छा विकल्प होगा क्योंकि यह फिर से लिखना पर निर्भर नहीं करता है और कोड को दुबला बनाता है।
अपने मॉड्यूल के आदि / di.xml में प्लगइन बनाएं
<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>
इसलिए, हम इंटरसेप्ट कर रहे हैं
Magento \ फ्रेमवर्क \ देखें \ तत्व \ UIComponent \ dataProvider \ CollectionFactory
क्योंकि अगर आप एक नज़र डालते हैं
Magento \ बिक्री \ आदि \ di.xml
तुम देखोगे
Magento \ बिक्री \ आदेश \ ग्रिड \ संग्रह
में इंजेक्ट किया गया था
Magento \ फ्रेमवर्क \ देखें \ तत्व \ UIComponent \ dataProvider \ CollectionFactory
अपने मॉड्यूल में एक प्लगइन फ़ोल्डर और एक प्लगइन वर्ग बनाएं
<?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;
}
}
यहाँ हम getReport () विधि की घटना के आसपास देख रहे हैं ।
प्रतिलिपि
विक्रेता / Magento / मॉड्यूल बिक्री / देखें / adminhtml / ui_component / sales_order_grid.xml
आपके मॉड्यूल के दायरे के लिए
विक्रेता / ModuleName / देखें / adminhtml / ui_component / sales_order_grid.xml
अपने कॉपी किए गए sales_order_grid.xml की सभी सामग्री हटा दें क्योंकि हम सभी सामग्रियों को ओवरराइड नहीं करना चाहते हैं।
अपने मॉड्यूल के sales_order_grid.xml में निम्न कोड दर्ज करें
<?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>
अब, var / cache folder से cache को डिलीट करें या अपने cache को रिफ्रेश करें। आप अपने जोड़े गए कॉलम को विक्रय आदेश ग्रिड में देख पाएंगे।
जब आप \Magento\Framework\Data\Collection\AbstractDb
magento2 को देखते हैं तो अपने संग्रह के लिए हुक संचालन प्रदान करते हैं।
protected function _renderFilters()
{
if ($this->_isFiltersRendered) {
return $this;
}
$this->_renderFiltersBefore(); // Hook for operations before rendering filters
....................
}
तो, आपको अपने संग्रह में जोड़कर ऐसा करने की आवश्यकता है [ 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();
}
_renderFiltersBefore
, आप ओवरराइड / विस्तार भी कर सकते हैं _initSelect
।
मैंने एडमिन ग्रिड बनाया जिसमें दो कस्टम टेबल शामिल हैं। आप वर्चुअल प्रकार का उपयोग करके ऐसा नहीं कर सकते di.xml है, इसलिए आपको इन चरणों का पालन करने और अपने को अपडेट करने की आवश्यकता है
etc / di.xml,
मॉडल / संसाधन / मोडुलनेम / संग्रह। एफपी इस फाइल में शामिल हों,
मॉडल / संसाधन / Modulename / ग्रिड / Collection.php,
अपने आदि / 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>
अपने मॉडल / संसाधन / मोड्यूलनाम / संग्रह में। पीपी
<?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']
);
}
}
?>
अपने मॉडल / संसाधन / मोडुलनेम / ग्रिड / संग्रह में। पीपी
<?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;
}
}
?>
यूआई परिभाषा xml में इसके समान एक डेटा स्रोत नोड है
<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>
जहाँ listing_name_data_source
आपके में परिभाषित किया जा सकता है di.xml
या सिर्फ एक वर्ग को सीधे देखें। वर्ग Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory
को collections
अपने कस्टम संग्रह से तर्क के रूप में विस्तार करना चाहिए । उस संग्रह कक्षा की _initSelect()
विधि में आप अपनी सारणी में शामिल हो सकते हैं।
किसी को भी @ असरर समाधान के साथ समस्याएँ हैं:
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;
}
यह मेरे लिए ठीक काम करने लगता है।
["soi" => "sales_order_item"]
और["soa" => "sales_order_address"]
।