- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Fallback- / Defaultvalue bei Dictonary
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
- Labels:
-
Developers
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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));
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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>
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sehr interessant 🙂 Was passiert da genau?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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

