Magento 2: Comment puis-je charger une grille d'administration avec des valeurs de filtre prédéfinies?

14

Je veux créer un lien vers une grille personnalisée dans mon administrateur avec des filtres prédéfinis. La grille est faite avec un composant de liste d'interface utilisateur (XML) et il a une colonne appelée form_idqui est configurée comme ceci:

<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 grille fonctionne très bien. Je peux appliquer le filtre et tout fonctionne bien. La grille est joliment mise à jour avec une demande XHR.

Cependant ... je veux pouvoir avoir une valeur de filtre prédéfinie à un moment donné. Par exemple, je veux pouvoir ouvrir la grille lorsqu'elle est filtrée sur ID = 3.

J'ai donc déjà essayé de charger la page avec les mêmes paramètres d'URL que la demande XHR, ainsi que d'ajouter simplement les seuls paramètres requis:

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

Aussi bien que:

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

Les deux sans succès. Alors, comment puis-je pré-remplir les filtres en utilisant l'URL?

Éditer:

Je ne sais pas s'il s'agit d'un double de l'autre question (comme mentionné dans les commentaires ci-dessous). Dans mon cas, j'utilise un type virtuel comme collection pour ma grille:

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

Ce n'est donc pas que j'ai une classe Block physique pour mon widget de grille, elle est purement créée avec un composant UI listant XML.

Néanmoins, je vais quand même vérifier si la question à laquelle je me réfère aidera mon cas d'utilisation.

Giel Berkers
la source
Duplication possible de Pour ajouter un filtre par défaut à la grille dans Magento2?
Raphael au Digital Pianism du
2
@RaphaelatDigitalPianism Je ne pense pas que ce soit un doublon. La question que vous avez liée parle des grilles construites à l'ancienne. Quelque chose entre les blocs de grille et les composants ui. C'était essentiellement quelque chose où vous aviez encore des blocs de grille mais ils étaient configurés dans un fichier xml au lieu de la prepareColumnsméthode.
Marius
@Marius vote retrired;)
Raphael au Digital Pianism
1
J'ai édité ma question, car je ne pense pas non plus que ce soit un doublon (j'ai fait mes recherches ;-))
Giel Berkers
@Giel Berkers J'obtiens le même problème
bhargav shastri

Réponses:

9

Voici ce que j'ai découvert jusqu'à présent.
Ce n'est pas complet mais cela peut vous emmener sur la bonne voie.
J'ai effectué mes tests en modifiant la page cms listant le composant ui.
J'ai ajouté ceci

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

dans cms_page_listing.xmlle nœud dataSource à l'intérieur de l'argument data / config. Alors maintenant ça ressemble à ça

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

Cela me permet d'appeler l'url ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Et je ne vois que la page avec l'ID 2.
Mais cela ne fonctionne pas pour les filtres de plage et la valeur du filtre n'est pas renseignée. Elle s'affiche toujours comme vide.

Voici maintenant pourquoi cela est possible.

La classe dataProvider pour les pages cms est Magento\Cms\Ui\Component\DataProvider.
Celui-ci s'étend Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Ce dernier contient une méthode protégée appeléeprepareUpdateUrl

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

Cela revient à vérifier dans la configuration du composant ui s'il y a un élément appelé filter_url_params. S'il y en a, il prend toutes les valeurs à l'intérieur et vérifie la demande de valeurs correspondant à ce qui est défini dans filter_url_params.
Mais par défaut, cela ne fonctionne qu'avec eq.

Ce que vous pouvez essayer, c'est d'avoir une source de données personnalisée pour votre composant où vous réécrivez la méthode prepareUpdateUrlet la faire prendre en compte toutes les variables de demande dont vous avez besoin et peut-être ajouter de la pagination et du filtrage de plage.

Note latérale: C'est une question très intéressante. Je suis sûr que beaucoup de gens en auront besoin à l'avenir.

Marius
la source
Merci @Marius pour votre réponse. Cela fonctionne pour ma situation, car le lien doit toujours filtrer par un ID, pas par une plage (la plage est plus ou moins une fonctionnalité, mais pas requise par mon URL). Votre réponse ainsi que votre explication m'ont beaucoup aidé!
Giel Berkers
1
@Marius puis-je utiliser l'URL comme ceci ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, parce que $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])j'utilise dans UiCompnent / Listing / Column
simple guy
comment utiliser plus d'un paramètre pour filtrer, c'est-à-dire ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> donnant trois paramètres sous <item name = "filter_url_params" xsi: type = "array"> fonctionne pour les filtres individuels mais pas collectivement.
Shathish
@Marius! URA LIFE SAVER!
Zorox
@Marius: Avez-vous une idée, comment utiliser la fonctionnalité pour plusieurs paramètres d'URL comme ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> as déjà spécifié par Shathish
Ashish Raj