Magento 2: come posso caricare una griglia di amministrazione con valori di filtro predefiniti?


14

Voglio creare un collegamento a una griglia personalizzata nel mio amministratore con filtri predefiniti. La griglia è realizzata con un componente di elenco dell'interfaccia utente (XML) e ha una colonna chiamata form_idche è configurata in questo modo:

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

La griglia funziona bene. Posso applicare il filtro e tutto funziona bene. La griglia viene ben aggiornata con una richiesta XHR.

Tuttavia ... Voglio essere in grado di avere un valore di filtri predefinito ad un certo punto. Ad esempio, voglio essere in grado di aprire la griglia quando viene filtrata su ID = 3.

Quindi ho già provato a caricare la pagina con gli stessi parametri URL della richiesta XHR, nonché semplicemente aggiungendo gli unici parametri richiesti:

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

Così come:

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

Entrambi senza successo. Quindi, come posso pre-riempire i filtri utilizzando l'URL?

Modificare:

Non sono sicuro che si tratti di un duplicato dell'altra domanda (come indicato nei commenti seguenti). Nel mio caso, sto usando un tipo virtuale come raccolta per la mia griglia:

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

Quindi non è che ho una classe Block fisica per il mio widget della griglia, è puramente creata con un componente XML dell'interfaccia utente che elenca XML.

Ciononostante, controllerò comunque se la domanda a cui mi rivolgerò aiuterà il mio caso d'uso.



2
@RaphaelatDigitalPianism Non penso che questo sia un duplicato. La domanda che hai collegato parla delle griglie costruite in un modo vecchio stile. Qualcosa tra blocchi della griglia e componenti dell'interfaccia utente. Fondamentalmente era qualcosa in cui avevi ancora i blocchi della griglia ma erano configurati in un file XML invece del prepareColumnsmetodo.
Marius

@Marius voto ritirato;)
Raffaello al Pianismo digitale

1
Ho modificato la mia domanda, poiché anche io non penso che questo sia un duplicato (ho fatto le mie ricerche ;-))
Giel Berkers,

@Giel Berkers Ricevo lo stesso problema
bhargav shastri,

Risposte:


9

Ecco cosa ho scoperto finora.
Questo non è completo ma può portarti sulla strada giusta.
Ho condotto i miei test modificando la pagina cms che elenca il componente dell'interfaccia utente.
Ho aggiunto questo

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

in cms_page_listing.xmlall'interno del nodo dataSource dentro l'argomento / dati di configurazione. Quindi ora sembra così

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

Questo mi permette di chiamare l'URL ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
E vedo solo la pagina con ID 2.
Ma non funziona per i filtri di intervallo e il valore del filtro non è compilato. Viene comunque visualizzato come vuoto.

Ora ecco perché questo è possibile.

La classe dataProvider per le pagine cms è Magento\Cms\Ui\Component\DataProvider.
Questo si estende Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Quest'ultimo contiene un metodo protetto chiamatoprepareUpdateUrl

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

Quello che fa è controllare nella configurazione del componente dell'interfaccia utente se esiste un elemento chiamato filter_url_params. Se esiste, prende tutti i valori al suo interno e controlla la richiesta di valori corrispondenti a ciò che è definito in filter_url_params.
Ma per impostazione predefinita funziona solo con eq.

Quello che puoi provare è avere un DataSource personalizzato per il tuo componente in cui riscrivi il metodo prepareUpdateUrle lo fai prendere in considerazione tutte le variabili di richiesta di cui hai bisogno e magari aggiungere il paging ad esso e filtrare l'intervallo.

Nota a margine: questa è una domanda molto interessante. Sono sicuro che molte persone avranno bisogno di questo in futuro.


Grazie @ Mario per la tua risposta. Questo funziona per la mia situazione, perché il collegamento deve sempre filtrare per un ID, non per un intervallo (l'intervallo è più o meno una funzionalità, ma non richiesto dal mio URL). La tua risposta e la tua spiegazione mi hanno aiutato molto!
Giel Berkers,

1
@Marius posso usare l'URL in questo modo ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, perché sto usando $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])in UiCompnent / Listing / Column
ragazzo semplice

come faccio a utilizzare più di un parametro per filtrare, ad esempio ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> fornendo tre parametri in <item name = "filter_url_params" xsi: type = "array"> funziona per singoli filtri ma non collettivamente.
Shathish,

@Marius! URA LIFE SAVER!
Zorox,

@Marius: hai idea di come utilizzare la funzionalità per più parametri URL come ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> as già specificato da Shathish
Ashish Raj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.