Magento2 invia ID insertList alla griglia


8

Come posso inviare un ID dal mio modulo a una griglia di inserimento inserzione?

Quello che voglio fare, nella mia forma, carico una griglia con Inserisci elenco.

In questa griglia voglio tutti i risultati con ID del modulo.

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

Di seguito è riportato il codice nella griglia

<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
Hai qualche soluzione per questo ... o per qualcun altro ... Sto anche affrontando lo stesso problema ... qualcuno può aiutarti?
Ashish Raj,

Risposte:


1

Per aggiungere un elenco di inserimenti in base al parametro del componente UI principale, possiamo usare il codice seguente.

Qui il externalProvidertag serve per aggiungere il provider di origine dell'inserzione che stiamo inserendo.

Qui il importstag viene utilizzato per importare i parametri dell'origine dati del modulo corrente

Qui il exportstag viene utilizzato per esportare i parametri dei dati del modulo corrente nell'elenco che verrà inserito.

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

Aggiungi join con la colonna pertinente alla raccolta corrente per utilizzarlo nel filtro del fornitore di dati dell'inserzione inserita.

Nel fornitore di dati aggiungi il filtro per questo parametro:

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

Ho provato il tuo esempio ma non funziona. Hai idea del perché non ottengo un ID genitore per il provider di rete?
Deep Joshi,

0

Devi impostare un valore per il parametro render_url su insertListing e quindi aggiornare questo URL all'interno del tuo provider di dati. È necessario eseguire questa azione due volte poiché sarà necessario disporre di un fornitore di dati per il componente del modulo e un altro specifico per il componente di elenco.

1 - Dichiarazione corretta del componente insertListing: (Venditore / Modulo / vista / 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 - Aggiungere le seguenti modifiche al fornitore di dati della pagina del modulo. Questo cambierà render_url aggiungendo il parametro "id" alla fine dell'URL:

(Fornitore / Modulo / Ui / DataProvider / [percorso-al-tuo-fornitore-dati.php] )

  • Aggiungi la classe RequestInterface:
  • Dichiarare l'attributo $ request sulla classe del provider di dati.
  • Aggiungi un oggetto RequestInterface al metodo __construct; chiama il metodo preparUpdateUrl ().
  • Aggiungi PrepUpdateUrl () alla tua classe:

Nota: non copiare / incollare l'intero blocco sottostante sul provider di dati. Invece, cherrypick i pezzi che mancano nel tuo codice

<?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 - Aggiorna il componente dell'inserzione. Deve avere un parametro updateUrl all'interno del componente DataSource:

(Fornitore / modulo / 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 - Aggiorna il tuo fornitore di dati di inserzione per modificare updateUrl sul componente di quotazione sopra

(Venditore / Modulo / Ui / DataProvider / [percorso-al-tuo-ELENCO-fornitore-dati.php] )

Nota: non copiare / incollare l'intero blocco sottostante sul provider di dati. Invece, cherrypick i pezzi che mancano nel tuo codice

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

        }

    }

Fammi sapere se hai ancora problemi. Potrei non essere in grado di rispondere ai commenti, ma posso aggiornare la mia risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.