Come passare i dati a un altro DataProvider di componenti dell'interfaccia utente


9

Ho un componente dell'interfaccia utente della griglia che si trova all'interno del fieldset di qualche modulo modificato. Devo passare un entity_idmodulo di modifica alla griglia in cui posso filtrare la raccolta di alcuni elementi in base a un valore e la griglia mostrerà il risultato appropriato. Ho creato il componente griglia utilizzando un componente 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>

Per il trasferimento di dati a un provider di dati esterno che sto utilizzando

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

All'interno del mio fornitore di dati esterno sto cercando di ottenere i dati tramite richiesta.

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

Ma niente. Sul frontend, ho scoperto che Magento inviava una richiesta Ajax con il mio parametro ma non riesco a catturarlo nel mio DataProvider e filtrare la raccolta.


L'approccio che ho ottenuto dal codice di base di Magento 2 (ad esempio nei modificatori del modulo CustomOptions dei prodotti). Ma per qualche motivo non funziona per me.
Mistero

Hai trovato una soluzione al problema ... Sto affrontando lo stesso problema, per favore aiutami se hai risolto ...
Ashish Raj

Ho creato uno stesso tag insertListing come te ma la richiesta ajax non aveva il mio parametro nel tag export ... Hai trovato la soluzione?
Thanhdv2811,

Risposte:


2

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

Aggiungi un join con la colonna pertinente alla raccolta corrente per utilizzarlo in due modi:

  1. Filtro per griglia dataSource> nome argomento> "dataProvider"> nome argomento> "dati"> nome elemento "config"> nome elemento = "filter_url_params" => nome elemento> "slider_id" .

Per maggiori dettagli controlla sotto il codice:

<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. Filtra il fornitore di dati dell'elenco inserito.

Nel fornitore di dati aggiungi il filtro per questo parametro:

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

Mi piace seguire l'opzione 1.


dataProvider non ha i parametri filter_url_params nella definizione. Ti preghiamo di aggiornare il tuo anwser.
Michelangelo

1

Dopo aver letto e eseguito il debug dei file core di Magento 2, ho trovato una soluzione chiara e semplice su questo problema. Passare i dati da un modulo personalizzato a una griglia personalizzata utilizzando l'inserimento UIComponent è davvero difficile e non documentato affatto.

inserisci qui la descrizione dell'immagine

L'oggetto InsertListing ha due parametri sotto il tag: esportazioni e importazioni che ho usato nel mio elenco:

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

e dopo ore per capire e trovare una soluzione sul web, non ho trovato alcun indizio!

Quindi ho letto il file Magento Core e ho scoperto che Magento crea il mesh per creare le griglie di elenco nidificate nel progetto. A volte utilizza il vecchio metodo di inserimento blocchi e alcune volte il nuovo metodo di elenco UIComponent.

Ho trovato la griglia di elenco degli indirizzi dei clienti in customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) e ottiene la variabile parent_id definita in customer_form.xml (/ vendor / magento /module-customer/view/base/ui_component/customer_form.xml) ma la domanda è:

In che modo Magento passa i dati dal modulo alla griglia di elenco nidificata?

Magento passa i dati dal PARAMETRO QUERYSTRING!

Se leggi il file DataProvider.php rimarrai sorpreso perché ottiene la variabile parent_id (customer) da QUERYSTRING! Guarda /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php linea 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;
}

ma come posso impostare il parametro nell'URL listgrid? Ho trovato il parametro filterUrlParams ma c'è un problema strano anche qui! Dai un'occhiata a questo frammento di codice DataSource:

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

Ho impostato ticket_id con un carattere jolly (*) che significa: ottieni tutti i biglietti! ma se non si imposta alcun ID in filterUrlParams l'URL insertListing NON HA QUALSIASI SET_ID ticket! Allora perché ?!

La soluzione offerta da @ hashish-raj non funziona per me.

Questi sono tutti i post che ho letto su questo problema:

Alla fine ho trovato una soluzione temporanea utilizzando la sessione principale e memorizzando il parametro ticket_id nella sessione. Quindi nel dataprovider personalizzato l'ho verificato e l'ho applicato alla raccolta:

/***
 * @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);

}

Se hai una soluzione alternativa o hai capito come Magento gestisce questa relazione tra UIComponent , ti preghiamo di condividere le tue conoscenze!

Ho aperto una "taglia" qui: https://magento.stackexchange.com/a/306537/2004

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.