J'ai un composant d'interface utilisateur de grille qui se trouve à l'intérieur de fieldset d'une forme modifiée. J'ai besoin de passer d'un entity_id
formulaire d'édition à une grille où je peux filtrer la collection de certains éléments par une certaine valeur, et la grille affichera le résultat approprié. J'ai créé le composant de grille à l'aide d'un composant insertListing.
<insertListing name="slide_grid">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="autoRender" xsi:type="boolean">true</item>
<item name="source" xsi:type="string">slide</item>
<item name="loading" xsi:type="boolean">true</item>
<item name="dataScope" xsi:type="string">some_slider_slide_listing</item>
<item name="externalProvider" xsi:type="string">${ $.ns }.some_slider_slide_listing_data_source</item>
<item name="ns" xsi:type="string">some_slider_slide_listing</item>
<item name="externalData" xsi:type="string">id</item>
<item name="imports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.provider }:data.entity_id</item>
</item>
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
</item>
</argument>
</insertListing>
Pour transférer des données vers des données externes Fournisseur que j'utilise
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
Dans mon fournisseur de données externe, j'essaie d'obtenir les données par le biais d'une demande.
$this->request->getParam('slider_id');
Mais rien. Sur le frontend, j'ai trouvé que Magento envoyait une requête ajax avec mon paramètre mais je ne peux pas attraper cela dans mon DataProvider et filtrer la collection.
magento2
uicomponent
data-provider
Mystère
la source
la source
Réponses:
Pour ajouter une liste d'insertions par paramètre du composant ui parent, nous pouvons utiliser le code ci-dessous.
Ici, la
externalProvider
balise est pour ajouter le fournisseur source de la liste que nous insérons.Ici, la
imports
balise est utilisée pour importer les paramètres de la source de données du formulaire actuelIci, la
exports
balise est utilisée pour exporter les paramètres de données de formulaire actuels vers la liste qui va être insérée.Ajoutez la jointure avec la colonne appropriée à la collection actuelle pour l'utiliser de deux manières:
Pour plus de détails, vérifiez le code ci-dessous:
Dans le fournisseur de données, ajoutez un filtre pour ce paramètre:
J'aime suivre l'option 1.
la source
Après avoir lu et débogué les fichiers principaux de Magento 2, j'ai trouvé une solution propre et simple à ce problème. Passer des données d'un formulaire personnalisé à une grille personnalisée à l'aide de la liste d'insertion UIComponent est vraiment difficile et n'est pas du tout documenté.
L'objet InsertListing a deux paramètres sous la balise: les exportations et les importations que j'ai utilisées dans ma liste:
et après des heures pour comprendre et trouver une solution sur le web, je n'ai trouvé aucun indice!
J'ai donc lu le fichier Magento Core et j'ai découvert que Magento maillait la façon de créer les grilles de listes imbriquées dans le projet. Parfois, il utilise l'ancienne méthode d'insertion de blocs et quelques fois la nouvelle méthode de listage UIComponent.
J'ai trouvé la grille de liste d'adresses client dans customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) et obtient la variable parent_id définie dans customer_form.xml (/ vendor / magento /module-customer/view/base/ui_component/customer_form.xml) mais la question est:
Comment Magento transmet les données du formulaire à la grille de liste imbriquée?
Magento transmet les données par le PARAMÈTRE QUERYSTRING!
Si vous lisez le fichier DataProvider.php, vous serez surpris car il obtient la variable parent_id (client) par QUERYSTRING! Regardez /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php ligne 58:
mais comment définir le paramètre dans l'URL de la liste de diffusion? J'ai trouvé le paramètre filterUrlParams mais il y a aussi un problème étrange ici! Jetons un coup d'œil à ce code de dataSource coupé:
J'ai mis le ticket_id avec un caractère générique (*) que cela signifie: obtenez tous les billets! mais si vous ne définissez aucun ID dans filterUrlParams, l'URL insertListing N'A AUCUN SET ticket_id SET! Alors pourquoi?!
La solution proposée par @ hashish-raj ne fonctionne pas pour moi.
Ce sont tous les articles que j'ai lus sur ce problème:
À la fin, j'ai trouvé une solution de contournement temporaire en utilisant la session principale et stocke le paramètre ticket_id dans la session. Ensuite, dans le fournisseur de données personnalisé, je l'ai vérifié et je l'ai appliqué à la collection:
Si vous avez une solution de contournement ou si vous avez compris comment Magento gère cette relation entre l'UIComponent , veuillez partager vos connaissances!
J'ai ouvert une "prime" ici: https://magento.stackexchange.com/a/306537/2004
la source