Search the FirstSpirit Knowledge Base
Hallo,
gibt es auf irgendeine Weise eine Möglichkeit den Inhalt eines Ausgabekanals in einen anderen zu übernehmen (kein Copy & Paste)?
Wir nutzen die UX-Bridge und generieren eine Nachricht in der in einem XML-Tag das komplette Markup eines Absatzes generiert werden soll.
Hierzu wird per CMS_VALUE Aufruf der Inhalt einer Absatzvorlage gerendert. Da diese aber vorallem im HTML Ausgabekanal genutzt wird, müsste ich nun, um auf das Markup auch im UX-Bridge Ausgabekanal zu nutzen, das Markup 1:1 in den UX-Bridge Ausgabekanals der Absatzvorlage kopieren.
Da die doppelte Pflege eines Ausgabekanals meines Erachtens nach sehr fehleranfällig ist, würde ich gerne darauf verzichten.
Gibt es eine Möglichkeit, um in einem Template den Inhalt eines ganz bestimmten Ausgabekanals einer eingebundenen Abastzvorlage auzugeben?
Viele Grüße,
Stefan
Für Seiten-Templates (x ist dann der Index des Ausgabekanals):
$CMS_VALUE(#global.page.template.templateDocument(#global.project.templateSets[x]))$
Für Absatz-Templates:
$CMS_VALUE(#global.section.template.templateDocument(#global.section.templateSets[x]))$
Hallo Stefan,
als einzige, praktikable Möglichkeit würde mir einfallen in einem der Generierung vorgelagertem Script den Quellcode des Templates von dem einen Ausgabekanal in den anderen zu kopieren. So hätte man zumindest keine Copy&Paste Fehler. Etwas oversized wäre ein Ansatz mit einer Java-Klasse die über eine Executable aufgerufen wird und den Templatecode ausgibt.
Viele Grüße
Jörg
Hallo Jörg,
danke für die prompte Antwort. Ich hatte ja echt gehofft, dass da irgendeine Möglichkeit gibt beim Aufruf eines CMS_VALUE oder CMS_RENDER den Bezeichner des Ausgabekanals mitzugeben.
Aber dann versuche ich es mal mit dem Skript.
Gruß,
Stefan
Für Seiten-Templates (x ist dann der Index des Ausgabekanals):
$CMS_VALUE(#global.page.template.templateDocument(#global.project.templateSets[x]))$
Für Absatz-Templates:
$CMS_VALUE(#global.section.template.templateDocument(#global.section.templateSets[x]))$
Hallo Peter, das ist genau das, was ich gesucht habe.
Vielen Dank.
Zu früh gefreut bekomme jetzt mehrerer warnings und errors der Form:
18.10.2012 16:24:55.714 WARN ($CMS_VALUE(#global.page.template.templateDocument(#global.project.templateSets[0]))$ at 1, 1): Replacing null value with empty default! Undefined method 'de.espirit.firstspirit.parser.eval.NullEnhancer$Null#templateDocument(de.espirit.firstspirit.server.templatemanagement.TemplateSetImpl)'!
18.10.2012 16:24:55.769 ERROR ($CMS_VALUE(#global.section.template.templateDocument(#global.section.templateSets[0]))$ at 1, 1): java.lang.NullPointerException
Und wirklich funktionieren tut es wohl doch nicht.
Irgend eine Idee was hier noch zu machen ist.
Im UX-Bridge Ausgabekanal einer Absatzvorlage steht nun:
$CMS_VALUE(#global.format.template.templateDocument(#global.format.templateSets[0]))$
Und im Ausgabekanal einer Seitenvorlage:
$CMS_VALUE(#global.page.template.templateDocument(#global.project.templateSets[0]))$
Ist das so richtig?
Hallo Stefan! Ich glaube, da ist irgendetwas mit Absatz- und Formatvorlagen durcheinandergeraten... Als Alternative hätte ich eine kleine Formatvorlage anzubieten, die Deinen Anwendungsfall abbilden sollte. Der Aufruf ist ein bisschen umständlicher, z.B.:
$CMS_RENDER(template:"channel_import", type:"st", uid:"text_picture")$
"channel_import" ist die uid der untenstehenden Formatvorlage, "type" übergibt die Art des Zieltemplates (hier: Absatzvorlage) und "uid" dessen uid. Die verwendeten Abkürzungen für die Typen orientieren sich an den Coding-Conventions. Der zu inkludierende Kanal ist im Beispiel hartcodiert, das ließe sich natürlich ebenfalls parametrisieren.
Vorteile:
- der Aufruf funktioniert auch in Absatzvorlagen, die innerhalb von FS_LISTs oder Contentarea-Lists verwendet werden
- es lässt sich nicht nur der "eigene" Nachbarkanal inkludieren, sondern jeder beliebiger.
$--
Calling this format template will include the template code of a specified other template. Parameters:
type --> "st","pt","ft","lt" or "tt". Specifies the type of template element.
uid --> reference name of the template.
Example: $CMS_RENDER(template:"channel_import", type:"st", uid:"text_picture")$
--$
$CMS_SET(set_ft_templateset, #global.project.templateSets.get(0))$
$CMS_SET(set_ft_templatestore, #global.userService.getStore(class("de.espirit.firstspirit.access.store.Store$Type").TEMPLATESTORE,false))$
$CMS_SWITCH(type)$
$CMS_CASE("st")$
$CMS_VALUE(set_ft_templatestore.sectionTemplates.getTemplate(uid).getTemplateDocument(set_ft_templateset))$
$CMS_CASE("pt")$
$CMS_VALUE(set_ft_templatestore.pageTemplates.getTemplate(uid).getTemplateDocument(set_ft_templateset))$
$CMS_CASE("ft")$
$CMS_VALUE(set_ft_templatestore.formatTemplates.getFormatTemplate(uid).getTemplateDocument(set_ft_templateset))$
$CMS_CASE("lt")$
$CMS_VALUE(set_ft_templatestore.linkTemplates.getTemplate(uid).getTemplateDocument(set_ft_templateset))$
$CMS_CASE("tt")$
$CMS_VALUE(set_ft_templatestore.getStoreElement(uid, class("de.espirit.firstspirit.access.store.IDProvider$UidType").TEMPLATESTORE_SCHEMA).getTemplateDocument(set_ft_templateset))$
$CMS_END_SWITCH$
[EDIT]
Das Holen des Templatestore geht auch noch etwas eleganter:
$CMS_SET(set_ft_templatestore, #global.userService.getStore("TEMPLATESTORE", false))$
[/EDIT]
Hallo Stefan,
wie Sebastian schon angemerkt hat, hast du Format- und Absatztemplate verwechselt.
Ausserdem funktioniert meine Lösung nicht für Absätze innerhalb von FS_LIST (da #global.section dort auf den äusseren und nicht auf den inneren Absatz zeigt). Für Format- und Linkvorlagen muss man auch ein "Mapping" vornehmen, auch das fehlte in meinem Hinweis, geht aber mit der Lösung von Sebastian.
Eventuell stellst du einen Feature-Request. Hätte man nämlich eine Variable, die immer das aktuelle Template enthält (egal ob Seite, Absatz, innerer FS_LIST-Absatz, Format- oder Linkvorlage), wäre der Code für jedes Template gleich.
Hallo,
gibt es hierzu im Zuge der FS-Weiterentwicklungen Neuigkeiten?
Konkret geht es mir darum, innerhalb einer XML-Ausgabe für ein Eingabeelement (CMS_INPUT_DOM) den Wert des HTML-Ausgabekanals zu holen.
Viele Grüße Arnold
Hat sich, glaube ich, erledigt.
$CMS_VALUE(#row.description.toText(true))$