Sau khi đọc và gỡ lỗi các tập tin lõi Magento 2, tôi đã tìm thấy một giải pháp đơn giản và rõ ràng về vấn đề này. Việc truyền dữ liệu từ một biểu mẫu tùy chỉnh sang lưới tùy chỉnh bằng cách sử dụng hàm liệt kê UIComponent insertListing thực sự khó khăn và không được ghi lại.
Đối tượng Chèn Liệt kê có hai tham số trong thẻ: xuất và nhập mà tôi đã sử dụng trong danh sách của mình:
<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>
và sau nhiều giờ để hiểu và tìm ra giải pháp trên web, tôi không tìm thấy manh mối nào!
Vì vậy, tôi đã đọc tệp Magento Core và tôi đã phát hiện ra rằng Magento chia sẻ cách tạo lưới liệt kê lồng nhau trong dự án. Đôi khi, nó sử dụng phương thức chèn khối cũ và vài lần phương thức liệt kê UIComponent mới.
Tôi đã tìm thấy lưới liệt kê địa chỉ khách hàng tại khách hàng_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) và nó được định nghĩa là biến Parent_id /module-customer/view/base/ui_component/customer_form.xml) nhưng câu hỏi là:
Làm thế nào Magento chuyển dữ liệu từ biểu mẫu vào lưới liệt kê lồng nhau?
Magento truyền dữ liệu bởi PARAMETER QUERYSTRING!
Nếu bạn đọc tệp DataProvider.php, bạn sẽ ngạc nhiên vì nó nhận được biến Parent_id (khách hàng) bởi QUERYSTRING! Hãy xem /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php dòng 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;
}
nhưng làm cách nào để đặt tham số trong URL listgrid? Tôi đã tìm thấy tham số filterUrlParams nhưng cũng có một vấn đề kỳ lạ ở đây! Hãy xem đoạn mã nguồn dữ liệu này:
<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>
Tôi đã đặt Ticket_id bằng ký tự đại diện (*) có nghĩa là: lấy tất cả các vé! nhưng nếu bạn không đặt bất kỳ ID nào trong bộ lọcUrlParams URL insertListing KHÔNG BẤT K Ticket Ticket_id SET! Vậy tại sao?!
Giải pháp được cung cấp bởi @ hashish-raj không hiệu quả với tôi.
Đây là tất cả các bài đăng mà tôi đã đọc về vấn đề này:
Cuối cùng, tôi đã tìm thấy một cách giải quyết tạm thời bằng cách sử dụng phiên lõi và lưu trữ tham số Ticket_id trong phiên. Sau đó, trong dataprovider tùy chỉnh, tôi đã kiểm tra nó và tôi đã áp dụng nó vào bộ sưu tập:
/***
* @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);
}
Nếu bạn có cách giải quyết hoặc bạn đã hiểu cách Magento xử lý mối quan hệ này giữa UIComponent , hãy chia sẻ kiến thức của bạn!
Tôi đã mở một "tiền thưởng" ở đây: https://magento.stackexchange.com/a/306537/2004