- 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

