Inhalte eines Ausgabekanals in anderen übernehmen
Author: ampersand83
Publication Date: 10/18/2012 11:04
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
Tags: ausgabekanal, ux-bridge
-
Author: stephan - 10/18/2012 12:00
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
0 -
Author: ampersand83 - 10/18/2012 12:13
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
0 -
Author: Peter_Jodeleit - 10/18/2012 12:59
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]))$
0 -
Author: ampersand83 - 10/18/2012 15:06
Hallo Peter, das ist genau das, was ich gesucht habe.
Vielen Dank.
0 -
Author: ampersand83 - 10/18/2012 15:30
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?
0 -
Author: sglock - 10/18/2012 23:07
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]
0 -
Author: Peter_Jodeleit - 10/19/2012 7:29
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.
0 -
Author: ascheuch - 11/20/2017 11:09
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
0 -
Author: ascheuch - 11/20/2017 12:32
Hat sich, glaube ich, erledigt.
$CMS_VALUE(#row.description.toText(true))$
0 -
Author: ascheuch - 11/21/2017 8:18
Ha, zu früh gefreut:
Links werden leider nicht korrekt ausgegeben, sondern in der Form <a href="#" data-link-template="document_link ..."
Warum das so ist, hat wohl mit der Methode .toText() zu tun, wie ich nun einem anderen Post entnehmen konnte. Bleibt also meine ursprüngliche Frage, wie ich die HTML-Ausgabe eines DOM Elementes im XML-Kanal ausgeben kann.
Gruß Arnold
0 -
Author: ascheuch - 11/24/2017 14:58
Hallo,
weiß niemand eine Antwort?
Gruß Arnold
0 -
Author: Peter_Jodeleit - 11/26/2017 19:37
Hallo Arnold,
seit Version 5.1.11 kann man über "#global.template" auf den aktuellen Template-Knoten zugreifen, damit vereinfacht sich die Lösung für alle Template-Typen auf:
$CMS_VALUE(#global.template.templateDocument(#global.project.templateSets[x]))$
0 -
Author: ascheuch - 12/4/2017 15:02
Hallo Peter,
vielleicht verstehe ich es nicht ganz, aber ich möchte nur den Inhalt eines DOM-Elementes
Code:
<field name="content"><![CDATA[$CMS_IF(!#row.description.isEmpty)$$CMS_VALUE(#row.description.toText(true))$ $CMS_END_IF$]]></field>
Ausgabe:
<field name="content"><![CDATA[<p><b>Vollflächig abgechipste Optik</b><br/>Anwendungsgebiet Boden<br/>Schwierigkeitsstufe 4<br/><a href="#" data-link-template="document_link" data-link-id="4cb0019c-2000-4d9e-ac3b-ebe6d35f7ae3">Zur Verarbeitungstechnik</a><br/></p> ]]></field>
Das passt soweit, fehlen nur die korrekten Links.
Vielleicht kann mir jemand auf die Sprünge helfen.
Gruß Arnold
0 -
Author: MarsDD - 12/4/2017 15:33
Hast du bei den Linkvorlagen auch die Ausgabe im anderen Template-Set definiert?
0 -
Author: ascheuch - 12/4/2017 15:39
Im HTML-Kanal natürlich schon. In XML nicht, da kann ich es auch nicht gebrauchen.
0 -
Author: MarsDD - 12/4/2017 15:54
Wenn du den XML Kanal via HTML Kanal renderst benötigst Du natürlich auch die Definition in der Linkvorlage.
0 -
Author: ascheuch - 12/4/2017 16:13
Hallo Marcel,
danke für deine Antwort.
Leider bringt mir das aber nichts.
Also: Ich bin im XML-Kanal und rendere den Content als XML. Ist ja soweit ok.
Allerdings möchte ich in dem einen genannten Feld eben nicht den XML-Content, sondern den HTML-Content.
Also so was in der Art (auch wenn es das nicht gibt, sollte aber meine Anforderung verdeutlichen)
$CMS_VALUE(#row.description, templateSet:"html")$
Gruß Arnold
0 -
Author: MarsDD - 12/4/2017 16:36
Hi Arnold,
das Rendern von Inhalt via TemplateSet Argument macht ja nicht wirklich Sinn. TemplateSet Parameter kannst du bei Referenzierungen (CMS_REF) und Render-Stmt's (CMS_RENDER) angeben.
0 -
Author: ascheuch - 12/5/2017 15:37
Ja, ich weiß, sollte ja auch nur verdeutlichen, was ich möchte.
Noch jemand eine Idee?
0
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
19 Kommentare