Magento2 এ কাস্টম টেবিলের অর্ডার গ্রিড সংগ্রহে কীভাবে যোগদান করবেন?


12

আমি ম্যাজেন্টো 2.0 তে গ্রিড অর্ডার করতে একটি নতুন কলাম যুক্ত করার চেষ্টা করছি। সুতরাং, গ্রিড সংগ্রহের অর্ডার করতে আমার যোগদান করা দরকার। আমি কীভাবে এটি অর্জন করতে পারি? কারণ, magento2-এ গ্রিডটি ইউআই উপাদান ব্যবহার করে।

উত্তর:


12

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 / ক্যাশে ফোল্ডার থেকে ক্যাশে মুছুন বা আপনার ক্যাশে রিফ্রেশ করুন। আপনি আপনার যুক্ত কলামগুলি বিক্রয় বিক্রয় গ্রিডে দেখতে সক্ষম হবেন।


তার জন্য অনেক ধন্যবাদ, আমার একমাত্র ইস্যুটি (ম্যাজেন্টো ২.২.০ সহ) ছিল যে আমাকে লাইনগুলিতে টেবিলের উপসর্গ যুক্ত করতে হয়েছিল ["soi" => "sales_order_item"]এবং ["soa" => "sales_order_address"]
ডেভিড

আমি ভেবেছিলাম এটি ঠিকঠাক কাজ করছে, তবে এটি চালানের গ্রিডের সাথেও গণ্ডগোল করছে বলে মনে হচ্ছে .. মডিউলটি সক্ষম হওয়ার সাথে সাথে, চালানের গ্রিডে অর্ডার আইডি এবং স্থিতি অদ্ভুতভাবে খালি রয়েছে .. কী ভুল হতে পারে তার কোনও ধারণা?
ডেভিড

এই তথ্যের জন্য আপনাকে ধন্যবাদ, এটি আমাকে কোম্পানির নাম যুক্ত করতে সহায়তা করেছে। তবে আমি কীভাবে কেবল শিপিংয়ের পরিবর্তে বিলিং এবং শিপিংয়ের তথ্য দেখাব? আমি 1 বা অন্যটি প্রদর্শন করতে পারি তবে বিক্রয়_র্ডার_গ্রিড.এক্সএমএল-তে ব্যবহার করার জন্য 'বিলিং_কম্পানি' এবং 'শিপিং_কম্পানি' বলার জন্য আমি 'সংস্থা'র নাম পরিবর্তন করতে পারি না
আরএলটিকোড

1
প্লাগইন ক্লাসটি ব্যবহার করার সময় সিএমএস পৃষ্ঠা, সিএমএস ব্লক, গ্রাহক এবং ক্রেডিটমেমো গ্রিডে ত্রুটি পাওয়া, দয়া করে গ্রিড সংগ্রহ সংশোধন করার কোনও বিকল্প সমাধান কিনা তা আমাকে জানান।
বিশাল

চালান গ্রিড এবং ইত্যাদির জন্য আপনি কী ত্রুটি দেখতে পাচ্ছেন?
আসরার

9

আপনি যখন \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();
}

আমার গ্রাহককে আমার কাস্টম টেবিল ক্ষেত্রটি দেখাতে প্রয়োজন তাই এই ক্ষেত্রে গ্রিডটি দেখাতে হবে?
প্রদীপ কুমার

@ কেয়ার শাহ ধন্যবাদ এটি আমার পক্ষে অনেক সাহায্য করে।
রোহিত গোয়েল

শুনে আপনি খুব খুশী হলেন :) @ রোহিতগোয়েল কিপ অন্য সম্প্রদায়ের সদস্যকে সহায়তা করে
কিউর শাহ

অবশ্যই :) @ কায়ূরশাহ আমি সম্প্রদায়কে সাহায্য করতে পছন্দ করি I আমি ইউআই উপাদান ছাড়াই একটি গ্রিড তৈরি করছি, আপনি কি দয়া করে আমাকে বলতে পারেন যে আমি কীভাবে এতে রপ্তানি বৈশিষ্ট্য যুক্ত করতে পারি।
রোহিত গোয়েল

1
পরিবর্তে _renderFiltersBefore, আপনি ওভাররাইড / প্রসারিত করতে পারেন _initSelect
জোনিস এলমারিস

3

আমি অ্যাডমিন গ্রিড তৈরি করেছি যা দুটি কাস্টম টেবিলের সাথে যুক্ত হয়েছে। আপনি ভার্চুয়াল টাইপটি 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;
    }
}

?>

এটি কাজ করছিল না
সরভানভেলু

আমার জন্য ভাল কাজ করে .. আপনার জন্য ত্রুটি কি?
একতা পুরী

অভ্যন্তরীণ সার্ভার ত্রুটি. আপনি কি আপনার কোডটি চেক করতে এবং পুনরায় ফর্ম্যাট করতে পারেন
সরভানভেলু

আমি কি আপনার ফাইলগুলি কোথাও দেখতে পারি? কারণ এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে, তবুও আমি আবার পুনরায় ফর্ম্যাট করার চেষ্টা করব
একতা পুরী

ইত্যাদি / di.xml মডেল / রিসোর্স / moduleName / সংগ্রহ সেখানে di.xml এই মত কিছু নয়
saravanavelu

2

ইউআই সংজ্ঞা এক্সএমএলে এর সাথে একটি ডাটাসোর্স নোড রয়েছে

<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()পদ্ধতিতে আপনি আপনার টেবিলগুলিতে যোগ দিতে পারেন।


1
বিক্রয় di.xML এ এটি ম্যাজেন্টো \ বিক্রয় \ মডেল \ রিসোর্সমোডেল \ অর্ডার \ গ্রিড \ সংগ্রহ যেখানে ফাইলটি নিজেরাই বের হয় না, সেক্ষেত্রে আমরা প্লাগইন বা ইভেন্টটি পুনরায় লিখতে পারি না, কীভাবে এটি বিক্রয় বিক্রয় এবং আদেশ পরীক্ষা করে দেখুন গ্রিড সংগ্রহের কোড, আমি আশা করি এটি আরও পরিষ্কার হয়ে যাবে
প্রদীপ কুমার

এটি এখানে সংজ্ঞায়িত করা হয়েছে github.com/magento/magento2/blob/develop/app/code/Magento/Sales/… এবং ম্যাগেন্টো me ফ্রেমওয়ার্ক \ ভিউ \ এলিমেন্ট \ UIComp घटक \ ডেটাপ্রোভাইডার R অনুসন্ধানের ফলাফল
ক্রুটোফ এ ফিউম্যান

তারপরে এই শ্রেণিতে যোগদানের জন্য হো .c আপনি উদাহরণ কোডটি দিন
প্রদীপ কুমার


@ ক্রিস্টোফ্যাটফুমান আপনি একটি ভুল উদাহরণ দিয়েছেন কারণ এটি ভার্চুয়াল টাইপ, আপনি ভার্চুয়াল টাইপ হিসাবে সংজ্ঞায়িত গ্রিড সংগ্রহের জন্য একটি উদাহরণ দিতে পারেন?
লুস্ক্কু

2

@ অসার সমাধানে যে কারও সমস্যা রয়েছে কেবল তার জন্য এটি করুন:

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

এটি আমার জন্য ঠিক কাজ করছে বলে মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.