Search the FirstSpirit Knowledge Base
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
Hallo Andreas,
wende dich doch mit diesem Trace unter der Angabe der FirstSpirit Version an unseren Tech-Support.
Danke,
Peter
Hallo Andreas,
so müsste es funktionieren:
- $CMS_VALUE(json(#this).set("breadcrumb", breadcrumb.toString()))$
Viele Grüße,
Peter
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
Hallo Andreas,
wende dich doch mit diesem Trace unter der Angabe der FirstSpirit Version an unseren Tech-Support.
Danke,
Peter
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
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