cobra707
I'm new here

Datensatz-Filtervariable dem Template übergeben

Jump to solution

Hi,

Ist es möglich, dass ich meinem Link einen Wert für eine Datensatzvariable mitgebe?

<CMS_HEADER>

<CMS_FUNCTION name="contentSelect" resultname="fr_categories">

<CMS_PARAM name="schema" value="news" />

<QUERY entityType="Category" limit="4">

</QUERY>

</CMS_FUNCTION>

<CMS_FUNCTION name="contentSelect" resultname="fr_newsList">

<CMS_PARAM name="schema" value="news" />

<QUERY entityType="News">

</QUERY>

</CMS_FUNCTION>

</CMS_HEADER>

$CMS_FOR(for_category,fr_categories)$

<hr />

<h4>

<a href="$CMS_REF(pageref:"dbnews_overview", contentId:for_category.id)$">$CMS_VALUE(for_category.name.convert2)$</a>

</h4>

<h5>Gefundene Artikel:  $CMS_VALUE(fr_newsList.filter(x -> x.category.id == for_category.id).length)$</h5>

<p>$CMS_VALUE(for_category.teaser.convert2)$</p>

$CMS_END_FOR$

Sinn hinter dem ganzen ist, dass ich eine Übersicht über meine Kategorien habe. Klick ich auf eine Kategorie, soll diese dann auf die dbnews_overview gehen und dort die ID der Category mit übergeben, sodass nur die Neuigkeitenauf der neuen Seite mit der Kategorie-ID ausgegeben werden.

Ich weiß das man dies in der Struktur unter Daten => Filterung einstellen kann. Das ist aber nur statisch. Ich möchte gerne diese Wert für den Parameter mit CMS_REF übergeben, sodass ich nicht tausende Strukturen erstellen muss für die unterschiedlichen Ergebnisse der Filterung.

Danke schon einmal!

Viele Grüße

Peter

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Peter,

das mit dem Parameter im CMS_REF kann im Rahmen einer Content-Projektion nicht funktionieren, weil FS die Übersichts-Seiten ja vorgeneriert. D.h. es müsste ja "auf magische Weise" für jeden möglichen bzw. benutzten Filter eine eigene Seite generiert werden.

Spontan fallen mir hier mehrere Lösungsmöglichkeiten ein:

  • Liveseitige Lösung (z.B. CaaS)
  • Skript/Modul, das die entsprechenden Seitenreferenzen inkl. Filter automatisch oder zumindest "auf Anfrage" anlegt (und natürlich freigibt).

Willst Du denn immer nur auf eine Kategorie filtern oder auch auf mehrere, d.h. wie dynamisch soll das genau sein?

Kleiner Hinweis am Rande: Du benutzt folgendes Konstrukt um die Anzahl der News zu ermitteln:

$CMS_VALUE(fr_newsList.filter(x -> x.category.id == for_category.id).length)$

Das führt dazu, dass alle News-Datensätze durchlaufen werden und das sogar einmal pro Kategorie. Ich würde hier eher eine Content-Projektion über die Kategorien machen und dann die jeweils passenden News auslesen. Dazu brauchst Du keine weitere Abfrage sondern kannst direkt von der jeweiligen Kategorie zu ihren News laufen - zumindest wenn die Kategorien ihre News kennen (d.h. wenn die Relation nicht unidirektional ist).

Viele Grüße

Michael

View solution in original post

0 Kudos
5 Replies
mbergmann
Crownpeak employee

Hallo Peter,

das mit dem Parameter im CMS_REF kann im Rahmen einer Content-Projektion nicht funktionieren, weil FS die Übersichts-Seiten ja vorgeneriert. D.h. es müsste ja "auf magische Weise" für jeden möglichen bzw. benutzten Filter eine eigene Seite generiert werden.

Spontan fallen mir hier mehrere Lösungsmöglichkeiten ein:

  • Liveseitige Lösung (z.B. CaaS)
  • Skript/Modul, das die entsprechenden Seitenreferenzen inkl. Filter automatisch oder zumindest "auf Anfrage" anlegt (und natürlich freigibt).

Willst Du denn immer nur auf eine Kategorie filtern oder auch auf mehrere, d.h. wie dynamisch soll das genau sein?

Kleiner Hinweis am Rande: Du benutzt folgendes Konstrukt um die Anzahl der News zu ermitteln:

$CMS_VALUE(fr_newsList.filter(x -> x.category.id == for_category.id).length)$

Das führt dazu, dass alle News-Datensätze durchlaufen werden und das sogar einmal pro Kategorie. Ich würde hier eher eine Content-Projektion über die Kategorien machen und dann die jeweils passenden News auslesen. Dazu brauchst Du keine weitere Abfrage sondern kannst direkt von der jeweiligen Kategorie zu ihren News laufen - zumindest wenn die Kategorien ihre News kennen (d.h. wenn die Relation nicht unidirektional ist).

Viele Grüße

Michael

0 Kudos

Hi Michael,

Danke erstmal für deine Antwort.

Man sollte auch nach mehreren Kategorien filtern können. Ein Ansatz der bis jetzt funktioniert ist, dass ich die Tabellenvorlage news.categoryoverview erstellt habe, diese mit eine CMS_FUNCTION "Navigation" im Header versehen habe. Als root den Kategorie Ordner aus der Struktur ausgewählt habe und dort sind verschiedene Unterordner mit Seitenreferenzen die auf das Pagetemplate von der Tabellenvorlage gehen und dort unter Daten die Filterung für die entsprechende categoryID eingepflegt habe. (Der gleiche Ansatz wurde übrigens in der Basicschulung verwendet)

Wenn ich das richtig sehe, ist dieser Ansatz aber relativ schwer vom Redakteur pflegbar. Ich als FirstSpirit-Entwickler müsste dann immer wieder ein neuen Ordner inkl. Seitenreferenz mit Filterung anlegen..

Dachte ich bekomme das dynamischer hin... Aber

"Skript/Modul, das die entsprechenden Seitenreferenzen inkl. Filter automatisch oder zumindest "auf Anfrage" anlegt (und natürlich freigibt)."

hört sich für mich im Moment nach der einzigen Lösung an. (Nachdem 19.04 bestimmt noch klarer :smileysilly:)

Viele Grüße

Peter

0 Kudos

Hallo Peter,

wenn Du immer nur nach einer Kategorie filtern willst, kannst Du natürlich auch einfach eine Content-Projektion über die Kategorien anlegen und da drin dann für die jeweilige Kategorie die News anzeigen. Wenn Du die Kategorien natürlich in der Navigation haben willst, müsste man das da "manuell" in die Navigationsfunktion einbauen. Wobei bei einer Filterung nach mehreren Kategorien (per UND) ja das Einbauen in die normale Navigation sowieso schon wieder wenig Sinn ergibt.

Funktioniert so allerdings natürlich nicht, wenn Du in den News einer Kategorie dann noch ein "echtes" Paging haben willst bzw. kommt auf die Menge an (s.u.).

Was die weitere Filterung angeht kommt es auf die jeweiligen Datenmengen pro Kategorie an. Bei recht wenigen Datensätzen kann man ja durchaus über eine reine JS-Filterung nachdenken, d.h. es würden alle News einer Kategorie rausgerendert und mit ei Bisschen JS-Magie werden beim Anklicken eines weiteren Filters einfach die "unpassenden" ausgeblendet.

Eine "richtige" Lösung wäre aber natürlich, das liveseitig abzubilden, eben z.B. per CaaS oder einem ähnlichen Mechanismus - d.h. Rausrendern der "HTML-News-Schnipsel" über eine Content-Projektion und dynamischem Zusammenbau. Dazu kann man entweder einen "echten" REST-Service bauen (oder eben den des CaaS nutzen) oder auch einfach zusätzlich ein JSON rausrendern, das dem JS sagt welche News (inkl. "jeweiliger Schnipsel-URL") zu welchen Kategorien gehören.

Viele Grüße

Michael

0 Kudos

Hi Michael,

Wenn Du die Kategorien natürlich in der Navigation haben willst, müsste man das da "manuell" in die Navigationsfunktion einbauen.

Würde ich in der Struktur die Kategorien über die Ordner anlegen, sind diese ja sowieso in der Navigation vorhanden. (Sofern der Haken in dem Ordner dafür gesetzt ist)

Wird das Teil der Advanced-Fortbildung wie man das FirstSpirit-CMS mit Services am besten verbinden kann? Oder ist der Vorgang der selbe wie in der "normalen"  heutigen Webentwicklung?

Viele Grüße

Peter

0 Kudos

Hi Peter,

Naja, wenn Du es über die Struktur machst musst Du ja wieder was "manuelles" tun wenn neue Kategorien dazu kommen 😉 Die Idee war eben, die Kategorien an der Stelle einfach auszulesen und in die Navigation "reinzubasteln". Wobei das natürlich auch wieder für eine evtl. Breadcrumb nötig wäre.

DTA: Jein - teilweise. Je nach Zeit erzähle ich manchmal noch was zu DataAccessPlugins. Es kommt letztlich immer sehr individuell drauf an, was das für Services sind und "wo" man sie anbinden will. Wenn es was rein liveseitiges ist, reicht es ja dafür zu sorgen dass "das richtige" HTML, JSON, whatever rausgeneriert wird. Allein da gibt es eine ziemliche Bandbreite an Ideen/Lösungen wo man immer schauen muss, welche im Kontext passt, mit was die Entwickler Erfahrungen haben, um welche Datenmengen es geht, ob man nicht mit Kanonen auf Spatzen schießt, was es kostet usw.

Viele Grüße

Michael

0 Kudos