Search the FirstSpirit Knowledge Base
Hallo zusammen,
folgender Sachverhalt: Ich habe eine FS_LIST vom Typ Inline. Es wird nur ein Absatztemplate verwendet, welches, unter anderen, ein Feld enthält, in das eine Zahl eingetragen werden kann.
Wie muss/kann ein Filter aussehen, dass ich in der Ausgabe nur die Absätze erhalte, bei denen der in oben genanntem Feld eingetragene Wert einem von außen dynamisch übergebenem Wert enspricht?
Gruß Arnold
Hallo,
ich verstehe "von außen gesetzt" jetzt als eine FirstSpirit-Variable, die z.B. in dem Formular definiert ist das auch die FS_LIST enthält.
Die "einfache" Möglichkeit wäre hier natürlich, diese Variable im inneren Absatz abzufragen - weil sie dort auch zur Verfügung steht. Allerdings würde ich aus Erfahrung davon eher abraten, weil man sich hier unnötige Abhängigkeiten schafft (von "unten nach oben") - denn der innere Absatz ist dann vom Vorhandensein der Variablen aus dem höheren Kontext abhängig - und das will man nicht 😉
Besser ist es, im Absatz der FS_LIST ein Lambda zu benutzen - z.B. hier nur Absätze ausgeben, in denen der Wert ein gesetztes Minimum überschreitet:
...
$CMS_FOR(for_myFsListEntry,st_myFsList.filter(x -> x.st_number_InInnerSection > st_minimum_InFsListSection))$
$CMS_VALUE(for_myFsListEntry)$
$CMS_END_FOR$
...
Mit einem IF würde es natürlich auch gehen - ich finde Lambdas aber immer so schön handlich 😉
Wenn es allerdings um eine Dynamik auf der Live-Seite geht, funktioniert das über reines Templating natürlich nicht sondern müsste anders gelöst werden - entweder über serverseitige Logik (PHP, JSP etc.) oder auch per JavaScript. Die für diese Logik benötigten Infos kann man sich dann natürlich vom Template in die Ausgabe schreiben lassen.
Viele Grüße
Michael
Guten Morgen Michael,
leider ist die Sache nicht ganz so einfach oder ich sehe es nur zu kompliziert.
Hier einfach mal der entspr. Code, versehen mit Kommentaren um den Sachverhalt zu erläutern
$CMS_FOR(_syslayer, fr_pt_sysLayer.filter(x->x.Systemid == _systems.cs_sys.value.Systemid).distinct(x->x.Schichtname))$ $-- Schleife über externe DB2-Tabelle, um die Variable für die Filterung der Absätze zu ermitteln --$
<layer orderId="$CMS_VALUE(_syslayer.Schichtindex)$"> $-- zu verwendende Variable --$
<layerName>$CMS_VALUE(_syslayer.Schichtname)$</layerName>
$CMS_FOR(_layerImages, fr_pt_systems.filter(x->x.fs_id == _systems.fs_id))$ $-- Aus dieser For-Schleife erhalte ich alle Absätze der FS-LIST --$
$CMS_FOR(_image, _layerImages.filter( x->x.???st_layer_order == _syslayer.Schichtindex))$ $-- Hier fehlt mir was (st_layer_order = Feld im Absatztemplate, welches den zu filternden Wert enthält) --$
$CMS_VALUE(_image.Ehs_product_images)$ $-- Tabellenspalte mit der FS_LIST --$
$CMS_END_FOR$
$CMS_END_FOR$
.........
</layer>
$CMS_END_FOR$
LG aus dem Schwarzwald
Arnold
Hallo Arnold,
ist jetzt schwierig ohne die Templates / Projektstruktur vor Augen zu haben 😉
Das x entspricht ja letztlich einem Element der Liste "_layerImages" - d.h. Du müsstest Dich hier so zum Vergleichswert "hangeln" wie Du es von der Variablen "_image" aus tun würdest.
Es müsste hier aber auch ohne Filter mit einem $CMS_IF()$ im innersten $CMS_FOR$ funktionieren, da ja außer der Ausgabe (dem innersten CMS_VALUE) keine Logik enthalten ist.
Viele Grüße
Michael
Hallo Arnold,
benötigst du noch weitere Hilfe oder konnten Michaels Antworten dir weiterhelfen?
Solltest du eine eigene Lösung gefunden haben, wäre es super, wenn du diese hier bereitstellen würdest.
Viele Grüße
Michaela