Search the FirstSpirit Knowledge Base
Hallo zusammen,
wir verwenden in unserem Projekt ein Dictionary für die Mehrsprachigkeit analog dem folgenden Community-Beitrag:
Gibt es eine Möglichkeit an zentraler Stelle einen Fallback- bzw. Defaultwert zurückzuliefern falls der übergebene Key nicht exisitert.
Ich stelle mir das so vor, dass dann als Ausgabe auf der Website steht: "Bitte Text für {key} in {Tabelle} pflegen.
Für eine kurze Hilfestellung wäre ich sehr dankbar!
Viele Grüße
Matthias
Hallo Matthias,
ich würde den Teil in der Schleife wie folgt erweitern:
$CMS_FOR(entity,fr_dictionary)$
$CMS_IF(!entity.value.isEmpty)$
$CMS_SET(void,dictionary.put(entity.name,entity.value))$
$CMS_ELSE$
$CMS_SET(void,dictionary.put(entity.name,"Bitte "+entity.name+" befüllen"))$
$CMS_END_IF$
Sicherer und schöner ist natürlich keine leeren Inhalte in der Datenquelle zu erlauben.
Grüße
Jan
Hallo Jan,
die von dir beschriebene vorgehensweise behandelt den Fall, dass es den Key in der Datenquelle gibt, der dazugehörige Wert jedoch leer ist.
Diesen Fall haben wir bereits unterbunden indem wir keine leeren Inhalte in der Datenquelle erlauben.
Ich meinte den Fall das wir auf einen Key zugreifen der in der Datenquelle nicht angelegt wurde / exisitiert.
Hallo Matthias,
ich befürchte, da kommst du um eine Überprüfung bei der Ausgabe nicht herum.
$CMS_IF(dictionary.get("Test123").isEmpty)$
$CMS_VALUE("Bitte ausfüllen")$
$CMS_ELSE$
$CMS_VALUE(dictionary.get("Test123"))$
$CMS_END_IF$
Wenn es nicht eine Liste mit allen Einträgen die vorhanden sein müssten gibt, ist hier die einzige Stelle die den Name des Eintrags kennt.
Grüße
Jan
Ihr könnt euch eine spezielle Map-Implementierung bauen, die das gewünschte leistet. Das geht z.B. über Beanshell:
Dict(map) {
get(key) {
value = map.get(key);
if (value != null) {
return value;
} else {
return "no value for '" + key + "'";
}
}
return this;
}
context.put("dictionary", Dict(dictionary));
Es geht auch ohne Skript-Code:
<pre>
$CMS_SET(dictionary, {"eins":"one", "drei":"three"})$
$CMS_SET(dict)$$CMS_VALUE(dictionary[key], default:"please define translation for " + key)$$CMS_END_SET$
eins = $CMS_VALUE(dict.eval(key:"eins"))$
zwei = $CMS_VALUE(dict.eval(key:"zwei"))$
drei = $CMS_VALUE(dict.eval(key:"drei"))$
</pre>
Sehr interessant 🙂 Was passiert da genau?
Hallo Peter,
den Ansatz finde ich interessant und denke dass das genau das ist was ich suche, nur leider versteh ich´s nicht ganz bzw. kanns nicht auf meinen Code umlegen.
Deshalb poste ich jetzt meinen Code in der Hoffnung dass du mir noch mal einen Tipp geben kannst!?
$CMS_SET(map_ps_multilingualText,{"key":"value"})$
$CMS_FOR(for_multilingualText,fr_ps_multilingualText)$
$CMS_SET(void,map_ps_multilingualText.put(for_multilingualText.name,for_multilingualText.text))$
$CMS_END_FOR
bei fr_ps_multilingualText handelt es sich um einen Contentselect welcher alle Key-Value-Paare aus der Datenquelle ausliest.
Der Zugriff auf das Dict sieht wie folgt aus:
$CMS_VALUE(map_ps_multilingualText.phonetest)$
Gruß
Matthias
Also mal etwas ausführlicher
Das ist der angepasste Code aus dem Template der Projekteinstellungsseite:
<CMS_HEADER>
<CMS_FUNCTION name="contentSelect" resultname="fr_dictionary">
<CMS_PARAM name="schema" value="projectschema" />
<QUERY entityType="Dictionary"/>
</CMS_FUNCTION>
</CMS_HEADER>
$CMS_SET(dictionary,{"":""})$
$CMS_FOR(entity,fr_dictionary)$
$CMS_SET(void,dictionary.put(entity.key,entity.value)$
$CMS_END_FOR$
$CMS_SET(dict)$$CMS_VALUE(dictionary[key], default:"please define translation for " + key)$$CMS_END_SET$
(Neu ist nur die letzte Zeile)
Verwendet wird es dann wie folgt:
$CMS_VALUE(dict.eval(key:"..key..
"))$
Über das $CMS_SET(dict)$..$CMS_SET$ wird ein Templatefragment mit dem Namen "dict" erzeugt. Bei der Auswertung über dict.eval(..)$ wird dann der Parameter "key" gesetzt..
ok habs jetzt auch verstanden.
Mein einziges Problem ist jetzt noch, dass ich alle meine bestehenden Aufrufe ($CMS_VALUE(map_ps_multilingualText.{key})$
anpassen muss 😞
Aber da kann mir keiner mehr helfen 😉
Vielen Dank
Matthias