Cách truyền dữ liệu cho các thành phần ui khác DataProvider


9

Tôi có một thành phần UI lưới nằm trong bộ trường của một số dạng đã chỉnh sửa. Tôi cần chuyển một entity_idbiểu mẫu từ biểu mẫu chỉnh sửa sang lưới trong đó tôi có thể lọc bộ sưu tập một số mục theo một giá trị nào đó và lưới sẽ hiển thị kết quả phù hợp. Tôi đã tạo thành phần lưới bằng cách sử dụng thành phần insertListing.

<insertListing name="slide_grid">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="autoRender" xsi:type="boolean">true</item>
                <item name="source" xsi:type="string">slide</item>
                <item name="loading" xsi:type="boolean">true</item>
                <item name="dataScope" xsi:type="string">some_slider_slide_listing</item>
                <item name="externalProvider" xsi:type="string">${ $.ns }.some_slider_slide_listing_data_source</item>
                <item name="ns" xsi:type="string">some_slider_slide_listing</item>
                <item name="externalData" xsi:type="string">id</item>
                <item name="imports" xsi:type="array">
                    <item name="slider_id" xsi:type="string">${ $.provider }:data.entity_id</item>
                </item>
                <item name="exports" xsi:type="array">
                    <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
                </item>
            </item>
        </argument>
    </insertListing>

Để chuyển dữ liệu sang dataProvider bên ngoài tôi đang sử dụng

<item name="exports" xsi:type="array">
                <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
            </item>

Trong nhà cung cấp dữ liệu bên ngoài của tôi, tôi đang cố gắng để có được dữ liệu thông qua yêu cầu.

$this->request->getParam('slider_id');

Nhưng không có gì. Trên frontend, tôi thấy rằng Magento gửi yêu cầu ajax với tham số của tôi nhưng tôi không thể bắt được điều này trong DataProvider của mình và lọc bộ sưu tập.


Cách tiếp cận tôi nhận được từ mã lõi Magento 2 (Ví dụ trong các sản phẩm Công cụ sửa đổi biểu mẫu CustomOptions). Nhưng vì một số lý do, nó không hoạt động với tôi.
Sai lầm

Bạn có nhận được bất kỳ giải pháp nào cho vấn đề không ... Tôi đang đối mặt với cùng một vấn đề, vui lòng giúp đỡ nếu bạn đã giải quyết ...
Ashish Raj

Tôi đã tạo một thẻ insertListing giống như bạn nhưng yêu cầu ajax không có tham số của tôi trong thẻ xuất .... Bạn đã tìm thấy giải pháp chưa?
thanhdv2811

Câu trả lời:


1

Để thêm danh sách chèn theo param của thành phần cha mẹ, chúng ta có thể sử dụng mã bên dưới.

Ở đây externalProviderthẻ là để thêm nhà cung cấp nguồn của danh sách mà chúng tôi đang chèn.

importsThẻ ở đây được sử dụng để nhập param của nguồn dữ liệu biểu mẫu hiện tại

Ở đây exportsthẻ được sử dụng để xuất các tham số dữ liệu biểu mẫu hiện tại vào danh sách sẽ được chèn.

<insertListing name="slide_grid">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="autoRender" xsi:type="boolean">true</item>
            <item name="ns" xsi:type="string">slide_grid</item><-- data source of the inserted listing -->
            <item name="externalProvider" xsi:type="string">colors_one_listing.colors_one_listing_data_source</item><!-- your insert listing data provider source -->
            <item name="imports" xsi:type="array">
                <item name="spd_id" xsi:type="string">${ $.provider }:data.slider_id</item>
            </item>
            <item name="exports" xsi:type="array">
                <item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
            </item>
        </item>
    </argument>
</insertListing>

Thêm tham gia với cột có liên quan vào bộ sưu tập hiện tại để làm cho nó sử dụng theo hai cách:

  1. Lọc theo lưới dataSource> tên đối số> "dataProvider"> tên đối số> "data"> tên mặt hàng "config"> tên mặt hàng = "filter_url_params" => tên mặt hàng> "slide_id" .

Để biết thêm chi tiết kiểm tra mã dưới đây:

<dataSource name="..._listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">...\...\Ui\DataProvider\...\Grid\...DataProvider</argument>
        <argument name="name" xsi:type="string">..._listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">id</argument>
        <argument name="requestFieldName" xsi:type="string">slider_id</argument>
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
                <item name="update_url" xsi:type="url" path="mui/index/render"/>
                <item name="filter_url_params" xsi:type="array">
                    <item name="slider_id" xsi:type="string">*</item>
                </item>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </item>
        </argument>
    </argument>
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
        </item>
    </argument>
</dataSource>
  1. Lọc nhà cung cấp dữ liệu của danh sách chèn.

Trong nhà cung cấp dữ liệu, thêm bộ lọc cho thông số này:

$collection->addFieldToFilter('slider_id', $this->request->getParam('slider_id'));

Tôi thích làm theo tùy chọn 1.


dataProvider không có các tham số filter_url_params trong định nghĩa. Vui lòng cập nhật anwser của bạn.
Michelangelo

1

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.

nhập mô tả hình ảnh ở đây

Đố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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.