Я хочу создать ссылку на пользовательскую сетку в моем администраторе с предопределенными фильтрами. Сетка сделана с помощью 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.
Тем не менее, я все равно проверю, поможет ли упомянутый вопрос моему варианту использования.
prepareColumns
метода.Ответы:
Вот что я узнал до сих пор.
Это не полный, но он может привести вас на правильный путь.
Я провел свои тесты, изменив компонент пользовательского интерфейса страницы cms.
Я добавил это
в
cms_page_listing.xml
внутри узла 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
Для этого нужно проверить в конфигурации компонента пользовательского интерфейса, есть ли элемент с именем
filter_url_params
. Если есть, он берет все значения внутри него и проверяет запрос на значения, совпадающие с тем, что определено вfilter_url_params
.Но по умолчанию это работает только с
eq
.Вы можете попробовать создать собственный источник данных для своего компонента, в котором вы переписываете метод
prepareUpdateUrl
и учитываете все переменные запроса, которые вам нужны, и, возможно, добавляете к нему подкачку и фильтрацию диапазона.Примечание: это очень интересный вопрос. Я уверен, что многим это понадобится в будущем.
источник
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