Magento 2:如何为管理网格加载预定义的过滤器值?


14

我想使用预定义的过滤器在管理员中创建指向自定义网格的链接。该网格由一个UI列表组件(XML)组成,并具有一个称为的列form_id,其设置如下:

<column name="form_id">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">textRange</item>
            <item name="label" xsi:type="string" translate="true">Form id</item>
        </item>
    </argument>
</column>

网格工作正常。我可以应用过滤器,并且一切正常。使用XHR请求可以很好地更新网格。

但是...我希望能够在某个时候预先定义过滤器的值。例如,我希望能够在按ID = 3进行过滤时打开网格。

因此,我已经尝试使用与XHR-request相同的URL参数加载页面,以及仅添加所需的参数:

?namespace=form_response_listing&search=&filters[placeholder]=true&filters[form_id][from]=3&filters[form_id][to]=3&paging[pageSize]=20&paging[current]=1

以及:

?filters[form_id][from]=3&filters[form_id][to]=3

两者都没有成功。那么,如何使用URL预填充过滤器?

编辑:

我不确定这是否与其他问题重复(如下面的评论中所述)。就我而言,我将虚拟类型用作网格的集合:

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

因此,并不是我的网格小部件具有物理的Block类,而是纯粹使用列出XML的UI组件创建的。

不过,无论如何,我都会检查所提到的问题是否对我的用例有用。



2
@RaphaelatDigitalPianism我不认为这是重复的。您链接的问题谈论网格以旧的方式构建。网格块和ui组件之间的东西。从根本上讲,您仍然有网格块,但是它们是在xml文件而不是prepareColumns方法中配置的。
马吕斯


1
我编辑了问题,因为我也不认为这是重复的(我已经完成了研究;
Giel Berkers

@Giel Berkers我遇到了同样的问题
bhargav shastri

Answers:


9

这是我到目前为止发现的。
这还不完整,但是可以带您走上正确的道路。
我通过修改列出ui组件的cms页面进行了测试。
我加了这个

<item name="filter_url_params" xsi:type="array">
    <item name="page_id" xsi:type="string">*</item>
</item>

cms_page_listing.xmldata / config参数中的dataSource节点中。所以现在看起来像这样

<dataSource name="cms_page_listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Magento\Cms\Ui\Component\DataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_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" xsi:type="url" path="mui/index/render"/>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">page_id</item>
                </item>
                <item name="filter_url_params" xsi:type="array"><!-- my addition -->
                    <item name="page_id" xsi:type="string">*</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

这使我可以调用url ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2
而且我只看到ID为2的页面。
但是它不适用于范围过滤器,并且过滤器值未填写。它仍然显示为空白。

现在,这就是为什么这是可能的。

cms页的dataProvider类为Magento\Cms\Ui\Component\DataProvider
这一延伸Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
最后一个包含一个受保护的方法,称为prepareUpdateUrl

protected function prepareUpdateUrl()
{
    if (!isset($this->data['config']['filter_url_params'])) {
        return;
    }
    foreach ($this->data['config']['filter_url_params'] as $paramName => $paramValue) {
        if ('*' == $paramValue) {
            $paramValue = $this->request->getParam($paramName);
        }
        if ($paramValue) {
            $this->data['config']['update_url'] = sprintf(
                '%s%s/%s',
                $this->data['config']['update_url'],
                $paramName,
                $paramValue
            );
            $this->addFilter(
                $this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
            );
        }
    }
}

这是为了检查ui组件配置中是否存在名为的元素filter_url_params。如果存在,它将获取其中的所有值,并检查请求中是否匹配中定义的值filter_url_params
但默认情况下,它仅适用于eq

您可以尝试的是为您的组件创建一个自定义数据源,在其中您重写方法prepareUpdateUrl并使其考虑所需的所有请求变量,并可能向其中添加分页和范围过滤。

旁注:这是一个非常有趣的问题。我敢肯定,将来会有很多人需要它。


谢谢@Marius的回答。这适用于我的情况,因为链接始终需要按一个ID而不是范围进行过滤(范围或多或少是一项功能,但我的URL不需要)。您的回答以及您的解释对我帮助很大!
Giel Berkers

1
@Marius我可以这样使用url吗ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>,因为我$this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])在UiCompnent / Listing / Column中使用
简单的家伙

如何使用多个参数进行过滤,即ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here>在<item name =“ filter_url_params”下给出三个参数xsi:type =“ array”>适用于单个过滤器,但不能一起使用。
Shathish

@Marius!URA LIFE SAVER!
Zorox

@Marius:您是否知道如何使用多个URL参数的功能,例如ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌val3 / key / <form_key_h‌ere> Shathish已经指定了
Ashish Raj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.