Questions & Answers

Brixlent
I'm new here

Fallback- / Defaultvalue bei Dictonary

Hallo zusammen,

wir verwenden in unserem Projekt ein Dictionary fรผr die Mehrsprachigkeit analog dem folgenden Community-Beitrag:

https://community.e-spirit.com/community/inside-firstspirit/blog/2013/09/30/dictionaries-in-firstspi...

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

9 Replies
kohlbrecher
Crownpeak employee

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

0 Kudos

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.

0 Kudos

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

0 Kudos

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));

Peter
0 Kudos

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>

Peter

Sehr interessant ๐Ÿ™‚ Was passiert da genau?

0 Kudos

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

0 Kudos

Also mal etwas ausfรผhrlicher Smiley Wink

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..

Peter

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

0 Kudos

Type a product name