Сбор данных фильтра сетки администратора Virtualtype в Magento 2


Я создал сетку администратора, используя виртуальный тип в di.xml вот так:

<virtualType name="Namespace\Module\Model\ResourceModel\Test\Grid\Collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
   <arguments>
      <argument name="mainTable" xsi:type="string">module_test</argument>
      <argument name="resourceModel" xsi:type="string">Namespace\Module\Model\ResourceModel\Test\Collection</argument>
   </arguments>
</virtualType>

Я хочу отфильтровать данные по идентификатору, который был передан по URL-адресу следующим образом:

http://localhost/admin/namespace_module/test/index/test_id/<id>/key/<form_key>

Я хочу, чтобы моя сетка загружала только те данные, которые содержат только test_id, отправленный по URL

<column name="test_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" translate="true" xsi:type="string">test_id</item>
                </item>
            </argument>
        </column>
Author: Idham Choudry, 2017-03-14

2 answers

Если у вас есть это в компоненте пользовательского интерфейса:

<item name="update_url" path="mui/index/render" xsi:type="url"/>

Затем добавьте этот код ниже приведенного выше кода:

<item name="filter_url_params" xsi:type="array"> 
     <item name="test_id" xsi:type="boolean">1</item>
 </item>
 2
Author: Shell Suite, 2017-03-14 16:09:57

Вместо использования виртуального типа вам нужно создать класс, который расширяет \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult и имеет метод _beforeLoad, в котором применяется фильтр test_id. Пример:

use Magento\Framework\App\RequestInterface;
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 Psr\Log\LoggerInterface as Logger;

class Collection extends \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult
{
    protected $request;

    public function __construct(
        EntityFactory $entityFactory,
        Logger $logger,
        FetchStrategy $fetchStrategy,
        EventManager $eventManager,
        $mainTable = 'module_test',
        $resourceModel = 'Namespace\Module\Model\ResourceModel\Test\Collection',
        RequestInterface $request
    ) {
        $this->request = $request;

        parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $mainTable, $resourceModel);
    }

    public function _beforeLoad()
    {
        // show only items with passed in parameter
        if ($testId = $this->request->getParam('test_id')) {
            $this->addFieldToFilter('test_id', $testId);
        }

        return parent::_beforeLoad();
    }
}
 3
Author: Aaron Allen, 2017-03-14 03:28:15