Magento 2のコアファイルを読んでデバッグしたところ、この問題に関する簡潔でシンプルな解決策が見つかりました。UIComponent insertListingを使用してカスタムフォームからカスタムグリッドにデータを渡すのは非常に難しく、まったく文書化されていません。
InsertListingオブジェクトのタグの下には、リストで使用したエクスポートとインポートの2つのパラメーターがあります。
<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>
そして、何時間もかけてウェブ上で解決策を理解して見つけるために、何の手掛かりも見つけられませんでした!
Magento Coreファイルを読んだところ、Magentoがプロジェクト内にネストされたリストグリッドを作成する方法をメッシュ化していることがわかりました。古いブロック挿入メソッドを使用したり、新しいUIComponentリストメソッドを使用したりすることもあります。
customer_address_listing.xml(/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml)で顧客の住所一覧グリッドを見つけ、customer_form.xmlで定義されたparent_id変数(/ vendor / magento)を取得します/module-customer/view/base/ui_component/customer_form.xml)ですが、問題は次のとおりです。
Magentoがフォームからネストされたリストグリッドにデータを渡す方法を教えてください。
MagentoはQUERYSTRING PARAMETERによってデータを渡します!
DataProvider.phpファイルを読むと、QUERYSTRINGによってparent_id(顧客)変数を取得するため、驚かれることでしょう!/vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php行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;
}
しかし、listinggrid URLでパラメーターを設定するにはどうすればよいですか?filterUrlParamsパラメータを見つけましたが、ここにも奇妙な問題があります!このdataSourceコードの一部を見てみましょう。
<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>
ticket_idにワイルドカード(*)を設定しました。つまり、すべてのチケットを取得します。しかし、filterUrlParamsにIDを設定しない場合、insertListing URLにはticket_idが設定されていません。なぜ?!
@ hashish-rajが提供するソリューションは、私には機能しません。
これらは私がこの問題について読んだすべての投稿です:
最後に、コアセッションを使用して一時的な回避策を見つけ、ticket_idパラメータをセッションに保存しました。次に、カスタムデータプロバイダーでチェックして、コレクションに適用しました。
/***
* @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);
}
回避策がある場合、またはMagentoがUIComponent間のこの関係を処理する方法を理解している場合は、知識を共有してください!
ここで「バウンティ」をオープンしました:https : //magento.stackexchange.com/a/306537/2004