0

I have created a custom module and want to display products with my custom filters.

I am confused if I need to create models and extend it with product models ? so I can add them in di.xml to show products in my custom module grid.

Or is there any other way around.

Edit

Ok I tried this looking at magento-catalog I prodivded a data provider as magento does. Now I am getting the grid , but now when I try to multiselect the products I dont get the selected ids in Param

This are the params I get when I multiselect from grid.

Array
(
    [key] => 3a7750c8654fbe63017744ebcbc877e39923539800d9d22c6529d8a2bee4891c
    [excluded] => false
    [filters] => Array
        (
            [placeholder] => true
        )

    [namespace] => vendor_module_productlisting
    [form_key] => vkXFki8YOWNHkcrm
)

Ui Grid vendor_module_productlisting.xml

<dataSource name="vendor_module_productlisting_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Vendor\Module\Ui\DataProvider\Product\ProductDataProvider</argument>
        <argument name="name" xsi:type="string">vendor_module_productlisting_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">entity_id</argument>
        <argument name="requestFieldName" xsi:type="string">id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" path="mui/index/render" xsi:type="url"/>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">entity_id</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

My Data Prodvider

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Vendor\Module\Ui\DataProvider\Product;

use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;

/**
 * Class ProductDataProvider
 */
class ProductDataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
    /**
     * Product collection
     *
     * @var \Magento\Catalog\Model\ResourceModel\Product\Collection
     */
    protected $collection;

    /**
     * @var \Magento\Ui\DataProvider\AddFieldToCollectionInterface[]
     */
    protected $addFieldStrategies;

    /**
     * @var \Magento\Ui\DataProvider\AddFilterToCollectionInterface[]
     */
    protected $addFilterStrategies;

    protected $categoryCollection;

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        CollectionFactory $collectionFactory,
        \Vendor\Module\Model\ResourceModel\Categories\CollectionFactory $vendorCatCollectionFactory,
        array $addFieldStrategies = [],
        array $addFilterStrategies = [],
        array $meta = [],
        array $data = []
    ) {
        parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
        $this->collection = $collectionFactory->create();
        $this->categoryCollection = $vendorCatCollectionFactory->create();
        $this->addFieldStrategies = $addFieldStrategies;
        $this->addFilterStrategies = $addFilterStrategies;
    }


    protected function _getCategoriesIds(){
       return [1,2,3];
    }

    public function getData()
    {

        $categories = $this->_getCategoriesIds();

        $this->collection->addAttributeToSelect(['name', 'image'], 'inner')->addCategoriesFilter(['in' => $categories]);
        $items = $this->collection->toArray();

        return [
            'totalRecords' => $this->collection->getSize(),
            'items' => array_values($items),
        ];
    }

    /**
     * Add field to select
     *
     * @param string|array $field
     * @param string|null $alias
     * @return void
     */
    public function addField($field, $alias = null)
    {
        if (isset($this->addFieldStrategies[$field])) {
            $this->addFieldStrategies[$field]->addField($this->getCollection(), $field, $alias);
        } else {
            parent::addField($field, $alias);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function addFilter(\Magento\Framework\Api\Filter $filter)
    {
        if (isset($this->addFilterStrategies[$filter->getField()])) {
            $this->addFilterStrategies[$filter->getField()]
                ->addFilter(
                    $this->getCollection(),
                    $filter->getField(),
                    [$filter->getConditionType() => $filter->getValue()]
                );
        } else {
            parent::addFilter($filter);
        }
    }
}

Has to be a better way ? :(

1

No need of extend with product mode. simple inject in __construct method and use it.

protected $productCollectionFactory;

public function __construct(
        .....
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        .....
    ) {
       ......
        $this->productCollectionFactory = $productCollectionFactory;
       ....
    }

you can get the collection

$collection = $this->productCollectionFactory->create();
  • And in which file should I inject it. As I have created grid using uicomponent so how can I call product collection to it ? – Priyank Nov 28 '16 at 6:54
  • @userpk In you model file where you are getting the collection for grid. – Fme Extensions Nov 28 '16 at 6:59
  • can you show me an example with the file where I need to put code and the di.xml – Priyank Nov 28 '16 at 7:08
  • @userpk can you share your di.xml so i can look at that also the grid UI – Fme Extensions Nov 28 '16 at 7:12
  • I have edited my question – Priyank Nov 28 '16 at 7:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.