আমি ম্যাজেন্টো 2.0 তে গ্রিড অর্ডার করতে একটি নতুন কলাম যুক্ত করার চেষ্টা করছি। সুতরাং, গ্রিড সংগ্রহের অর্ডার করতে আমার যোগদান করা দরকার। আমি কীভাবে এটি অর্জন করতে পারি? কারণ, magento2-এ গ্রিডটি ইউআই উপাদান ব্যবহার করে।
আমি ম্যাজেন্টো 2.0 তে গ্রিড অর্ডার করতে একটি নতুন কলাম যুক্ত করার চেষ্টা করছি। সুতরাং, গ্রিড সংগ্রহের অর্ডার করতে আমার যোগদান করা দরকার। আমি কীভাবে এটি অর্জন করতে পারি? কারণ, magento2-এ গ্রিডটি ইউআই উপাদান ব্যবহার করে।
উত্তর:
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
আমরা সমস্ত বিষয়বস্তু ওভাররাইড করতে চাই না বলে আপনার অনুলিপি বিক্রয়_র্ডার_গ্রিড.এক্সএমএল এর সমস্ত সামগ্রী মুছুন।
আপনার মডিউল এর বিক্রয়_র্ডার_গ্রিড.এক্সএমএলে নিম্নলিখিত কোডটি প্রবেশ করান
<?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 / ক্যাশে ফোল্ডার থেকে ক্যাশে মুছুন বা আপনার ক্যাশে রিফ্রেশ করুন। আপনি আপনার যুক্ত কলামগুলি বিক্রয় বিক্রয় গ্রিডে দেখতে সক্ষম হবেন।
আপনি যখন \Magento\Framework\Data\Collection\AbstractDb
ম্যাজেন্টো 2 দেখুন তখন নিজেই আপনার সংগ্রহের জন্য হুক অপারেশন সরবরাহ করে।
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 ব্যবহার করে এটি করতে পারবেন না, সুতরাং আপনাকে এই পদক্ষেপগুলি অনুসরণ করতে হবে এবং আপনার আপডেট করতে হবে
ইত্যাদি / 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;
}
}
?>
ইউআই সংজ্ঞা এক্সএমএলে এর সাথে একটি ডাটাসোর্স নোড রয়েছে
<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"]
।