Magento2 gửi ID insertListing vào lưới


8

Làm cách nào tôi có thể gửi id từ biểu mẫu của mình đến lưới Liệt kê chèn?

Những gì tôi muốn làm, là trong hình thức của tôi, tôi tải một lưới với chèn Liệt kê.

Trong lưới này tôi muốn tất cả các kết quả với id của mẫu.

<insertListing name="insertlisting_colors_one">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="autoRender" xsi:type="boolean">true</item>
                <item name="imports" xsi:type="array">
                    <item name="spd_id" xsi:type="string">${ $.provider }:data.spd_id</item>
                </item>
                <item name="ns" xsi:type="string">colors_one_grid</item>
            </item>
        </argument>
    </insertListing>

Dưới đây là mã trong lưới

<item name="filter_url_params" xsi:type="array">
                    <item name="color_amount" xsi:type="string">1</item>

                    <item name="spd_id" xsi:type="string">${ $.parentName }.spd_id</item>
                </item>

1
Bạn có nhận được giải pháp nào cho việc này ... hoặc bất cứ ai khác không .. Tôi cũng đang đối mặt với vấn đề tương tự ... bất cứ ai cũng có thể giúp đỡ?
Ashish Raj

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="insertlisting_colors_one">
    <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">colors_one_grid</item>
            <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.spd_id</item>
            </item>
            <item name="exports" xsi:type="array">
                <item name="spd_id" xsi:type="string">${ $.externalProvider }:params.spd_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ó được sử dụng trong bộ lọc nhà cung cấp dữ liệu của danh sách được chèn.

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

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

Tôi đã thử ví dụ của bạn nhưng nó không hoạt động. Bạn có biết tại sao tôi không nhận được id cha cho nhà cung cấp lưới không?
Sâu Joshi

0

Bạn cần phải thiết lập một giá trị cho tham số render_url trên insertListing và sau đó cập nhật này bên URL của nhà cung cấp dữ liệu của bạn. Cần thực hiện hành động này hai lần vì bạn sẽ cần phải có một Nhà cung cấp dữ liệu cho thành phần biểu mẫu của mình và một hành động cụ thể khác cho thành phần liệt kê.

1 - Khai báo đúng của thành phần insertListing: (Nhà cung cấp / Mô-đun / view / adminhtml / ui_component / eller_module_form.xml)

<insertListing name="testInsertListing">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="dataLinks" xsi:type="array">
                    <item name="imports" xsi:type="boolean">false</item>
                    <item name="exports" xsi:type="boolean">true</item>
                </item>
                <item name="autoRender" xsi:type="boolean">true</item>
                <!-- the namespace attribute should be the name of the listing XML file -->
                <item name="ns" xsi:type="string">vendor_module_listing</item>
                <!-- This is the default render_url. We are going to update this value
                    in the DataProvider -->
                <item name="render_url" xsi:type="url" path="mui/index/render"/>
                <!-- Here we add the parameters that we want to add to the render_url. -->
                <item name="filter_url_params" xsi:type="array">
                    <!-- You can add as many as you want -->
                    <item name="id" xsi:type="string">*</item>
                </item>
                <item name="storageConfig" xsi:type="array">
                    <item name="indexField" xsi:type="string">id</item>
                </item>
            </item>
        </argument>
    </insertListing>

2 - Thêm các thay đổi sau vào Nhà cung cấp dữ liệu của trang Biểu mẫu. Điều này sẽ thay đổi render_url bằng cách thêm tham số "id" vào cuối URL:

(Nhà cung cấp / Mô-đun / Ui / DataProvider / [đường dẫn đến dữ liệu của bạn-nhà cung cấp.php] )

  • Thêm lớp RequestInterface:
  • Khai báo thuộc tính $ request trên lớp Nhà cung cấp dữ liệu của bạn.
  • Thêm một đối tượng RequestInterface vào phương thức __construct; gọi phương thức chuẩn bịUpUpateUrl ().
  • Thêm chuẩn bịUpUpateUrl () vào lớp của bạn:

Lưu ý: không sao chép / dán toàn bộ khối bên dưới vào Nhà cung cấp dữ liệu của bạn. Thay vào đó, hãy chọn các phần bị thiếu trong mã của bạn

<?php use Magento\Framework\App\RequestInterface;
use Magento\Framework\UrlInterface;

class MyListingDataProvider extends AbstractDataProvider
{
    protected $data;
    protected $meta;
    protected $collection;
    protected $urlBuilder;

    public function __construct(
        string $name,
        string $primaryFieldName,
        string $requestFieldName,
        Collection $collection,
        RequestInterface $request,
        UrlInterface $urlBuilder,
        array $meta = [],
        array $data = []
    )
    {
        $this->collection = $collection;
        $this->data = $data;
        $this->meta = $meta;
        $this->request = $request;
        $this->urlBuilder = $urlBuilder;

        $this->prepareUpdateUrl();

        parent::__construct($name, $primaryFieldName, $requestFieldName, $this->meta, $data);
    }

    protected function prepareUpdateUrl()
    {
        $id = $this->request->getParam('id');

        $this->meta = array_replace_recursive(
            $this->meta,
            [
                'testInsertListing' =>
                    ['arguments' => [
                        'data' => [
                            'config' => [
                                'render_url' => $this->urlBuilder
                                    ->getUrl('mui/index/render/id/' . $id),
                                'update_url' => $this->urlBuilder->getUrl('mui/index/render/id/' . $id)
                            ]
                        ],
                    ]
                ]
            ]
        );
    }

    //Implement the other methods you need
}

3 - Cập nhật thành phần danh sách của bạn. Nó phải có một tham số updateUrl bên trong thành phần DataSource:

(Nhà cung cấp / Mô-đun / lượt xem / adminhtml / ui_component / eller_module_listing.xml)

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">
                vendor_module_listing.module_listing_data_source
            </item>
        </item>
    </argument>
    <settings>
        <spinner>vendor_module_listing_columns</spinner>
        <deps>
            <dep>vendor_module_listing.module_listing_data_source</dep>
        </deps>
    </settings>
    <dataSource name="module_listing_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Vendor\Module\Ui\DataProvider\[name-of-your-listing-data-provider-class]</argument>
            <argument name="name" xsi:type="string">module_listing_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id</argument>
            <argument name="requestFieldName" xsi:type="string">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="storageConfig" xsi:type="array">
                        <item name="indexField" xsi:type="string">id</item>
                    </item>
                    <!-- fields to be added to the URL when retrieving the data -->
                    <item name="filter_url_params" xsi:type="array">
                        <item name="id" xsi:type="string">*</item>
                    </item>
                </item>
            </argument>
        </argument>
    </dataSource>
    <columns name="vendor_module_listing_columns">

        <!-- Declare your columns here -->

    </columns>
</listing>

4 - Cập nhật Nhà cung cấp dữ liệu danh sách của bạn để thay đổi updateUrl trên thành phần liệt kê ở trên

(Nhà cung cấp / Mô-đun / Ui / DataProvider / [path-to-your-LISTING-data-day.php] )

Lưu ý: không sao chép / dán toàn bộ khối bên dưới vào Nhà cung cấp dữ liệu của bạn. Thay vào đó, hãy chọn các phần bị thiếu trong mã của bạn

 <?php

    use Magento\Framework\App\RequestInterface;

    class MyListingDataProvider extends AbstractDataProvider
    {
        protected $request; 

        public function __construct(
            string $name,
            string $primaryFieldName,
            string $requestFieldName,
            Collection $collection,
            RequestInterface $request,
            array $meta = [],
            array $data = []
        )
        {
            $this->collection = $collection;
            $this->request = $request;
            $this->data = $data;

            parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);

            $this->prepareUpdateUrl();
        }

        protected function prepareUpdateUrl()
        {
            if (!isset($this->data['config']['filter_url_params'])) {
                return;
            }

            foreach ($this->data['config']['filter_url_params']
                     as $paramName => $paramValue) {
                if ('*' == $paramValue) {
                    $paramValue = $this->request->getParam($paramName);
                }
                if ($paramValue) {
                    $this->data['config']['update_url'] = sprintf(
                        '%s%s/%s/',
                        $this->data['config']['update_url'],
                        $paramName,
                        $paramValue
                    );
                }
            }
        }

         //Get the parameter "id" inside of the getData() method:

        public function getData()
        {
        $item_id = $this->request->getParam('id');

        //Apply a filter to your collection using $item_id

        /**
        Return your data in the appropriate format
        $totalRecords should be an integer
        $items should be an array
        */
        return array('totalRecords' => $totalRecords, 'items' => $items);

        }

    }

Hãy cho tôi biết nếu bạn vẫn có bất kỳ vấn đề. Tôi có thể không trả lời được các bình luận nhưng tôi có thể cập nhật câu trả lời của mình.

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.