Magento2 send ID insertListing to grid

8

Wie kann ich eine ID aus meinem Formular an ein Listenraster zum Einfügen senden?

Was ich tun möchte, ist in meinem Formular lade ich ein Raster mit Insert Listing.

In diesem Raster möchte ich alle Ergebnisse mit der ID des Formulars.

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

Unten ist der Code im Raster

<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
quelle
1
Bekommst du eine Lösung dafür ... oder irgendjemand anderes ... Ich stehe auch vor dem gleichen Problem ... kann jemand helfen?
Ashish Raj

Antworten:

1

Für das Hinzufügen einer Insert-Liste nach Parameter der übergeordneten UI-Komponente können wir den folgenden Code verwenden.

Das externalProviderTag dient zum Hinzufügen eines Quellanbieters der Liste, die wir einfügen.

Hier wird das importsTag für den Importparameter der aktuellen Formulardatenquelle verwendet

Hier wird das exportsTag zum Exportieren der aktuellen Formulardatenparameter in die Liste verwendet, die eingefügt werden soll.

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

Fügen Sie der aktuellen Sammlung einen Join mit der entsprechenden Spalte hinzu, damit der Datenanbieter der eingefügten Liste gefiltert werden kann.

Fügen Sie im Datenprovider Filter für diesen Parameter hinzu:

$collection->addFieldToFilter('spd_id', $this->request->getParam('spd_id'));
Ashish Raj
quelle
Ich habe Ihr Beispiel ausprobiert, aber es funktioniert nicht. Haben Sie eine Idee, warum ich keine übergeordnete ID an den Grid-Anbieter erhalte?
Deep Joshi
0

Sie müssen einen Wert für den Parameter render_url in der insertListing festlegen und diese URL dann in Ihrem Datenprovider aktualisieren. Diese Aktion muss zweimal ausgeführt werden, da Sie einen Datenprovider für Ihre Formularkomponente und einen anderen für die Auflistungskomponente benötigen.

1 - Richtige Deklaration der Komponente 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 - Fügen Sie dem Datenprovider der Formularseite die folgenden Änderungen hinzu. Dadurch wird die render_url geändert, indem der Parameter "id" am Ende der URL hinzugefügt wird:

(Vendor / Module / Ui / DataProvider / [Pfad zu Ihrem Datenprovider.php] )

  • Fügen Sie die RequestInterface-Klasse hinzu:
  • Deklarieren Sie das Attribut $ request in Ihrer Data Provider-Klasse.
  • Fügen Sie der __construct-Methode ein RequestInterface-Objekt hinzu. Rufen Sie die Methode prepareUpdateUrl () auf.
  • Fügen Sie Ihrer Klasse das prepareUpdateUrl () hinzu:

Hinweis: Kopieren Sie nicht den gesamten unten stehenden Block in Ihren Datenprovider. Wählen Sie stattdessen die Teile aus, die in Ihrem Code fehlen

<?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 - Aktualisieren Sie Ihre Listungskomponente. Es muss einen updateUrl-Parameter in der DataSource-Komponente enthalten:

(Vendor / Module / view / 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 - Aktualisieren Sie Ihren Listing Data Provider, um die updateUrl für die obige Listing-Komponente zu ändern

(Vendor / Module / Ui / DataProvider / [Pfad zu Ihrem LISTING-Datenprovider.php] )

Hinweis: Kopieren Sie nicht den gesamten unten stehenden Block in Ihren Datenprovider. Wählen Sie stattdessen die Teile aus, die in Ihrem Code fehlen

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

        }

    }

Lassen Sie mich wissen, wenn Sie noch Probleme haben. Ich kann möglicherweise nicht auf die Kommentare antworten, aber ich kann meine Antwort aktualisieren.

Andresa Martins
quelle