Сбор данных фильтра сетки администратора 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>
6
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