Magento 2: Bagaimana saya bisa memuat kisi admin dengan nilai filter yang ditentukan sebelumnya?

14

Saya ingin membuat tautan ke kisi khusus di admin saya dengan filter yang telah ditentukan. Kotak dibuat dengan Komponen Daftar UI (XML) dan memiliki kolom yang disebut form_idsetup seperti ini:

<column name="form_id">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="filter" xsi:type="string">textRange</item>
            <item name="label" xsi:type="string" translate="true">Form id</item>
        </item>
    </argument>
</column>

Grid berfungsi dengan baik. Saya dapat menerapkan filter dan semuanya berfungsi dengan baik. Kotak diperbarui dengan baik dengan permintaan XHR.

Namun ... Saya ingin dapat memiliki nilai filter yang telah ditentukan sebelumnya di beberapa titik. Misalnya, saya ingin dapat membuka kisi ketika difilter pada ID = 3.

Jadi saya sudah mencoba memuat halaman dengan parameter URL yang sama dengan permintaan XHR, serta hanya menambahkan satu-satunya parameter yang diperlukan:

?namespace=form_response_listing&search=&filters[placeholder]=true&filters[form_id][from]=3&filters[form_id][to]=3&paging[pageSize]=20&paging[current]=1

Sebaik:

?filters[form_id][from]=3&filters[form_id][to]=3

Keduanya tidak berhasil. Jadi, bagaimana saya dapat mengisi ulang filter dengan menggunakan URL?

Edit:

Saya tidak yakin apakah ini merupakan duplikat dari pertanyaan lain (sebagaimana disebutkan dalam komentar di bawah). Dalam kasus saya, saya menggunakan tipe virtual sebagai koleksi untuk kisi saya:

<virtualType name="Vendor\Module\Model\ResourceModel\Response\Grid\Collection"
             type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
    <arguments>
        <argument name="mainTable" xsi:type="string">vendormodule_form_response</argument>
        <argument name="resourceModel" xsi:type="string">Vendor\Module\Model\ResourceModel\Response</argument>
    </arguments>
</virtualType>

Jadi bukan karena saya memiliki kelas Blok fisik untuk widget kotak saya, ini murni dibuat dengan XML UI daftar Komponen.

Namun demikian, saya tetap akan memeriksa apakah pertanyaan yang dirujuk akan membantu kasus penggunaan saya.

Giel Berkers
sumber
Kemungkinan duplikat Untuk menambahkan filter default ke kotak di Magento2?
Raphael di Digital Pianism
2
@RaphaelatDigitalPianism Saya rasa ini bukan duplikat. Pertanyaan yang Anda tautkan adalah pembicaraan tentang kisi-kisi yang dibangun dengan cara lama. Sesuatu antara blok kotak dan komponen ui. Itu pada dasarnya sesuatu di mana Anda masih memiliki blok kotak tetapi mereka dikonfigurasi dalam file xml bukan prepareColumnsmetode.
Marius
@Marius vote retracted;)
Raphael di Digital Pianism
1
Saya mengedit pertanyaan saya, karena saya juga tidak berpikir ini adalah duplikat (saya sudah melakukan penelitian ;-))
Giel Berkers
@Giel Berkers Saya mendapatkan masalah yang sama
bhargav shastri

Jawaban:

9

Inilah yang saya temukan sejauh ini.
Ini tidak lengkap tetapi bisa membawa Anda di jalan yang benar.
Saya melakukan tes dengan memodifikasi halaman yang mencantumkan komponen ui.
Saya menambahkan ini

<item name="filter_url_params" xsi:type="array">
    <item name="page_id" xsi:type="string">*</item>
</item>

di cms_page_listing.xmldalam node dataSource di dalam argumen data / config. Jadi sekarang terlihat seperti ini

<dataSource name="cms_page_listing_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">Magento\Cms\Ui\Component\DataProvider</argument>
        <argument name="name" xsi:type="string">cms_page_listing_data_source</argument>
        <argument name="primaryFieldName" xsi:type="string">page_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">page_id</item>
                </item>
                <item name="filter_url_params" xsi:type="array"><!-- my addition -->
                    <item name="page_id" xsi:type="string">*</item>
                </item>
            </item>
        </argument>
    </argument>
</dataSource>

Ini memungkinkan saya untuk memanggil url ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Dan saya hanya melihat halaman dengan id 2.
Tetapi tidak berfungsi untuk filter rentang dan nilai filter tidak diisi. Ini masih terlihat kosong.

Sekarang inilah mengapa ini mungkin.

Kelas dataProvider untuk halaman cms adalah Magento\Cms\Ui\Component\DataProvider.
Yang ini meluas Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Yang terakhir ini berisi metode yang dilindungi yang disebutprepareUpdateUrl

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
            );
            $this->addFilter(
                $this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
            );
        }
    }
}

Apa yang dilakukan adalah memeriksa di konfigurasi komponen ui jika ada elemen yang dipanggil filter_url_params. Jika ada, dibutuhkan semua nilai di dalamnya dan memeriksa permintaan untuk nilai yang cocok dengan apa yang didefinisikan filter_url_params.
Tetapi secara default hanya berfungsi dengan eq.

Apa yang dapat Anda coba adalah memiliki sumber data khusus untuk komponen Anda di mana Anda menulis ulang metode prepareUpdateUrldan membuatnya mempertimbangkan semua variabel permintaan yang Anda butuhkan dan mungkin menambahkan paging untuk itu dan rentang pemfilteran.

Catatan: Ini adalah pertanyaan yang sangat menarik. Saya yakin banyak orang akan membutuhkan ini di masa depan.

Marius
sumber
Terima kasih @Marius atas jawaban Anda. Ini berfungsi untuk situasi saya, karena tautan selalu perlu difilter dengan satu ID, bukan oleh rentang (kisaran lebih atau kurang fitur, tetapi tidak diperlukan oleh URL saya). Jawaban Anda dan juga penjelasan Anda sangat membantu saya!
Giel Berkers
1
@Marius dapatkah saya menggunakan url seperti ini ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, karena saya menggunakan $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])di UiCompnent / Listing / Column
simple guy
bagaimana cara menggunakan lebih dari satu param untuk memfilter, yaitu ROOT / admin / cms / halaman / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> memberikan tiga params di bawah <nama item = "filter_url_params" xsi: type = "array"> bekerja untuk setiap filter tetapi tidak secara kolektif.
Shathish
@Marius! URA LIFE SAVER!
Zorox
@Marius: Apakah Anda punya ide, bagaimana menggunakan fungsionalitas untuk beberapa parameter url seperti ROOT / admin / cms / halaman / indeks / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> as sudah ditentukan oleh Shathish
Ashish Raj