Ich habe eine Raster-UI-Komponente, die sich innerhalb des Feldsatzes eines bearbeiteten Formulars befindet. Ich muss ein entity_id
Formular aus dem Bearbeitungsformular an das Raster übergeben, in dem ich die Sammlung einiger Elemente nach einem bestimmten Wert filtern kann, und das Raster zeigt das entsprechende Ergebnis an. Ich habe die Rasterkomponente mit einer insertListing-Komponente erstellt.
<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>
Für die Übertragung von Daten an einen externen dataProvider verwende ich
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
In meinem externen Datenprovider versuche ich, die Daten auf Anfrage zu erhalten.
$this->request->getParam('slider_id');
Aber nichts. Im Frontend habe ich festgestellt, dass Magento eine Ajax-Anfrage mit meinem Parameter sendet, aber ich kann dies in meinem DataProvider nicht abfangen und die Sammlung filtern.
magento2
uicomponent
data-provider
Geheimnis
quelle
quelle
Antworten:
Für das Hinzufügen einer Insert-Liste nach Parameter der übergeordneten UI-Komponente können wir den folgenden Code verwenden.
Das
externalProvider
Tag dient zum Hinzufügen eines Quellanbieters der Liste, die wir einfügen.Hier wird das
imports
Tag für den Importparameter der aktuellen Formulardatenquelle verwendetHier wird das
exports
Tag zum Exportieren der aktuellen Formulardatenparameter in die Liste verwendet, die eingefügt werden soll.Fügen Sie der aktuellen Sammlung einen Join mit der entsprechenden Spalte hinzu, damit er auf zwei Arten verwendet werden kann:
Weitere Informationen finden Sie im folgenden Code:
Fügen Sie im Datenprovider Filter für diesen Parameter hinzu:
Ich folge gerne Option 1.
quelle
Nach dem Lesen und Debuggen der Magento 2-Kerndateien habe ich eine saubere und einfache Lösung für dieses Problem gefunden. Das Übergeben von Daten aus einem benutzerdefinierten Formular an ein benutzerdefiniertes Raster mithilfe der UIComponent insertListing ist sehr schwierig und überhaupt nicht dokumentiert.
Das InsertListing-Objekt verfügt über zwei Parameter unter dem Tag: Exporte und Importe, die ich in meiner Liste verwendet habe:
und nach Stunden, um eine Lösung im Web zu verstehen und zu finden, habe ich keinen Hinweis gefunden!
Ich habe also die Magento Core-Datei gelesen und festgestellt, dass Magento die Methode zum Erstellen der verschachtelten Auflistungsraster im Projekt miteinander verbindet. Manchmal wird die alte Blockeinfügemethode und einige Male die neue UIComponent-Listungsmethode verwendet.
Ich habe das Raster für die Auflistung der Kundenadressen in der Datei customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) gefunden und es wird die in der customer_form.xml (/ vendor / magento definierte Variable parent_id) abgerufen /module-customer/view/base/ui_component/customer_form.xml) aber die Frage ist:
Wie übergibt Magento die Daten aus dem Formular an das verschachtelte Listenraster?
Magento übergibt die Daten an den QUERYSTRING PARAMETER!
Wenn Sie die Datei DataProvider.php lesen, werden Sie überrascht sein, da sie die Variable parent_id (customer) vom QUERYSTRING erhält! Schauen Sie sich die Zeile 58 unter /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php an:
aber wie setze ich den Parameter in der Listinggrid-URL? Ich habe den Parameter filterUrlParams gefunden, aber auch hier gibt es ein merkwürdiges Problem! Schauen wir uns diesen Ausschnitt aus dem dataSource-Code an:
Ich habe die ticket_id mit einem Platzhalter (*) gesetzt, der bedeutet: alle Tickets erhalten! Wenn Sie jedoch keine ID in den filterUrlParams festlegen, hat die insertListing-URL KEINE ticket_id SET! Warum also?!
Die von @ hashish-raj angebotene Lösung funktioniert bei mir nicht.
Dies sind alle Beiträge, die ich zu diesem Thema gelesen habe:
Am Ende habe ich eine temporäre Problemumgehung mithilfe der Kernsitzung gefunden und den Parameter ticket_id in der Sitzung gespeichert. Dann habe ich es im benutzerdefinierten Datenprovider überprüft und auf die Sammlung angewendet:
Wenn Sie eine Problemumgehung haben oder verstanden haben, wie Magento mit dieser Beziehung zwischen der UIComponent umgeht , teilen Sie bitte Ihr Wissen mit!
Ich habe hier ein "Kopfgeld" eröffnet: https://magento.stackexchange.com/a/306537/2004
quelle