Hewera-Harz
Returning Observer

Strukturvariablenwert einer definierten Pageref auslesen

Jump to solution

Hallo Zusammen,

ich möchte gerne für eine ausgewählte Seitenreferenz den Strukturvariablenwert ihres Parentfolders ermitteln.

Da man vererbte Werte leider nicht direkt ermittelt kann, hatte ich auch eine Lösung im Kopf, die sich an den Strukturverzeichnissen lang hangelt bis der Ursprungswert ermittelt werden kann.

Ich habe nun hier in der Community reichlich gestöbert und eine Lösung für meine Anforderung gefunden: https://community.e-spirit.com/message/2195#2195
In diesem Post wird folgende Umsetzung beschrieben:

  • $CMS_SET(ref,ref(pageref:"permissiontest").target)$ 
  • $CMS_SET(myData,"")$ 
  • $CMS_FOR(count,[1..ref(pageref:"permissiontest").target.depth])$ 
  • $CMS_IF((myData=="") && !(ref.parent.data.get("Hallo").editor.get(#global.language).isEmpty))$ 
  • $CMS_SET(myData,ref.parent.data.get("Hallo").editor.get(#global.language))$ 
  • $CMS_END_IF$ 
  • $CMS_SET(ref,ref.parent)$ 
  • $CMS_END_FOR$ 
  • VarContent: $CMS_VALUE(myData)$ 

Auf dieser Basis habe ich meine Abfrage umgesetzt.

Bei einer Seite soll für eine Pageref, die in den Metadaten für diese Seite ausgewählt wurde, bzw. für deren Parentfolder der Wert einer Strukturvariablen ermittelt werden.

$CMS_SET(ref,#global.page.meta("md_test_pageref").getPageRef)$ 

$CMS_SET(set_struktur_variable,"")$ 

$CMS_FOR(count,[1..ref.depth])$ 

                $CMS_IF((set_struktur_variable=="") && (!ref.getParentFolder.getFormData.get("ss_robots").isEmpty || !ref.getParentFolder.getFormData.get("ss_robots").isNull()))$

                                $CMS_SET(set_struktur_variable,ref.getParentFolder.getFormData.get(#global.language,"ss_robots").get())$   

                $CMS_END_IF$ 

$CMS_SET(ref,ref.getParentFolder())$ 

$CMS_END_FOR$

$CMS_VALUE(set_struktur_variable)$

Das klappt auch, ich bekomme tatsächlich den Wert der Strukturvariablen von dem Parentfolder, an dem diese definiert wurde.

Leider bekomme ich aber auch Errors, nämlich eine NoSuchFormFieldException (siehe unten). Für jeden Strukturfolder, der „nur“ den vererbten Wert hat, gibt es diese Exception.

Ich habe schon versucht, dass mit der Abfrage auf isNull zu umgehen. Hat leider nicht geklappt.

Es muss doch möglich sein, diese Exception irgendwie zu vermeiden.

Vielen Dank schon mal im Voraus

Petra Hewera-Harz

Caused by de.espirit.firstspirit.forms.NoSuchFormFieldException: ss_robots

                at de.espirit.firstspirit.store.access.DataWrappingFormData.get(DataWrappingFormData.java:89)

                at de.espirit.firstspirit.store.access.sitestore.SiteStoreVariableFormDataImpl.get(SiteStoreVariableFormDataImpl.java:89)

                at de.espirit.firstspirit.parser.eval.FormDataEnhancer.getFormDataValue(FormDataEnhancer.java:72)

                at de.espirit.firstspirit.parser.eval.FormDataEnhancer.invokeMethod(FormDataEnhancer.java:63)

                at de.espirit.firstspirit.parser.eval.Invoker.evalMethod(Invoker.java:216)

                at de.espirit.firstspirit.parser.EvaluatorImpl$1.invokeMethod(EvaluatorImpl.java:99)

                at de.espirit.firstspirit.parser.EvaluatorImpl.invokeMethod(EvaluatorImpl.java:221)

                at de.espirit.firstspirit.parser.impl.MethodImpl.eval(MethodImpl.java:98)

                at de.espirit.firstspirit.parser.impl.DottedExpression.eval(DottedExpression.java:82)

                at de.espirit.firstspirit.parser.impl.NotExpression.eval(NotExpression.java:23)

                at de.espirit.firstspirit.parser.impl.CombinedExpression.eval(CombinedExpression.java:127)

                at de.espirit.firstspirit.parser.impl.CombinedExpression.evalBoolean(CombinedExpression.java:235)

                at de.espirit.firstspirit.parser.impl.CombinedExpression.eval(CombinedExpression.java:159)

                at de.espirit.firstspirit.parser.impl.CmsIfImpl.print(CmsIfImpl.java:81)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

                at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

                at de.espirit.firstspirit.parser.impl.CmsForImpl$LoopEvaluator.eval(CmsForImpl.java:259)

                at de.espirit.firstspirit.parser.impl.CmsForImpl$LoopEvaluator.access$100(CmsForImpl.java:164)

                at de.espirit.firstspirit.parser.impl.CmsForImpl.print(CmsForImpl.java:144)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

                at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.parser.impl.CmsIfImpl.print(CmsIfImpl.java:88)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

                at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

                at de.espirit.firstspirit.parser.impl.CmsTrimImpl.print(CmsTrimImpl.java:166)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.parser.impl.AbstractPrintable.print(AbstractPrintable.java:81)

                at de.espirit.firstspirit.parser.impl.TemplateDocumentImpl.print(TemplateDocumentImpl.java:49)

                at de.espirit.firstspirit.parser.EvaluatorImpl.print(EvaluatorImpl.java:547)

                at de.espirit.firstspirit.generate.PreviewProduction.print(PreviewProduction.java:546)

                at de.espirit.firstspirit.store.access.sitestore.PageRefImpl.render(PageRefImpl.java:893)

                at de.espirit.firstspirit.store.access.sitestore.PageRefImpl.createContent(PageRefImpl.java:851)

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

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

                at de.espirit.firstspirit.generate.AbstractPreviewManager.getLog(AbstractPreviewManager.java:217)

                at de.espirit.firstspirit.generate.DistributedPreviewManagerImpl.getLog(DistributedPreviewManagerImpl.java:110)

                at de.espirit.firstspirit.io.servlet.PreviewServlet.showLog(PreviewServlet.java:446)

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

                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:655)

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

                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)

                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

                at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

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

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

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

                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)

                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)

                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)

                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)

                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)

                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)

                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)

                at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)

                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)

                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)

                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)

                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)

                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726)

                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)

                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)

                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

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

0 Kudos
1 Solution

Accepted Solutions

Hallo Petra,

UPS - das isSet() so nicht funktioniert, hatte ich nicht auf dem Schirm Smiley Sad

Dann fürchte ich, dass Du über das form gehen musst, also beispielsweise so:

$CMS_SET(ref,#global.page.meta("md_test_pageref").getPageRef)$

$CMS_SET(set_struktur_variable,"")$

$CMS_FOR(count,[1..ref.depth])$

                $CMS_IF(!ref.getParentFolder.getFormData.form.findEditor("ss_robots").isNull && !ref.getParentFolder.getFormData.get("ss_robots").isEmpty)$

                                $CMS_SET(set_struktur_variable,ref.getParentFolder.getFormData.get(#global.language,"ss_robots").get())$  

                                $CMS_SET(void,#for.BREAK)$

                $CMS_END_IF$

$CMS_SET(ref,ref.getParentFolder())$

$CMS_END_FOR$

$CMS_VALUE(set_struktur_variable)$

getFormData.form.findEditor liefert NULL, wenn der Editor nicht vorhanden ist. Auf die Art kann man dann ohne Fehler prüfen, ob die Struktur-Variable gesetzt ist oder nicht.

Ich habe in das Beispiel mal das #for.BREAK mit eingebaut, so dass die Schleife abgebrochen wird, sobald der Wert gefunden wurde. Statt dessen kannst Du aber natürlich auch weiterhin prüfen, ob die Variable "set_struktur_varaible" Inhalt hat oder nicht. Sofern keine sehr tiefen Bäume geprüft werden, sollte dies Performancetechnisch kaum einen Unterschied machen, da die abgefragten Knoten sich im Cache befinden.

Viele Grüße

Holger

View solution in original post

0 Kudos
5 Replies
hoebbel
Crownpeak employee

Hallo Petra,

das erste, was mit auffällt, ist die Reihenfolge der Prüfungen. Du prüfst zuerst auf empty (das gibt die Exception) und dann auf Null. Möglicherweise reicht es schon aus, die beiden Prüfungen einfach umzudrehen.

Wahrscheinlich aber nicht, da die Exception ja aussagt, dass es das FormField nicht gibt (und nicht, dass es Null ist).

Funktioniert das hier?

$CMS_IF(set_struktur_variable=="" && isSet(ref.getParentFolder.getFormData.get("ss_robots")) && !ref.getParentFolder.getFormData.get("ss_robots").isEmpty)$

Also erst zu prüfen, ob die Variable existiert und wenn ja, ob die nicht leer ist.

Tipp: Anstatt die Schleife jedes mal bis zur Sitestore Wurzel laufen zu lassen, würde ich diese mit $CMS_SET(void, #for.BREAK)$ [vor dem $CMS_END_IF$] vorzeitig abbrechen, sobald ich einen Wert gefunden habe. Dann kannst Du dir auch das set_struktur_variable=="" im $CMS_IF()$ sparen, da die $CMS_IF()$ Abfrage dann nur durchlaufen wird, solange die Variable noch nicht gesetzt ist.

Viele Grüße

Holger

0 Kudos

Hallo Holger,

deinen Vorschlag habe ich versucht. Leider kommt für den Part mit isSet eine Fehlermeldung beim Speichern der Vorlage.

479255_pastedImage_0.png

0 Kudos

Hallo Petra,

UPS - das isSet() so nicht funktioniert, hatte ich nicht auf dem Schirm Smiley Sad

Dann fürchte ich, dass Du über das form gehen musst, also beispielsweise so:

$CMS_SET(ref,#global.page.meta("md_test_pageref").getPageRef)$

$CMS_SET(set_struktur_variable,"")$

$CMS_FOR(count,[1..ref.depth])$

                $CMS_IF(!ref.getParentFolder.getFormData.form.findEditor("ss_robots").isNull && !ref.getParentFolder.getFormData.get("ss_robots").isEmpty)$

                                $CMS_SET(set_struktur_variable,ref.getParentFolder.getFormData.get(#global.language,"ss_robots").get())$  

                                $CMS_SET(void,#for.BREAK)$

                $CMS_END_IF$

$CMS_SET(ref,ref.getParentFolder())$

$CMS_END_FOR$

$CMS_VALUE(set_struktur_variable)$

getFormData.form.findEditor liefert NULL, wenn der Editor nicht vorhanden ist. Auf die Art kann man dann ohne Fehler prüfen, ob die Struktur-Variable gesetzt ist oder nicht.

Ich habe in das Beispiel mal das #for.BREAK mit eingebaut, so dass die Schleife abgebrochen wird, sobald der Wert gefunden wurde. Statt dessen kannst Du aber natürlich auch weiterhin prüfen, ob die Variable "set_struktur_varaible" Inhalt hat oder nicht. Sofern keine sehr tiefen Bäume geprüft werden, sollte dies Performancetechnisch kaum einen Unterschied machen, da die abgefragten Knoten sich im Cache befinden.

Viele Grüße

Holger

0 Kudos

Hallo Holger,

danke, das hat es gebracht, keine Fehler mehr.

Wobei ich aber trotzdem nicht verstehe, dass man für Variablen in den Metadaten vererbte Werte abfragen kann und auch für Strukturvariablen anscheindend über einen Navigationsfunktion.

Warum dann nicht in einer Abfrage für den Strukturordner selber?

Danke für deine Hilfe und Lösung

Viele Grüße

Petra

0 Kudos

Hallo Petra,

gute Frage. Die Antwort lautet erst einmal, weil es nicht oft genug gewünscht wird.

Der entsprechende Feature Request hat nur 25 Punkte, steht auf den internen Listen somit ziemlich weit unten.

Viele Grüße

Holger

0 Kudos