Questions & Answers

SOLVED
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

Type a product name