Magento 2: Как я могу загрузить сетку администратора с предопределенными значениями фильтра?

14

Я хочу создать ссылку на пользовательскую сетку в моем администраторе с предопределенными фильтрами. Сетка сделана с помощью UI Listing Component (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.

Поэтому я уже попытался загрузить страницу с теми же параметрами URL, что и XHR-запрос, а также просто добавил только обязательные параметры:

?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 для моего виджета сетки, он просто создан с помощью компонента UI, в котором перечислены XML.

Тем не менее, я все равно проверю, поможет ли упомянутый вопрос моему варианту использования.

Гиль Беркерс
источник
Возможный дубликат добавления фильтра по умолчанию в сетку в Magento2?
Рафаэль на цифровом
2
@RaphaelatDigitalPianism Я не думаю, что это дубликат. Вопрос, который вы связали, говорит о том, что сетки строятся по-старому. Что-то среднее между блоками сетки и UI-компонентами. В основном это было то, где у вас все еще были блоки сетки, но они были сконфигурированы в файле XML вместо prepareColumnsметода.
Мариус
Голос @Marius отозван;)
Рафаэль на Цифровом
1
Я отредактировал свой вопрос, так как я также не думаю, что это дубликат (я сделал свое исследование ;-))
Giel Berkers
@Giel Berkers У меня та же проблема
bhargav shastri

Ответы:

9

Вот что я узнал до сих пор.
Это не полный, но он может привести вас на правильный путь.
Я провел свои тесты, изменив компонент пользовательского интерфейса страницы cms.
Я добавил это

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

в cms_page_listing.xmlвнутри узла 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.
И я вижу только страницу с идентификатором 2.
Но это не работает для фильтров диапазона, и значение фильтра не заполнено. Это все еще показывает как пустое.

Теперь вот почему это возможно.

Класс dataProvider для cms-страниц есть 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()
            );
        }
    }
}

Для этого нужно проверить в конфигурации компонента пользовательского интерфейса, есть ли элемент с именем filter_url_params. Если есть, он берет все значения внутри него и проверяет запрос на значения, совпадающие с тем, что определено в filter_url_params.
Но по умолчанию это работает только с eq.

Вы можете попробовать создать собственный источник данных для своего компонента, в котором вы переписываете метод prepareUpdateUrlи учитываете все переменные запроса, которые вам нужны, и, возможно, добавляете к нему подкачку и фильтрацию диапазона.

Примечание: это очень интересный вопрос. Я уверен, что многим это понадобится в будущем.

Мариус
источник
Спасибо @Marius за ваш ответ. Это работает для моей ситуации, потому что ссылка всегда должна фильтроваться по одному идентификатору, а не по диапазону (диапазон более или менее является функцией, но не требуется для моего 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"> работает для отдельных фильтров, но не коллективно.
Шатиш
@ Мариус! 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> как уже указано Шатиш
Ашиш Радж