thorsten
Returning Observer

Function "Navigation": Unklare Logik der isEmpty-Prüfung

Jump to solution

Liebe Community,

ich verwende eine Navigation-Function welche nur die Navistruktur der Ebene 2 auf Basis des aktuellen Navipunktes ausgeben soll:

  <CMS_FUNCTION name="Navigation" resultname="fr_nav_sub2">

    <CMS_PARAM name="expansionVisibility" value="standard" />

    <CMS_PARAM name="wholePathSelected" value="0" />

    <CMS_ARRAY_PARAM name="unselectedHTML">

      <CMS_ARRAY_ELEMENT index="1"><![CDATA[<li><a href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label)$</a>]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

    <CMS_ARRAY_PARAM name="selectedHTML">

      <CMS_ARRAY_ELEMENT index="1"><![CDATA[<li class="active"><a href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label)$</a>]]></CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

  </CMS_FUNCTION>

Erstelle ich nun eine Seite auf Basis dieses Templates und verknüpfe diese mit einem Navipunkt auf Ebene 1 (index=0) welcher keine Kinder hat, würde ich erwarten, dass fr_nav_sub2.isEmpty den Wert TRUE zurückliefert.

Dies ist aber nicht der Fall:

$CMS_VALUE(fr_nav_sub2.isEmpty)$ -> FALSE

$CMS_VALUE("#"+fr_nav_sub2+"#")$ -> ## (fr_nav_sub2 ist also leer, liefert nichts zurück)

$CMS_IF(fr_nav_sub2 == "")$

    $CMS_VALUE("ist leer")$

$CMS_ELSE$

    $CMS_VALUE("ist nicht leer")$

$CMS_END_IF$

-> Ergebnis: "ist nicht leer"

Version: 5.0.318.57504

Bug, Feature oder übersehe ich was? Smiley Happy

Danke & Grüße,

Thorsten

0 Kudos
1 Solution

Accepted Solutions

Hallo Thorsten,

zum besseren Verständnis, warum das isEmpty in dieser Form nicht funktioniert, ein bisschen Hintergrundinformation zur Arbeitsweise der Header-Funktionen:

die Variable fr_nav_sub2 enthält nicht das Ergebnis der Navigationsfunktion sondern ist quasi die Navigationsfunktion selbst. Erst durch ein $CMS_VALUE(fr_nav_sub2)$ würde das Ergebnis berechnet und ausgegeben - aber auch danach eben nicht in der Variablen gespeichert (anders ist das bei einem ContentSelect, dort wird gecacht). Das kann z.B. sehen, wenn man innerhalb der Navigationsfunktion eine Variable nutzt und diese zwischen zwei Aufrufen von $CMS_VALUE(fr_nav_sub2)$ ändert.

Um die Ausgabe einer Navigationsfunktion vorher (z.B. zur Leerprüfung) in eine Variable zu schreiben, kann man deren toString()-Methode nutzen:

$CMS_SET(set_navResult,fr_nav_sub2.toString())$

$CMS_IF(!set_navResult.isEmpty)$

     ...

$CMS_END_IF$

Viele Grüße

Michael

View solution in original post

0 Kudos
4 Replies
thorsten
Returning Observer

Gibt es niemanden die/der Licht in Dunkel bringen kann? Smiley Happy

0 Kudos
pavone
I'm new here

Hallo Thorsten,

über die interne Arbeitsweise von isEmpty kann ich leider nichts aussagen, aber ich konnte dein Problem nachvollziehen. Eine Lösung ist, mit Hilfe von

<CMS_PARAM name="root" value="BEZEICHNER" />

eine Wurzelebene für die Navigation zu definieren.

Ich hoffe, das hilft dir weiter!

Viele Grüße

Tim

0 Kudos

Hallo Thorsten,

zum besseren Verständnis, warum das isEmpty in dieser Form nicht funktioniert, ein bisschen Hintergrundinformation zur Arbeitsweise der Header-Funktionen:

die Variable fr_nav_sub2 enthält nicht das Ergebnis der Navigationsfunktion sondern ist quasi die Navigationsfunktion selbst. Erst durch ein $CMS_VALUE(fr_nav_sub2)$ würde das Ergebnis berechnet und ausgegeben - aber auch danach eben nicht in der Variablen gespeichert (anders ist das bei einem ContentSelect, dort wird gecacht). Das kann z.B. sehen, wenn man innerhalb der Navigationsfunktion eine Variable nutzt und diese zwischen zwei Aufrufen von $CMS_VALUE(fr_nav_sub2)$ ändert.

Um die Ausgabe einer Navigationsfunktion vorher (z.B. zur Leerprüfung) in eine Variable zu schreiben, kann man deren toString()-Methode nutzen:

$CMS_SET(set_navResult,fr_nav_sub2.toString())$

$CMS_IF(!set_navResult.isEmpty)$

     ...

$CMS_END_IF$

Viele Grüße

Michael

0 Kudos

Hallo Michael,

vielen Dank für die hilfreichen Erläuterungen!

Zu dem falschen Ansatz hatte mich das Demoprojekt Mithras Energy verleitet.

Dort ist bei allen Ausgaben der Navifunktionen die isEmpty-Prüfung zu finden.

Solltet Ihr bei Gelegenheit vielleicht mal korrigieren 🙂

Beispiel aus der Seitenvorlage "standard":

$CMS_IF(!pt_mainNaviHover.isEmpty)$

    <style type="text/css">

        $CMS_VALUE(pt_mainNaviHover)$

    </style>

$CMS_END_IF$

Danke & Gruß,

Thorsten

0 Kudos