Magento 2: Як я можу завантажити адміністраторну сітку заздалегідь заданими значеннями фільтра?


14

Я хочу створити в моєму адміністраторі посилання на власну сітку із заздалегідь визначеними фільтрами. Сітка зроблена за допомогою компонента лістингу користувальницького інтерфейсу (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>

Тож це не те, що у мене є віджет фізичного блоку для мого сіткового віджета, він створений суто з переліком XML компонентів інтерфейсу.

Тим не менш, я все одно перевірю, чи допоможе вказане питання в моєму випадку використання.



2
@RaphaelatDigitalPianism Я не думаю, що це дублікат. Питання, з яким ви пов’язали, говорить про побудову сітки за старим способом. Щось між блоками сітки та ui-компонентами. В основному це було щось, де у вас все ще були сіткові блоки, але вони були налаштовані у файлі xml замість prepareColumnsметоду.
Маріус

@Marius голос відкликаний;)
Рафаель у Digital Pianism

1
Я відредагував своє запитання, оскільки також не думаю, що це дублікат (я провів своє дослідження ;-))
Giel Berkers

@Giel Berkers У мене виходить те саме питання
bhargav shastri

Відповіді:


9

Ось що я дізнався поки що.
Це не є повним, але це може привести вас на правильний шлях.
Я провів свої тести, модифікувавши сторінку cms з переліком ui компонента.
Я додав це

<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.
Я бачу лише сторінку з id 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()
            );
        }
    }
}

Для цього потрібно перевірити в конфігурації компонента ui, чи є елемент, який називається 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 / Лістинг / Колонка
простий хлопець

як я можу використовувати більше ніж один параметр для фільтрування, тобто 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"> працює для окремих фільтрів, але не колективно.
Шатіш

@Marius! URA ЖИТТЯ ЗБЕРІГАЙТЕ!
Зорокс

@Marius: Чи маєте ви ідею, як використовувати функціонал для кількох URL-параметрів, таких як ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌re> as вже вказано Shathish
Ashish Raj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.