Search the FirstSpirit Knowledge Base
Hallo,
ich benötige in einer Absatzvorlage für ein Javascript Daten aus einer Datenquelle. Die Idee war, diese per ContentSelect auszulesen, dann eine Java-Liste/Objekt zu erstellen und dies mit .toJSON() als sauberes JSON-Objekt für das Javascript bereitzustellen. Für "normale" Felder funktioniert das auch, doch ich verzweifle gerade daran, einen Link in das Objekt zu bekommen (gerendert mit dem entsprechenden Linktemplate).
Hier zur Erklärung ein paar Zeilen Code:
$CMS_SET(var_link)$$CMS_VALUE(row.link)$$CMS_END_SET$
$CMS_SET(infoList, [])$
$CMS_SET(void, infoList.add(
{
"id": row.fs_id,
"title": row.title,
"link1": row.link,
"link2": var_link,
}
))$
$CMS_SET(data, {:})$
$CMS_SET(void, data.put("infos", infoList))$
....
$CMS_VALUE(data.toJSON())$
Wenn ich den Link direkt zuweise (link1), erhalte ich einfach nur ein Objekt in der Art: de.espirit.firstspirit.generate.IdentifiableLink@abcdef
Logisch, das ganze muss ja über CMS_VALUE gerendert werden.
Versuche ich das ganze vorher zu rendern und in eine Variable zu speichern, wird in der Variable nicht der gerenderte Link, sondern das Vorlagenfragment gespeichert - auch klar, so steht es ja in der Doku. In link2 steht also: $CMS_VALUE(row.link)$
Wie kann ich nun den Link in gerenderter Form in eine Variable schreiben? Gibt es dafür eine möglichst simple Lösung, ohne das komplette Link-Rendering an dieser Stelle erneut durchführen zu müssen?
Vielen Dank und viele Grüße
Michael.
Hallo Stefan,
auch das wollte nicht richtig. Ich habe die Lösung aber durch weiteres probieren und kombinieren herausgefunden:
$CMS_SET(var_link)$$CMS_VALUE(row.link)$$CMS_END_SET$
$CMS_SET(infoList, [])$
$CMS_SET(void, infoList.add(
{
"id": row.fs_id,
"title": row.title,
"link": var_link.toString,
}
))$
Also erst einmal durch CMS-VALUE jagen, und anschließend mit toString das Vorlagenfragment in einen String umwandeln (an der Stelle passiert wohl das gewünschte Rendering).
Vielen Dank an alle.
Viele Grüße
Michael.
Hast du mal versucht, auf die Felder des Links direkt zuzugreifen statt über die Linkvorlage zu rendern?
Ich hab gerade kein Beispiel vor mir was ContentSelects betrifft, aber etwas in der Richtung:
$CMS_SET(set_ref)$
$CMS_REF(row.link.getFormData.get(#global.language, "lt_link").get(), abs:1)$
$CMS_END_SET$
Dann sollte in set_ref eigentlich die Url des Links stehen.
Hallo Nina-Christine,
ja, das dürfte funktionieren und ich bekäme genau 1 Feld des Linktemplates geliefert. Jedoch wollte ich mir das neu zusammensetzen der ganzen Felder sparen, da die Linkvorlagen das ja alles schon sauber machen. Es handelt sich um einen ganzen Stapel an Vorlagen mit diversen unterschiedlichen Optionen und teilweise komplexer Logik (Link auf Datensätze,...) - ich müsste also einen Teil der Logik aller genutzten Templates hier nachbauen.
Viele Grüße
Michael.
Hi Michael,
mit var_link.toString (erzwungene Auswertung, siehe Doku) solltest du eigentlich genau das Ergebnis erhalten, was du benötigst.
Beste Grüße
Stefan
Hallo Stefan,
auch das wollte nicht richtig. Ich habe die Lösung aber durch weiteres probieren und kombinieren herausgefunden:
$CMS_SET(var_link)$$CMS_VALUE(row.link)$$CMS_END_SET$
$CMS_SET(infoList, [])$
$CMS_SET(void, infoList.add(
{
"id": row.fs_id,
"title": row.title,
"link": var_link.toString,
}
))$
Also erst einmal durch CMS-VALUE jagen, und anschließend mit toString das Vorlagenfragment in einen String umwandeln (an der Stelle passiert wohl das gewünschte Rendering).
Vielen Dank an alle.
Viele Grüße
Michael.
Hallo Michael,
genau so meinte ich das. Da habe ich mich wohl unklar ausgedrückt. Schön, dass du dein Problem lösen konntest.
Beste Grüße
Stefan
Auch wenn es nicht direkt mit dem beschriebenen Problem zu tun hat, hier eine Anleitung zu einem ähnlichen Problem - CMS_INPUT_DOM mit Links - für den Fall, dass ihr darüber auch stolpert: Render HTML of CMS_INPUT_DOM with links as JSON value