Wie kann ich bei Backend Plugins in einem store als filter eine function verwenden?

Moin,

ich habe folgendes Problem. Ich habe bei den Artikeln ein Multiselectfreitexteld hinzugefügt. In meinem Plugin wollte ich nun in einem Listing alle Artikel anzeigen die weniger als zehn Einträge in dem Freitextfeld ausgewählt haben. Da die Werte aus den Multiselectboxen in der Datenbank als String mit einer Pipe als Separator abgespeichert werden, war mein Gedanke dies im Store über die Filter zu lösen. Laut Dokumentation bei Sencha ließe sich mit folgendem Code ein Filter mit einer Funktion zusammenbauen: 

var longNameFilter = new Ext.util.Filter({
    filterFn: function(item) {
        return item.name.length > 4;
    }
});

Ich habe dann versucht das Ganze als filter folgendermaßen einzubauen:

filters:
[
    {
	    filterFn: function(item)
		{
			return item.freitextfeldname.split("|").length < 10;
		}
	}
]

Da kein Fehler geworfen wird scheint mir das Ganze zumindest vom Syntax her richtig zu sein. Der Filter an sich scheint aber nicht zu funktionieren bzw. es werden immer alle Datensätze ausgegeben. Meine Frage hierzu ist nun: Kann mir jemand sagen ob das generell so funktionieren würde? Oder falls nicht (bzw. wenn die Antwort darauf nicht klar ist) wie man eine solche Funktionalität abbilden könnte?

Kurzes Update: Da ich hier absolut nicht weitergekommen bin, ist der augenblickliche Ansatz ein weiteres (im Backend nicht angezeigtes) Freitextfeld einzubauen. Bei jedem Speichern eines Artikels (über “after” Hooks auf Shopware_Controllers_Backend_Article::saveAction und Shopware_Controllers_Backend_Article::saveDetailAction ) kann ich nun jeweils eine konkrete Anzahl an Artikeln mit in der Datenbank ablegen und ganz normal danach Filtern lassen.
Auch diese Lösung ist noch nicht wirklich gut, da bei dem Auslösen des Hooks anscheinend die Tabelle Artikel Attributes noch nicht befüllt wurde. Die Anzahl die deswegen hinterlegt wird ist die Anzahl an Elementen die vor dem öffnen des Artikels im Feld hinterlegt war. Somit muss man immer zweimal speichern um die richtige Anzahl zu kriegen.

Deswegen wäre die Frage nun, gibt es einen Hook oder ein Event das erst nach dem befüllen der s_articles_attributes greift?

Ich habe hier auch einmal versucht über “Shopware\Models\Article\Article::postUpdate” direkt auf ein Update zu reagieren. Das führt allerdings zumindest in meiner dev Umgebung (Windows) zu zahlreichen Fehlern. Weswegen ich das so nicht im Livesystem ausprobieren möchte. Ich halte es allerdings auch für gut möglich, dass ich hier beim Einbau etwas vergessen haben könnte und es deswegen zu den Fehlern kommt.

Moin @MrWulf‍,

ich nutze die ExtJS-Filter in einem Plugin erfolgreich und binde sie so ein:

createFilters: function() {
	var me = this;
	
	me.pastEventsFilter = Ext.create('Ext.util.Filter', {
		id: 'pastEventsFilter',
	    filterFn: function(item) {  
	
			return ;
		}
	});
}

Ich aktiviere sie allerdings in der initComponent-Methode des Plugins, und irgendwie musste ich die pageSize noch hochsetzen (ist zu lange her…):   

initComponent: function () {
	var me = this;

    me.callParent(arguments);

    me.createFilters();
    me.store.filter(me.pastEventsFilter);
    me.store.pageSize = 9999; // alle laden, sonst greift der Filter bei vielen vergangenen Events nicht
    me.store.currentPage = 1;
    me.store.load();
}

Vielleicht kommst Du so noch weiter.

Grüße
Nils

Moin Nils,

leider scheint das bei meinem Plugin nicht so ganz zu funktionieren. Die Parameter die ich hier neu setze werden zwar übernommen und auch verwendet, aber der Filter ändert die angezeigten Datensätze nicht. Ist also im Prinzip dasselbe Bild wie auch bei meinen vorherigen Versuchen.

Allerdings habe ich nun einen funktionierenden Workarround. Ich lausche nun auf das Event “Enlight_Controller_Action_PostDispatch_Backend”. Immer wenn nun der Controller “AttributeData” und die action “saveData” ist mache ich ein update auf s_articles_attributes um die Anzahl zu aktualisieren. Dasselbe nochmal wenn der Controller der von meinem Plugin ist und die action “update”. Das scheint soweit zu funktionieren, erscheint mir jedoch ziemlich umständlich.