Setelah membaca dan men-debug file inti Magento 2, saya telah menemukan solusi bersih dan sederhana tentang masalah ini. Mengirim data dari formulir kustom ke kisi kustom menggunakan insertListing UIComponen sangat sulit dan tidak didokumentasikan sama sekali.
Objek InsertListing memiliki dua parameter di bawah tag: ekspor dan impor yang telah saya gunakan dalam daftar saya:
<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>
dan setelah jam untuk memahami dan menemukan solusi di web, saya belum menemukan petunjuk apa pun!
Jadi saya telah membaca file Magento Core dan saya telah menemukan bahwa Magento menghubungkan cara untuk membuat grid daftar bersarang di proyek. Kadang-kadang menggunakan metode penyisipan blok lama dan beberapa kali metode daftar UIComponent baru.
Saya telah menemukan kisi daftar alamat pelanggan di customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) dan mendapatkan variabel parent_id yang didefinisikan dalam customer_form.xml (/ vendor / magento) /module-customer/view/base/ui_component/customer_form.xml) tetapi pertanyaannya adalah:
Bagaimana Magento meneruskan data dari formulir ke kisi daftar bersarang?
Magento meneruskan data oleh PARAMETER QUERYSTRING!
Jika Anda membaca file DataProvider.php Anda akan terkejut karena mendapat variabel parent_id (pelanggan) oleh QUERYSTRING! Lihatlah /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php baris 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;
}
tetapi bagaimana cara mengatur parameter di URL listinggrid? Saya telah menemukan parameter filterUrlParams tetapi ada masalah aneh juga di sini! Mari lihat kode sumber data yang terpotong ini:
<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>
Saya telah menetapkan ticket_id dengan wildcard (*) yang artinya: dapatkan semua tiket! tetapi jika Anda tidak menetapkan ID apa pun di filterUrlParams, URL insertListing TIDAK SETIAP ticket_id SET! Jadi kenapa?!
Solusi yang ditawarkan oleh @ hashish-raj tidak bekerja untuk saya.
Ini semua posting yang saya baca tentang masalah ini:
Pada akhirnya saya telah menemukan solusi sementara menggunakan sesi inti dan menyimpan parameter ticket_id dalam sesi tersebut. Kemudian di dataprovider khusus saya telah memeriksanya dan saya telah menerapkannya ke koleksi:
/***
* @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);
}
Jika Anda memiliki solusi atau Anda telah memahami bagaimana Magento menangani hubungan ini antara komponen UIC , silakan bagikan pengetahuan Anda!
Saya telah membuka "hadiah" di sini: https://magento.stackexchange.com/a/306537/2004