lobanova
Elite Observer

Contentprojektion Seite oder nicht?

Jump to solution

Hallo FirstSpirit Community und e-spirit Experten,

auf welche Art und Weise kann ich in einer Seitenvorlage ermitteln, ob bei der aktuellen Seite um eine Contentprojektion Seite geht oder nicht?

Und wenn das eine Contentprojektion Seite ist, ob sie zur Anzeige eines einzelnen Datensatzes (Anzahl der Einträge pro Seite = 1, Maximale Seitenanzahl = 0) oder der Auflistung von mehreren Datensätzen (Anzahl der Einträge pro Seite = 0, Maximale Seitenanzahl = 1) pro Seite dient?

Vielen Dank.

Mit freundlichen Grüßen,

Olga

0 Kudos
1 Solution

Accepted Solutions

Hallo Holger.

Ja, danke, etwas mehr klar Smiley Happy

Und hier, wie vereinbart, das Code Beispiel zur Frage bzgl Contentprojektion Seite, wobei angenommen, dass eine Contentprojektion Seite mit der Einstellung "Anzahl der Einträge pro Seite = 0"(oder >1) zur Auflistung der Daten dient (z.b. Produkten Übersicht), und die Contentprojektion Seite mit der Einstellung "Anzahl der Einträge pro Seite = 1" - zur Anzeige der Daten Details (Details zum Produkt):

in Java:

Content2Params params = pageRef.getContent2Params();

if (params != null) {

     // eine Contentprojektion Seite

     if (params.getRecordCountPerPage() == 1) {

          // Detailseite

     } else {

          // Auflistungseite

     }

} else {

     // keine Contentprojektion Seite

}

in FirstSpirit Vorlage:

$CMS_SET(params, #global.node.getContent2Params())$

$CMS_IF(!params.isNull)$

     $-- eine Contentprojektion Seite --$

     $CMS_IF(params.getRecordCountPerPage() == 1)$

          $-- Detailseite --$

     $CMS_ELSE$

          $-- Auflistungseite --$

     $CMS_END_IF$

$CMS_ELSE$

     $-- keine Contentprojektion Seite --$

$CMS_END_IF$

Mit freundlichen Grüßen,

Olga

View solution in original post

0 Kudos
11 Replies
sense
Elite Observer

Hi,

die Anzahl der Einträge je Seite gibt es mit folgendem Code:

#global.pageParams.data.size

Einfach mal mit $CMS_VALUE()$ ausgeben, dann sollte da eine Zahl bei rumkommen.

0 Kudos
hoebbel
Crownpeak employee

Hallo Olga,

vielleicht hilft Dir das folgende Beispiel, die Frage zu beantworten.

$CMS_IF(#global.multiPageParams.data.isNull)$

  $-- keine Contentprojektionsseite --$

$CMS_ELSE$

  $CMS_IF(#global.multiPageParams.entitiesPerPage > 0)$

    $-- Anzahl der Einträge pro Seite ist beschränkt --$

    $-- #global.multiPageParams.pageCount gibt die gesamte Anzahl der Seiten der Projektion zurück, #global.pageParams.data die Anzahl der Einträge auf der aktuellen Seite [auf der ersten Seite, wenn es mehr als eine Seite gibt, ist das die Maximalanzahl pro Seite --$

  $CMS_ELSE$

    $-- es gibt genau eine Seite, da alle Einträge auf einer Seite dargestellt werden sollen --$

  $CMS_END_IF$

$CMS_END_IF$

Die Doku dazu findest Du hier:

Online Dokumentation FirstSpirit - #global und Mehrfachseiten

Viele Grüße aus Dortmund,

Holger

0 Kudos

Hallo Holger.

Vielen Dank für die Antwort.

Ok, Unterscheiden zwischen einer/keiner Contentprojektion Seite mittels #global.multiPageParams.data.isNull geht.

Mit der Abfrage #global.multiPageParams.entitiesPerPage ist aber leider nicht ganz so eindeutig. Weil wenn eine Contentprojektion Seite durch eine DB Query gefiltert wird, dann kann es vorkommen, dass die Anzahl von Entities pro Seite 0 ist, abgesehen davon, ob es hier um die Seite für die Darstellung eines Datensatzes geht (wir nennen so eine Detailseite) oder um die Seite für die Darstellung (Auflistung) aller Datensätze (wir nennen so eine Übersichtsseite). Und wenn die Anzahl 1 ist - hier ist auch nicht klar, ob es die Detailseite ist (wo diese Anzahl immer 1 ist) oder die Übersichtseite, weil per Filterung nur ein Datensatz rauskam.

Ich dachte, dass genau die Daten, die an der Page Referenz einer Contentprojektion Seite inter dem "Daten" Reiter gesetzt sind ("Anzahl der Einträge pro Seite" und  "Maximale Seitenanzahl") - diese geben mir die Antwort, ob es um eine Detail- oder eine Auflistung- Seite geht. Oder?

Auf welche Art und Weise kann ich diese Einstellungen abfragen? Und wenn das nicht in Vorlagen geht, dann vielleicht in Java? Java-Weg ist mir sogar lieber, da ich dann die Methode in unsere Utils Klasse einbauen kann.

Vielen Dank.

Mit freundlichen Grüssen,

Olga

0 Kudos
hoebbel
Crownpeak employee

Hallo Olga,

hmm - laut Doku hätte ich erwartet, dass dort exakt die Zahl steht, die im Sitestore für "Anzahl der Einträge pro Seite" eingetragen ist. Ich fürchte, dass ist ein Bug Smiley Sad.

Dann ist die Lösung, die Information einfach direkt zu holen mittels:

$CMS_VALUE(#global.node.getContent2Params().getRecordCountPerPage())$

Der Weg per Java ist übrigens derselbe:

Du holst Dir die Pageref (das ist #global.node in der Templatesyntax)

de.espirit.firstspirit.access.store.sitestore.PageRef

und dort kannst Du dann mittels .getContent2Params() die Content2Params holen und von denen dann mittels .getRecordCountPerPage() die maximale Anzahl der Datensätze pro Seite. Findest Du natürlich auch alles in der API: FirstSpirit Access-API

Viele Grüße,

Holger

0 Kudos

Hallo Holger.

Danke für die Antwort.

Nehme ich richtig an, dass Content2Params != NULL immer für eine Contentprojektion Seite und umgekehrt NULL für keine Contentprojektion Seite ist?

Also, mein Java Code Schnipsel ist:

Content2Params content2Params = pageRef.getContent2Params();

// Contentprojektion Seite

if (content2Params != null) {

     if (content2Params.getMaxPageCount() == 0 && content2Params.getRecordCountPerPage() == 1) {

          // Detailseite

     }

     else if (content2Params.getMaxPageCount() == 1 && content2Params.getRecordCountPerPage() == 0) {

          // Auflistungseite

     }

}

Mit freundlichen Grüssen,

Olga

0 Kudos
hoebbel
Crownpeak employee

Hallo Olga,

Nehme ich richtig an, dass Content2Params != NULL immer für eine Contentprojektion Seite und umgekehrt NULL für keine Contentprojektion Seite ist?

In der idealen Welt wäre das korrekt. Ich bin mir aber nicht sicher, was passiert, wenn man auf einer bestehenden Seite, für die es bereits eine Seitenreferenz gibt, eine Tabellenvorlage als Absatz hinzufügt bzw. einen entsprechenden Absatz löscht. Es kann sein, dass in diesem Sonderfall das Ergebnis [insbesondere im Freigabestand] nicht der Erwartungshaltung entspricht.

Bei deinem Java Code Schnipsel berücksichtigst Du nur die beiden Fälle, dass entweder alle Datensätze auf einer Seite oder auf jeder Seite nur ein Datensatz ausgegeben wird.

Natürlich kann man auch Übersichtsseiten erzeugen, auf denen nur eine bestimmte Anzahl an Datensätzen ausgegeben wird (getRecordCountPerPage() ist dann  > 1) oder Detailseiten, auf denen zwei oder mehr Datensätze ausgegeben werden.

Hier muss vorher im Projekt geklärt werden, ob anhand der Parameter sichergestellt werden kann, was eine Detailseite und was eine Übersichtsseite ist.

Im Prinzip sollte das aber funktionieren Smiley Happy

Viele Grüße,

Holger

0 Kudos

Hallo Holger.

Ja, Du hast Recht, die Definition einer Contentprojektion Übersicht-/Detail- Seite ist vom einzelnen Fall abhängig. In unserem Projekt haben wir die Regel festgelegt, dass eine Übersichtsseite alle Datensätze in Form eines Teasers anzeigt, und die Detailsseite - einen Datensatz in detailierter Form. Wobei, wie Du sagst, bei der Übersichtsseite kann man die Menge der Datensätze auch beschränken (getRecordCountPerPage() > 1).

Früher haben wir zum Unterscheiden zwischen den beiden einfach #global.dataset.isEmpty abgefragt, wobei bei der Übersichtsseite ist das auch nicht korrekt, da hier #global.dataset den ersten gerenderten Datensatz zurückgibt. Ausserdem haben wir auf einen Fehler beim Rendern einer Contentprojektion Übersichtsseite angestossen, die zum Filtern eine DB Query gesetzt hat, welche in einem bestimmten Fall eine leere Menge zurückliefert. Beim Zugriff auf #global.dataset kommt hier der Fehler:

ERROR ($CMS_VALUE(if(#global.dataset.isEmpty, then-case, else-case)$ at x, y): index=0, size=0

Ich schätze, hier handelt sich um einen FirstSpirit Bug, welchen wir versuchen umzugehen, sollen aber vielleicht bei FS TechSupport melden?

Für uns haben wir nun die Lösung gefunden. Nun habe ich schwer, welche Antwort ich hier als richtig markieren soll, da die Definition ja nicht für alle mögliche Fälle eindeutig ist? Smiley Wink

PS: ich glaube, #global.multiPageParams.entitiesPerPage ist nicht buggy, weil hier nicht um die Einstellung "Record Count per Page" handelt, sondern wieviel genau Datensätze bzw Entities auf einer bestimmten Seite gerendert werden.

Mit freundlichen Grüßen,

Olga

0 Kudos
hoebbel
Crownpeak employee

Hallo Olga,

#global.dataset.isEmpty prüft ja, ob der Datensatz leer ist. Das das funktioniert, halte ich ja eher für einen Zufall. Diesbezüglich wäre die korrekte Abfrage #global.dataset.isNull. Das prüft, ob das Objekt vorhanden ist (== Contentprojektion) oder nicht (andere Seite).

Als Fehler hätte ich allerdings ein "Undefined variable" Fehler erwartet anstelle einer IndexOutOfBounds Exception, die es hier wohl gibt. Andererseits wird an dieser Stelle hier ja aus der Liste der Datensätze der Erste ausgegeben. Und wenn die Liste leer ist, ist die IOOB Exception nicht unerwartet Smiley Wink

Zu Deinem PS: Wieviele Datensätze auf der aktuellen Seite gerendert werden, steht in der Variable #global.pageParams.data.size. Die Doku für #global.multiPageParams.entitiesPerPage sagt ja auch explizit: "...(Einstellung Anzahl der Einträge pro Seite).". Das zwei Variablen denselben Inhalt haben, macht keinen Sinn. Ich habe das Verhalten intern als Fehler aufgenommen.

Bezüglich der richtigen Antwort - es wäre schön, wenn Du irgendeine markieren würdest, damit der Beitrag nicht mehr als unbeantwortet in der Liste steht. Du kannst ja nochmal eine Zusammenfassung schreiben, wie Dein endgültiger Code aussieht und die Antwort dann als korrekt markieren Smiley Happy

Viele Grüße,

Holger

0 Kudos

Hallo Holger.

Vielen Dank für die Erklärung.

Der Check #global.dataset.isNull wirft leider auch die IOOB Exception bei Contentprojektion Seite mit leeren Datenmenge Smiley Sad

Bevor ich zusammenfasse, habe ich noch eine Verständnisfrage: kann die Prüfung isEmpty in FirstSpirit die zusätzlichen Checks wie isSet und isNull sparen? Also, ist die isEmpty Prüfung so universell, dass sie alleine für alle 3 Checks (zusammen) wie isSet + isNull + isEmpty(für String/Collection) verwendet werden kann?

Meistens im Projekt verwenden wir nur diese Prüfung, welche oft die Meldung "Undefined variable" auslöst, falls Variable nicht gesetzt ist. Die Meldung ist aber kein Fehler, erscheint nur im Debug Output. Wie geht FirstSpirit damit um?

Viele Grüße,

Olga

0 Kudos