Magento 2: Jak mogę załadować siatkę administracyjną ze wstępnie zdefiniowanymi wartościami filtrów?

14

Chcę utworzyć link do niestandardowej siatki u mojego administratora z predefiniowanymi filtrami. Siatka jest wykonana za pomocą składnika listingu interfejsu użytkownika (XML) i ma kolumnę o nazwie, form_idktóra jest skonfigurowana w następujący sposób:

<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>

Siatka działa dobrze. Mogę zastosować filtr i wszystko działa dobrze. Siatka jest ładnie aktualizowana przez żądanie XHR.

Jednak ... Chcę mieć możliwość zdefiniowania wartości filtrów w pewnym momencie. Na przykład chcę móc otworzyć siatkę, gdy jest filtrowana według ID = 3.

Próbowałem już załadować stronę z tymi samymi parametrami adresu URL, co żądanie XHR, a także po prostu dodać tylko wymagane parametry:

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

Jak również:

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

Oba bez powodzenia. Jak mogę wstępnie wypełnić filtry za pomocą adresu URL?

Edytować:

Nie jestem pewien, czy jest to duplikat drugiego pytania (jak wspomniano w komentarzach poniżej). W moim przypadku używam typu wirtualnego jako kolekcji dla mojej siatki:

<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>

Więc nie chodzi o to, że mam fizyczną klasę Block dla mojego widgetu grid, jest ona czysto utworzona za pomocą komponentu interfejsu użytkownika z listą XML.

Niemniej jednak sprawdzę, czy pytanie, o którym mowa, pomoże w moim przypadku użycia.

Giel Berkers
źródło
Możliwy duplikat Aby dodać domyślny filtr do siatki w Magento2?
Raphael at Digital Pianism
2
@RaphaelatDigitalPianism Nie sądzę, że to duplikat. Pytanie, które połączyłeś, mówi o siatkach budowanych w stary sposób. Coś między blokami siatki i komponentami interfejsu użytkownika. To było w zasadzie coś, w czym nadal masz bloki siatki, ale zostały one skonfigurowane w pliku xml zamiast prepareColumnsmetody.
Marius
@ Mariusz wycofał głos;)
Raphael w Digital Pianism
1
Zredagowałem swoje pytanie, ponieważ również nie sądzę, że jest to duplikat (przeprowadziłem badania ;-))
Giel Berkers
@Giel Berkers Dostaję ten sam problem
bhargav shastri

Odpowiedzi:

9

Oto, czego do tej pory się dowiedziałem.
To nie jest kompletne, ale może poprowadzić Cię właściwą ścieżką.
Przeprowadziłem testy, modyfikując komponent interfejsu użytkownika z listą stron cms.
Dodałem to

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

w cms_page_listing.xmlśrodku węzła źródła danych poufnych danych / config argument. Więc teraz wygląda to tak

<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>

To pozwala mi zadzwonić na adres URL ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
I widzę tylko stronę o identyfikatorze 2.
Ale to nie działa dla filtrów zakresu i wartość filtru nie jest wypełniona. Nadal jest wyświetlana jako pusta.

Oto dlaczego jest to możliwe.

Klasa dataProvider dla stron cms to Magento\Cms\Ui\Component\DataProvider.
Ten się rozszerza Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Ten ostatni zawiera chronioną metodę o nazwieprepareUpdateUrl

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()
            );
        }
    }
}

W tym celu należy sprawdzić w konfiguracji komponentu interfejsu użytkownika, czy istnieje element o nazwie filter_url_params. Jeśli tak, pobiera wszystkie zawarte w nim wartości i sprawdza żądanie wartości zgodnych z definicją w filter_url_params.
Ale domyślnie działa tylko z eq.

To, co możesz spróbować, to mieć niestandardowe źródło danych dla komponentu, w którym przepisujesz metodę prepareUpdateUrli sprawiasz, że bierze ona pod uwagę wszystkie potrzebne zmienne żądania i może dodać do niej stronicowanie i filtrowanie zakresu.

Uwaga dodatkowa: To bardzo interesujące pytanie. Jestem pewien, że wiele osób będzie tego potrzebować w przyszłości.

Marius
źródło
Dziękuję @Marius za odpowiedź. Działa to w mojej sytuacji, ponieważ link zawsze musi filtrować według jednego identyfikatora, a nie według zakresu (zakres jest mniej więcej funkcją, ale nie jest wymagany przez mój adres URL). Twoja odpowiedź i wyjaśnienie bardzo mi pomogło!
Giel Berkers
1
@Marius mogę używać adresu URL w ten sposób ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, ponieważ używam go $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])w UiCompnent / Listing / Column
prosty facet
jak użyć więcej niż jednego parametru do filtrowania, tj. ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> podając trzy parametry w <item name = "filter_url_params" xsi: type = "array"> działa dla pojedynczych filtrów, ale nie zbiorowo.
Shathish
@Marius! URA LIFE SAVER!
Zorox,
@Marius: Czy masz pomysł, jak korzystać z funkcji wielu parametrów adresu URL, takich jak ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> as już określone przez Shathish
Ashish Raj