andreas_pabst
Occasional Observer

JSON-Ausgabe der Navigation-Funktion

Jump to solution

Guten Tag,

bei der Verwendung des JSON-Ausgabekanals möchte ich eine Breadcrumb-Navigation in die Seite einfügen. Ich nutze folgende Header-Funktion, um diese zu generieren:

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

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

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

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

     <CMS_ARRAY_PARAM name="unselectedHTML">

          <CMS_ARRAY_ELEMENT><![CDATA[#nav]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>

     <CMS_ARRAY_PARAM name="selectedHTML">

          <CMS_ARRAY_ELEMENT><![CDATA[#nav]]></CMS_ARRAY_ELEMENT>

     </CMS_ARRAY_PARAM>        

</CMS_FUNCTION>

Anschließend füge ich den Inhalt der Variable "breadcrumb" folgendermaßen in die JSON-Struktur der Ausgabe ein:

$CMS_VALUE(json(#this).set("breadcrumb", breadcrumb))$

Leider ist in der Ausgabe nicht die Liste der Navigationselemente zu finden, sondern es wird folgender Fehler angezeigt:

...

"breadcrumb": {

  "error": "Type 'de.espirit.firstspirit.generate.functions.NavigationFunctionImpl$PurePathNavigation' is not supported by the FirstSpirit json engine"

},

...

Gibt es eine andere Möglichkeit, die Inhalte der Navigation in einem JSON-Template auszugeben? Vielen Dank.

Viele Grüße

Andreas Pabst

1 Solution

Accepted Solutions

Hallo Andreas,

wende dich doch mit diesem Trace unter der Angabe der FirstSpirit Version an unseren Tech-Support.

Danke,
Peter

Peter

View solution in original post

0 Kudos
5 Replies
Peter_Jodeleit
Crownpeak employee

Hallo Andreas,

so müsste es funktionieren:

  1. $CMS_VALUE(json(#this).set("breadcrumb", breadcrumb.toString()))$

Viele Grüße,
Peter

Peter
0 Kudos

Hallo Peter,

ich habe durch deine Antwort noch einen Fehler in meiner Header-Funktion gefunden, dort hat zweimal ein $CMS_VALUE()$ gefehlt.

<CMS_ARRAY_PARAM name="unselectedHTML"> 

     <CMS_ARRAY_ELEMENT><![CDATA[$CMS_VALUE(#nav)$]]></CMS_ARRAY_ELEMENT> 

</CMS_ARRAY_PARAM>

 

<CMS_ARRAY_PARAM name="selectedHTML"> 

     <CMS_ARRAY_ELEMENT><![CDATA[$CMS_VALUE(#nav)$]]></CMS_ARRAY_ELEMENT> 

</CMS_ARRAY_PARAM>

Leider funktioniert es damit jedoch auch noch nicht, ich bekomme stattdessen in der Vorschau folgende NullPointerException:

java.lang.NullPointerException

java.lang.NullPointerException

at de.espirit.firstspirit.parser.EvaluatorImpl.popContext(EvaluatorImpl.java:516)

at de.espirit.firstspirit.generate.PreviewProduction._calculate(PreviewProduction.java:275)

at de.espirit.firstspirit.generate.PreviewProduction.calculate(PreviewProduction.java:116)

at de.espirit.firstspirit.generate.AbstractPreviewManager.getPreview(AbstractPreviewManager.java:134)

at de.espirit.firstspirit.generate.DistributedPreviewManagerImpl.getPreview(DistributedPreviewManagerImpl.java:100)

at de.espirit.firstspirit.io.servlet.PreviewServlet$1.outdatedCallback(PreviewServlet.java:364)

at de.espirit.firstspirit.io.servlet.PreviewServlet$CacheEntry.perform(PreviewServlet.java:1202)

at de.espirit.firstspirit.io.servlet.PreviewServlet.deliverPreview(PreviewServlet.java:391)

at de.espirit.firstspirit.io.servlet.PreviewServlet.doPost(PreviewServlet.java:250)

at de.espirit.firstspirit.io.servlet.PreviewServlet.doGet(PreviewServlet.java:209)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)

at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)

at de.espirit.firstspirit.io.servlet.WebAuthentication.doChain(WebAuthentication.java:1040)

at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:800)

at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:230)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)

at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)

at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)

at de.espirit.firstspirit.server.jetty.JettyManagerImpl$FailSafeWebAppContext.doHandle(JettyManagerImpl.java:919)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)

at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)

at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)

at org.eclipse.jetty.server.Server.handle(Server.java:499)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)

at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)

at java.base/java.lang.Thread.run(Thread.java:834)

Wenn ich im Header $CMS_VALUE(#nav.label)$ verwende, funktioniert es. Allerdings benötige ich nicht nur das Label, sondern mindestens #nav.label, #nav.ref und #nav.id.

Ich habe in der Zwischenzeit auch versucht, aus den Objekten im Header eine Map mit den benötigten Objekten zu erstellen, aber dies führt entweder zu dem originalen Fehler, oder mit dem breadcrumb.toString zu einem Objekt in einem String, was leider auch noch nicht das gewünschte Ergebnis ist:

...

"breadcrumb": "{\"label\":\"Testseite\"}",

...

Viele Grüße

Andreas Pabst

0 Kudos

Hallo Andreas,

wende dich doch mit diesem Trace unter der Angabe der FirstSpirit Version an unseren Tech-Support.

Danke,
Peter

Peter
0 Kudos
oboeck
I'm new here

Hallo Andreas,

könntest du ggfs. die Lösung des Tech-Support der Community mitteilen? Ich bin gerade am evaluieren ob ein Switch von dem bisherigen Ansatz zu einer kompletten strukturierten Datengenerierung per json() sinn macht. Und ich frag mich aktuell wie man das mit den Navigations-Funktionen richtig umsetzt. Dein Thread ist ein kleines Puzzleteil und ich würde mich über mehr Infos freuen.

Danke und Grüße

Olli

0 Kudos

Hallo Olli,

leider habe ich deine Frage erst jetzt gesehen. Wahrscheinlich hilft dir die Antwort des Tech-Supports jetzt nichts mehr, aber der Vollständigkeit halber möchte ich sie trotzdem teilen:

<CMS_HEADER>

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

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

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

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

<CMS_ARRAY_PARAM name="unselectedHTML">

     <CMS_ARRAY_ELEMENT index="0..5"><![CDATA[$CMS_SET(void,breadcrumb_list.add({"label":#nav.label,"ID":#nav.id,"ref":#nav.ref,"URL":ref(#nav.ref).url}))$]]></CMS_ARRAY_ELEMENT>

</CMS_ARRAY_PARAM> 

   

<CMS_ARRAY_PARAM name="selectedHTML">   

     <CMS_ARRAY_ELEMENT index="0..5"><![CDATA[$CMS_SET(void,breadcrumb_list.add({"label":#nav.label,"ID":#nav.id,"ref":#nav.ref,"URL":ref(#nav.ref).url}))$]]></CMS_ARRAY_ELEMENT>

</CMS_ARRAY_PARAM>           

</CMS_FUNCTION>

</CMS_HEADER>

$CMS_SET(breadcrumb_list,[])$$CMS_VALUE(breadcrumb)$

$CMS_VALUE(json(#this).set("breadcrumb", breadcrumb_list))$

Viele Grüße

Andreas Pabst