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:
<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>
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:
/**
* 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;
}
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é:
<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>
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:
/***
* @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);
}
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