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:
<fieldset name="relatedto" >
<settings>
<label>Related to</label>
<componentType>fieldset</componentType>
</settings>
<insertListing name="threadrelated_listing">
<settings>
<dataLinks>
<exports>false</exports>
<imports>true</imports>
</dataLinks>
<externalProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing_data_source</externalProvider>
<selectionsProvider>mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_listing.mycompany_helpdesk_threadrelated_columns.ids</selectionsProvider>
<autoRender>true</autoRender>
<dataScope>mycompany_helpdesk_threadrelated_listing</dataScope>
<ns>mycompany_helpdesk_threadrelated_listing</ns>
<exports>
<link name="ticket_id">${ $.externalProvider }:params.ticket_id</link>
</exports>
<imports>
<link name="ticket_id">${ $.provider }:data.ticket_id</link>
</imports>
</settings>
</insertListing>
</fieldset>
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:
/**
* Add country key for default billing/shipping blocks on customer addresses tab
*
* @return array
*/
public function getData(): array
{
$collection = $this->getCollection();
$data['items'] = [];
if ($this->request->getParam('parent_id')) {
$collection->addFieldToFilter('parent_id', $this->request->getParam('parent_id'));
$data = $collection->toArray();
}
foreach ($data['items'] as $key => $item) {
if (isset($item['country_id']) && !isset($item['country'])) {
$data['items'][$key]['country'] = $this->countryDirectory->loadByCode($item['country_id'])->getName();
}
}
return $data;
}
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:
<dataSource name="mycompany_helpdesk_threadrelated_listing_data_source" component="Magento_Ui/js/grid/provider">
<settings>
<filterUrlParams>
<param name="ticket_id">*</param>
</filterUrlParams>
<storageConfig>
<param name="indexField" xsi:type="string">threadrelated_id</param>
</storageConfig>
<updateUrl path="mui/index/render"/>
</settings>
<dataProvider class="mycompany\Helpdesk\Ui\DataProvider\Threadrelated\ThreadRelatedDataProvider" name="mycompany_helpdesk_threadrelated_listing_data_source">
<settings>
<requestFieldName>id</requestFieldName>
<primaryFieldName>threadrelated_id</primaryFieldName>
</settings>
</dataProvider>
</dataSource>
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:
/***
* @return array
*/
public function getData()
{
$collection = $this->getSearchResult();
/** see: check Mycompany\Helpdesk\Controller\Adminhtml\Ticket\Edit **/
if($this->coreSession->getTicketId()){
$collection->addFieldToFilter('ticket_id', ['eq' => $this->coreSession->getTicketId()]);
}
return $this->searchResultToOutput($collection);
}
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