Cara meneruskan data ke komponen ui lainnya, DataProvider


9

Saya memiliki komponen UI jaringan yang berada di dalam fieldset dari beberapa bentuk yang diedit. Saya perlu meneruskan entity_iddari formulir edit ke kisi di mana saya dapat memfilter koleksi beberapa item berdasarkan nilai tertentu, dan kisi akan menampilkan hasil yang sesuai. Saya membuat komponen grid menggunakan komponen 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>

Untuk mentransfer data ke penyedia data eksternal, saya menggunakan

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

Di dalam penyedia data eksternal saya mencoba mendapatkan data melalui permintaan.

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

Tapi tidak ada apa-apa. Di frontend, saya menemukan bahwa Magento mengirim permintaan ajax dengan parameter saya tetapi saya tidak dapat menangkap ini di DataProvider saya dan memfilter koleksi.


Pendekatan yang saya dapatkan dari kode inti Magento 2 (Misalnya dalam produk CustomOptions dari Modifier). Tetapi untuk beberapa alasan itu tidak bekerja untuk saya.
Misteri

Apakah Anda mendapatkan solusi dari masalah ini ... Saya menghadapi masalah yang sama, tolong bantu jika Anda telah menyelesaikan ...
Ashish Raj

Saya membuat tag insertListing yang sama seperti Anda tetapi permintaan ajax tidak memiliki parameter saya di tag ekspor .... Apakah Anda menemukan solusinya?
thanhdv2811

Jawaban:


2

Untuk menambahkan cantuman sisipan oleh param komponen induk ui, kita dapat menggunakan kode di bawah ini.

Di sini externalProvidertag adalah untuk menambahkan penyedia sumber cantuman yang kami sisipkan.

Di sini importstag digunakan untuk impor param sumber data formulir saat ini

Di sini exportstag digunakan untuk mengekspor params data formulir saat ini ke cantuman yang akan disisipkan.

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

Tambahkan bergabung dengan kolom yang relevan ke koleksi saat ini untuk menggunakannya dengan dua cara:

  1. Saring berdasarkan kisi dataSource> nama argumen> "dataProvider"> nama argumen> "data"> nama item "config"> nama item = "filter_url_params" => nama item> "slider_id" .

Untuk detail lebih lanjut, periksa kode di bawah ini:

<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. Saring penyedia data dari cantuman yang dimasukkan.

Di penyedia data tambahkan filter untuk param ini:

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

Saya suka mengikuti opsi 1.


dataProvider tidak memiliki parameter filter_url_params dalam definisi. Harap perbarui server Anda.
Michelangelo

1

Setelah membaca dan men-debug file inti Magento 2, saya telah menemukan solusi bersih dan sederhana tentang masalah ini. Mengirim data dari formulir kustom ke kisi kustom menggunakan insertListing UIComponen sangat sulit dan tidak didokumentasikan sama sekali.

masukkan deskripsi gambar di sini

Objek InsertListing memiliki dua parameter di bawah tag: ekspor dan impor yang telah saya gunakan dalam daftar saya:

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

dan setelah jam untuk memahami dan menemukan solusi di web, saya belum menemukan petunjuk apa pun!

Jadi saya telah membaca file Magento Core dan saya telah menemukan bahwa Magento menghubungkan cara untuk membuat grid daftar bersarang di proyek. Kadang-kadang menggunakan metode penyisipan blok lama dan beberapa kali metode daftar UIComponent baru.

Saya telah menemukan kisi daftar alamat pelanggan di customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) dan mendapatkan variabel parent_id yang didefinisikan dalam customer_form.xml (/ vendor / magento) /module-customer/view/base/ui_component/customer_form.xml) tetapi pertanyaannya adalah:

Bagaimana Magento meneruskan data dari formulir ke kisi daftar bersarang?

Magento meneruskan data oleh PARAMETER QUERYSTRING!

Jika Anda membaca file DataProvider.php Anda akan terkejut karena mendapat variabel parent_id (pelanggan) oleh QUERYSTRING! Lihatlah /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php baris 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;
}

tetapi bagaimana cara mengatur parameter di URL listinggrid? Saya telah menemukan parameter filterUrlParams tetapi ada masalah aneh juga di sini! Mari lihat kode sumber data yang terpotong ini:

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

Saya telah menetapkan ticket_id dengan wildcard (*) yang artinya: dapatkan semua tiket! tetapi jika Anda tidak menetapkan ID apa pun di filterUrlParams, URL insertListing TIDAK SETIAP ticket_id SET! Jadi kenapa?!

Solusi yang ditawarkan oleh @ hashish-raj tidak bekerja untuk saya.

Ini semua posting yang saya baca tentang masalah ini:

Pada akhirnya saya telah menemukan solusi sementara menggunakan sesi inti dan menyimpan parameter ticket_id dalam sesi tersebut. Kemudian di dataprovider khusus saya telah memeriksanya dan saya telah menerapkannya ke koleksi:

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

}

Jika Anda memiliki solusi atau Anda telah memahami bagaimana Magento menangani hubungan ini antara komponen UIC , silakan bagikan pengetahuan Anda!

Saya telah membuka "hadiah" di sini: https://magento.stackexchange.com/a/306537/2004

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.