Magento2 отправить ID insertListing в сетку

8

Как я могу отправить идентификатор из моей формы в сетку листинга вставки?

То, что я хочу сделать, в моей форме я загружаю сетку с листингом вставки.

В этой сетке я хочу все результаты с идентификатором формы.

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

Ниже приведен код в сетке

<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>
Johan
источник
1
У вас есть какое-то решение для этого ... или кого-то еще ... Я тоже сталкиваюсь с той же проблемой ... кто-нибудь может помочь?
Ашиш Радж

Ответы:

1

Для добавления списка вставки по параметру родительского пользовательского интерфейса мы можем использовать приведенный ниже код.

Здесь externalProviderтэг для добавления поставщика источника списка, который мы вставляем.

Здесь importsтэг используется для импорта параметров текущего источника данных формы

Здесь exportsтег используется для экспорта текущих параметров данных формы в листинг, который будет вставлен.

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

Добавьте объединение с соответствующим столбцом в текущую коллекцию, чтобы использовать его в фильтре поставщика данных вставленного списка.

В поставщике данных добавьте фильтр для этого параметра:

$collection->addFieldToFilter('spd_id', $this->request->getParam('spd_id'));
Ашиш Радж
источник
Я попробовал ваш пример, но он не работает. Есть ли у вас какие-либо идеи, почему я не получаю родительский идентификатор для провайдера сетки?
Глубокий Джоши
0

Вам нужно установить значение для параметра render_url в insertListing, а затем обновить этот URL в вашем провайдере данных. Необходимо выполнить это действие дважды, так как вам потребуется один поставщик данных для компонента формы, а другой - для компонента листинга.

1 - правильное объявление компонента insertListing: (Vendor / Module / view / adminhtml / ui_component / vendor_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 - Добавьте следующие изменения в поставщик данных на странице формы. Это изменит render_url, добавив параметр «id» в конец URL:

(Поставщик / Модуль / Пользовательский интерфейс / DataProvider / [путь-к-вашим-данным-поставщику.php] )

  • Добавьте класс RequestInterface:
  • Объявите атрибут $ request для вашего класса провайдера данных.
  • Добавьте объект RequestInterface в метод __construct; вызовите метод prepareUpdateUrl ().
  • Добавьте prepareUpdateUrl () к вашему классу:

Примечание: не копируйте / вставляйте весь блок ниже на вашем провайдере данных. Вместо этого выберите те части, которые отсутствуют в вашем коде

<?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 - Обновите свой листинговый компонент. Он должен иметь параметр updateUrl внутри компонента DataSource:

(Vendor / модуль / вид / adminhtml / ui_component / vendor_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 - Обновите ваш провайдер данных листинга, чтобы изменить updateUrl для вышеуказанного компонента листинга

(Поставщик / Модуль / Пользовательский интерфейс / DataProvider / [путь к вашему LISTING-data-provider.php] )

Примечание: не копируйте / вставляйте весь блок ниже на вашем провайдере данных. Вместо этого выберите те части, которые отсутствуют в вашем коде

 <?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);

        }

    }

Дайте мне знать, если у вас все еще есть проблемы. Я не могу ответить на комментарии, но могу обновить свой ответ.

Андреса Мартинс
источник