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