Search the FirstSpirit Knowledge Base
Hallo zusammen,
unter den globalen Inhalten werden ja oft wiederkehrende Strings pepflegt, die in verschiedenen Stellen verschiedener Templates eingesetzt werden. Dort lassen sich auch prima die Übersetzungen dieser Strings für unterschiedliche Sprachen unterscheiden. Leider gibt es ein paar Formulierungen, in denen sich der Satzbau bei unterschiedlichen Sprachen unterscheidet.
Beispiel:
Wenn man jetzt "Mehr zum Thema" und "anzeigen" als globale Inhalte zur Übersetzung anlegen will, kann man natürlich einfach 2 globale Inhalte verwenden und bei der englischen Übersetzung den String für "anzeigen" einfach leer lassen. Das ist aber keine so schöne Lösung. Schöner wäre eine Lösung mit nur einem String als globalem Inhalt, wie z.B.:
Deutsch: Mehr zum Thema %s anzeigen.
Englisch: Show more about the topic %s.
Die Ausgabe des Templates für den globalen Inhalt könnte dann so oder so ähnlich aussehen:
$CMS_VALUE(pt_text.replace("%s",str.toString))$
Und für den Aufruf stelle ich mir etwas vor, was der Parameterübergabe an ein Template per $CMS_RENDER()$ gleicht:
$CMS_VALUE(#global.gca("show_more_about_topic",str:"Themenbezeichnung"))$
Leider funktioniert das so nicht. Und da man per $CMS_RENDER()$ leider nur Templates rendern kann und keine Instanzen dieser Templates, komme ich hier erstmal nicht weiter.
Gibt es eine Möglichkeit, mein oben beschriebenes Problem auf elegante Weise zu lösen? Vielen Dank für die Antworten im Voraus!
LG
René Schubert
Okay, es müsste ja mit
$CMS_VALUE(#global.gca("show_more_about_topic").toString.replace("%s","Themenbezeichnung"))$
funktionieren. Da hätte ich auch früher drauf kommen können.
Gibt es aber dennoch eine Möglichkeit der Parameterübergabe per #global.gca?
Sie können ihren obigen Aufruf einfach in eine Formatvorlage kapseln
$CMS_RENDER(template: "renderGCA", name: "show_more_about_topic", replacement: "Themenbezeichnung")$
und dann in der Formatvorlage:
$CMS_VALUE(#global.gca(name).toString.replace("%s",replacement))$
Bei der Ausgabe von $CMS_VALUE(#global.gca("name"))$ können Sie nicht direkt Parameter übergeben, allerdings können Sie innerhalb der GCA auf alle Variablen zugreifen, die in der Seite vorhanden sind.
Ganz so einfach, wie ich dachte, ist es nun doch leider nicht, da #global.gca("...") kein Objekt zurückliefert, das die Methoden toString() oder replace("...","...") unterstützt. Mit folgendem Code habe ich jetzt mein gewünschtes Ziel erreicht:
$CMS_VALUE(#global.gca("show_more_about_topic").data.get("st_text").editor.get(#global.language).replace("%s","Themenbezeichnung"))$
Vorausgesetzt, dass das Eingabe-Element meines globalen Templates für Übersetzungen "st_text" genannt wurde. Schöner wäre es allerdings, wenn ich die Ausgabe des Templates in einem String erhalten könnte, ich also nicht ein Eingabe-Element gezielt ansprechen müsste.
Ist es möglich, dies über eine Methode, wie #global.gca("xyz").irgendwasDasDenOutputAlsStringZurueckliefert zu erhalten? Mit
$CMS_SET(set_string)$$CMS_VALUE(#global.gca("xyz"))$$CMS_END_SET$
müsste es ja auch gehen, das gefällt mir aber nicht so gut.
Vielen Dank!
@Christoph Feddersen: Ihre Methode wird damit auch hinfällig, oder irre ich mich?
Das zweite Codeschnipsel macht auch nicht das, was Sie wollen (in "set_string" ist dann ein Template-Fragment, nicht ein "string"). Mir gefällt die aktuelle Lösung ganz gut - der von Ihnen angerissene mögliche weitere Lösungsweg hingegen gefällt mir nicht. FirstSpirit versucht in der Generierung soviel wie möglich streambasiert zu machen. Wenn man dann aber grosse Fragmente in Strings "zwischenparkt" um diese zu modifizieren und dann auszugeben kann man schnell Performance und Speicherverhalten negativ beeinflussen. Das macht sich meist erst dann bemerkbar, wenn die Seitenzahlen hoch gehen. In der Entwicklungsphase ist es ja meist noch egal, ob etwas eine oder 1,5 Sekunden benötigt...
Hallo Herr Schubert,
irgendwie scheine ich das hier falsch zu verstehen, aber vorsichtshalber schreibe ich mal auf, was ich machen würde:
Wie im ursprünglichen posting geschrieben:
- Sprachabhängige Eingabekomponente und als Platzhalter einen beliebigen String, nehmen wir %s wir im Beispiel.
- Im Quelltext der GCA dann die Ausgabe mit der entsprechenden Ersetzung:
$CMS_VALUE(pt_text.replace("%s",gca_str))$
[Wäre hier ein replaceAll nicht sicherer, da bestimmt ein redakteur auf die Idee kommt den Platzhalter mehrfach zu ersetzen?]
Den Aufruf im template dann ganz einfach so gestalten:
$CMS_SET(gca_str,"Themenbezeichnung")$
$CMS_VALUE(#global.gca("show_more_about_topic")$
Anstelle des Strings "Themenbezeichnung" kann hier jeder beliebige String übergeben werden, z.B. auch #row.<Spaltenname> bzw. #row.<Spaltenname>.toString().
Wie Herr Feddersen schon geschrieben hat, steht der Context des aufrufenden Templates in der GCA zur Verfügung.
Der Aufruf der Eingabekomponente (wie in der Antwort vom 19.07. beschrieben) macht das Ganze extrem statisch und vor allen Dingen auf sehr wenige Eingabekomponenten beschränkt [CMS_INPUT_DOM wird so nicht einwandfrei funktionieren, nehme ich an]
Viele Grüsse aus Dortmund,
Holger Höbbel