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_id
qui 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.
prepareColumns
méthode.Réponses:
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
dans
cms_page_listing.xml
le nœud dataSource à l'intérieur de l'argument data / config. Alors maintenant ça ressemble à çaCela 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ée
prepareUpdateUrl
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 dansfilter_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
prepareUpdateUrl
et 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.
la source
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