在阅读并调试了Magento 2核心文件之后,我找到了一个关于此问题的干净简单的解决方案。使用UIComponent insertListing将数据从自定义表单传递到自定义网格非常困难,而且根本没有记录。
InsertListing对象在标签下有两个参数:我在清单中使用的导出和导入:
<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(/ vendor / magento)中定义的parent_id变量。 /module-customer/view/base/ui_component/customer_form.xml),但问题是:
Magento如何将数据从表单传递到嵌套列表网格?
Magento通过QUERYSTRING参数传递数据!
如果您阅读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 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 SET!所以为什么?!
@ 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