Magento 2: Wie kann ich ein Admin-Grid mit vordefinierten Filterwerten laden?

14

Ich möchte in meinem Administrator einen Link zu einem benutzerdefinierten Raster mit vordefinierten Filtern erstellen. Das Grid besteht aus einer UI Listing Component (XML) und hat eine Spalte mit dem Namen form_id, die wie folgt eingerichtet ist:

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

Das Gitter funktioniert gut. Ich kann den Filter anwenden und alles funktioniert gut. Das Raster wird mit einer XHR-Anfrage aktualisiert.

Allerdings ... Ich möchte in der Lage sein, irgendwann einen vordefinierten Filterwert zu erhalten. Zum Beispiel möchte ich in der Lage sein, das Raster zu öffnen, wenn es nach ID = 3 gefiltert wird.

Daher habe ich bereits versucht, die Seite mit den gleichen URL-Parametern wie die XHR-Anfrage zu laden und einfach die einzigen erforderlichen Parameter hinzuzufügen:

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

Ebenso gut wie:

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

Beides ohne Erfolg. Wie kann ich Filter mithilfe der URL vorab ausfüllen?

Bearbeiten:

Ich bin nicht sicher, ob dies ein Duplikat der anderen Frage ist (wie in den Kommentaren unten erwähnt). In meinem Fall verwende ich einen virtuellen Typ als Sammlung für mein Raster:

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

Es ist also nicht so, dass ich eine physische Block-Klasse für mein Raster-Widget habe, sondern sie wird ausschließlich mit einer UI-Komponente erstellt, die XML auflistet.

Trotzdem werde ich trotzdem prüfen, ob die Frage, auf die verwiesen wird, meinem Anwendungsfall hilft.

Giel Berkers
quelle
Mögliches Duplikat von Standardfilter zu Gitter in Magento2 hinzufügen?
Raphael bei Digital Pianism
2
@ RaphaelatDigitalPianism Ich glaube nicht, dass dies ein Duplikat ist. Die Frage, die Sie verknüpft haben, handelt von Gitternetzen, die auf eine alte Art und Weise aufgebaut sind. Irgendwas zwischen Gitterblöcken und UI-Komponenten. Grundsätzlich hatten Sie noch Rasterblöcke, die jedoch in einer XML-Datei anstelle einer prepareColumnsMethode konfiguriert wurden .
Marius
@ Marius Abstimmung zurückgezogen;)
Raphael bei Digital Pianism
1
Ich habe meine Frage bearbeitet, da ich auch nicht denke, dass dies ein Duplikat ist (ich habe meine Nachforschungen angestellt ;-))
Giel Berkers
@ Giel Berkers Ich bekomme das gleiche Problem
bhargav shastri

Antworten:

9

Folgendes habe ich bisher herausgefunden.
Dies ist nicht vollständig, aber es kann Sie auf den richtigen Weg bringen.
Ich habe meine Tests durchgeführt, indem ich die UI-Komponente der CMS-Seitenliste modifiziert habe.
Ich habe das hinzugefügt

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

im cms_page_listing.xmlInneren der Datenquelle Knoten innerhalb der Daten / config Argument. So sieht es jetzt aus

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

Dadurch kann ich die URL aufrufen ROOT/admin/cms/page/index/key/<form_key_here>/?page_id=2.
Und ich sehe nur die Seite mit der ID 2.
Aber es funktioniert nicht für Bereichsfilter und der Filterwert ist nicht ausgefüllt. Es wird immer noch als leer angezeigt.

Hier ist nun, warum dies möglich ist.

Die dataProvider-Klasse für cms-Seiten lautet Magento\Cms\Ui\Component\DataProvider.
Dieser erstreckt sich Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider.
Letzteres enthält eine geschützte Methode namensprepareUpdateUrl

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()
            );
        }
    }
}

Dies bewirkt, dass in der UI-Komponentenkonfiguration geprüft wird, ob ein Element aufgerufen wird filter_url_params. Wenn dies der Fall ist, werden alle darin enthaltenen Werte übernommen und die Anforderung auf Werte überprüft, die den Definitionen in entsprechen filter_url_params.
Aber standardmäßig funktioniert es nur mit eq.

Sie können versuchen, eine benutzerdefinierte dataSource für Ihre Komponente zu haben, in der Sie die Methode neu schreiben prepareUpdateUrlund alle erforderlichen Anforderungsvariablen berücksichtigen und ihr möglicherweise Paging und Bereichsfilterung hinzufügen.

Randnotiz: Dies ist eine sehr interessante Frage. Ich bin sicher, dass viele Leute dies in Zukunft brauchen werden.

Marius
quelle
Vielen Dank an @Marius für Ihre Antwort. Dies funktioniert in meiner Situation, da der Link immer nach einer ID und nicht nach einem Bereich gefiltert werden muss (der Bereich ist mehr oder weniger eine Funktion, wird aber von meiner URL nicht benötigt). Ihre Antwort sowie Ihre Erklärung haben mir sehr geholfen!
Giel Berkers
1
@ Marius kann ich die URL wie folgt verwenden ROOT/admin/cms/page/index/page_id/2/key/<form_key_here>, weil ich $this->urlBuilder->getUrl(static::URL_PATH,[ 'page_id' => $item['id']])in UiCompnent / Listing / Column verwende
einfacher Typ
Wie verwende ich mehr als einen Parameter zum Filtern, dh ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / val3 / key / <form_key_here> und gebe drei Parameter unter <item name = "filter_url_params" an xsi: type = "array"> funktioniert für einzelne Filter, jedoch nicht zusammen.
Shathish
@Marius! URA LEBENSRETTER!
Zorox
@Marius: Hast du eine Idee, wie die Funktionalität für mehrere URL-Parameter wie ROOT / admin / cms / page / index / param_1 / val1 / param_2 / val2 / param_3 / ‌ val3 / key / <form_key_h‌ ere> as verwendet werden kann? bereits von Shathish
Ashish Raj angegeben