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.
prepareColumns
Methode konfiguriert wurden .Antworten:
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
im
cms_page_listing.xml
Inneren der Datenquelle Knoten innerhalb der Daten / config Argument. So sieht es jetzt ausDadurch 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 namens
prepareUpdateUrl
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 entsprechenfilter_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
prepareUpdateUrl
und 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.
quelle
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