Juncus
Returning Observer

Sprachwechsel und automatisches Auslesen des Menüpunktnamens bei interner Verlinkung

Jump to solution

Hallo Zusammen,

ich habe Probleme bei der Lösung von Sprachwechseln bei internen Verlinkungen und einer damit einhergehenden automatischen Auslesung des Menüpunktnamens oder der Headline-Überschrift der entsprechenden, verlinkten Page.

Für interne Links haben wir folgende Formularelemente

<FS_REFERENCE name="lt_pageref_link" hFill="yes" imagePreview="no" useLanguages="no">

    <FILTER>

      <ALLOW type="pageref"/>

      <HIDE type="documentgroup"/>

    </FILTER>

    <LANGINFOS>

      <LANGINFO lang="DE" label="Interne Seitenreferenz"/>

      <LANGINFO lang="*" label="Page reference"/>

    </LANGINFOS>

    <PROJECTS>

      <LOCAL name=".">

        <SOURCES>

          <FOLDER name="root" store="sitestore"/>

        </SOURCES>

      </LOCAL>

    </PROJECTS>

  </FS_REFERENCE>

  <CMS_LABEL name="lt_language_info" bold="no" size="12">

    <LANGINFOS>

      <LANGINFO lang="DE" label="Infotext für den Sprachwechsel"/>

      <LANGINFO lang="*" label=""/>

    </LANGINFOS>

  </CMS_LABEL>

  <CMS_INPUT_COMBOBOX name="lt_language_link" hFill="yes" singleLine="no" useLanguages="no">

    <CMS_INCLUDE_OPTIONS type="language"/>

    <LANGINFOS>

      <LANGINFO lang="*" label="Language"/>

      <LANGINFO lang="DE" label="Sprache"/>

    </LANGINFOS>

  </CMS_INPUT_COMBOBOX>

Dadurch kann man bei einer mehrsprachigen Website zwischen den Sprachen interne Links setzen.

Den Link lesen wir im HTML-Bereich wie folgt aus:

$CMS_REF(lt_pageref_link, language:lt_language_link.getKey())$

Funktioniert prima.

Zusätzlich soll aber entweder die Überschrift der verlinkten Seite direkt ausgeben werden oder falls keine Überschrift vorhanden ist der Menüpunktname eingeblendet werden.

Dies hat bisher ohne die Funktionalität der Sprachauswahl gut mit folgenden Zeilen geklappt:

  • Überschrift auslesen: st_pageref_link.get().page.formData.pt_page_header.items[0].st_page_headline

Das Eingabefeld für die Überschrift hat den Namen 'pt_page_header', hängt an einer Seitenvorlage und ist vom Typ FS_Catalog in den per Rule nur ein Element eingetragen werden darf. Von diesem Element holen wir per items[0] uns das Eingabefeld der Überschrift mit dem Namen 'st_page_headline'.

  • Menünamen auslesen: st_pageref_link.get.DisplayName(#global.language)

Sobald jetzt aber die Sprachauswahl ins Spiel kommt müsste der Menüpunkt in einer anderen Sprache ausgelesen werden oder die Headline in der entsprechenden Sprache.

Verschiedenste Versuche mit lt_language_link.getKey() haben aber leider nicht geklappt.

Hat jemand eine Idee für beide Fälle?

1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Ralf,

hier musst Du die im Java ApiDoc (genauer: Access-API) dokumentierten Methoden nutzen, da es hierfür keine "vereinfachte" Template-Syntax gibt.

Der "Abbiegepunkt" wäre hier das FormData-Objekt, das Du nach dem Teil "st_pageref_link.get().page.formData" hast.

Versuch bitte mal folgendes:

lt_pageref_link.get().page.formData.get(lt_language_link.value, "pt_page_header").items[0].st_page_headline

und analog für den Menünamen

lt_pageref_link.get.getDisplayName(lt_language_link.value)

Das "value" brauchst Du hier, weil die API-Methode FormData#get(Language language, String fieldName) für die Sprache nur ein echtes Language-Objekt nimmt, das Sprachkürzel funktioniert dort nicht. Das könnte man sich zwar über die Abkürzung holen, das <CMS_INCLUDE_OPTIONS type="language"/> liefert das aber praktischerweise auch direkt über ".value".

Kleine Anmerkung: Im Formular in Deinem Posting heißt es lt_pageref_link, in den Beispielen weiter unten dann st_pageref_link - ich vermute aber mal, da ist nur beim Posting etwas durcheinander geraten, oder habe ich etwas übersehen?

Viele Grüße

Michael

View solution in original post

0 Kudos
4 Replies
mbergmann
Crownpeak employee

Hallo Ralf,

hier musst Du die im Java ApiDoc (genauer: Access-API) dokumentierten Methoden nutzen, da es hierfür keine "vereinfachte" Template-Syntax gibt.

Der "Abbiegepunkt" wäre hier das FormData-Objekt, das Du nach dem Teil "st_pageref_link.get().page.formData" hast.

Versuch bitte mal folgendes:

lt_pageref_link.get().page.formData.get(lt_language_link.value, "pt_page_header").items[0].st_page_headline

und analog für den Menünamen

lt_pageref_link.get.getDisplayName(lt_language_link.value)

Das "value" brauchst Du hier, weil die API-Methode FormData#get(Language language, String fieldName) für die Sprache nur ein echtes Language-Objekt nimmt, das Sprachkürzel funktioniert dort nicht. Das könnte man sich zwar über die Abkürzung holen, das <CMS_INCLUDE_OPTIONS type="language"/> liefert das aber praktischerweise auch direkt über ".value".

Kleine Anmerkung: Im Formular in Deinem Posting heißt es lt_pageref_link, in den Beispielen weiter unten dann st_pageref_link - ich vermute aber mal, da ist nur beim Posting etwas durcheinander geraten, oder habe ich etwas übersehen?

Viele Grüße

Michael

0 Kudos
Juncus
Returning Observer

Hallo Michael,

vielen Dank für deine Hilfe.

Zu deiner Anmerkung bezüglich Benennung (lt -st): Da gab es von mir einen Kopierfehler. Wir nutzen die Lösung sowohl in Verweisvorlagen als auch in Absatzvorlagen.

Deine Tips haben mir sehr geholfen und ich konnte die Probleme lösen.

Dein Vorschlag für die Menüpunktnamen hat sofort geklappt.

Ich habe Ihn allerdings jetzt noch etwas abgewandelt um nicht die Namen der Pageref sondern nur die Namen aus der Menüstruktur (Folder) zu erhalten.

$CMS_VALUE(ref(lt_pageref).target.parentFolder.languageInfo(lt_language_link.value).displayName)$

Bei der Lösung zum Auslesen der Headline musste ich etwas rumprobieren.

Ich konnte aber, dank deines Codes das Ganze an den Aufbau der Seiten und Absätze bei uns anpassen.

Da bei uns das Formularfeld pt_page_header vom Typ FS_Catalog ist und sprachunabhängig eingestellt ist und die darin liegende Headline-Absatzlösung die Sprachabhängigkeit löst konnte ich das Ganze so aufrufen:

$CMS_VALUE(lt_pageref.get().page.formData.pt_page_header.items[0].get(lt_language_link.value, "st_page_headline").get)$

Viele Grüße v.

Ralf

0 Kudos
mbergmann
Crownpeak employee

Hallo Ralf,

freut mich dass es klappt!

Was mir noch einfiel: Wenn Du eh auf die Ordner gehst, ist es ggf. sinnvoller den Menünamen zu nehmen statt des Anzeigenamens.

Grund: Die Anzeigenamen gibt es je nach Konfiguration der Sprachen nicht zwingend in allen Ausgabesprachen sondern nur in den Redaktionssprachen (die eine Teilmenge der Ausgabesprachen sind). Den Menünamen schon.

Ausgehend vom Ordner wäre das folder.getFolderLangSpec(lt_language_link.value).label

Viele Grüße

Michael

Juncus
Returning Observer

Hallo Michael,

danke für den Tip.

Hab es schon eingebaut.

Falls es jemanden, der auch eine solche Frage hat, interessiert hier noch der funktionierende Codeschnipsel:

$CMS_VALUE(ref(lt_pageref).target.parentFolder.getFolderLangSpec(lt_language_link.value).label)$

Viele Grüße v.

Ralf

0 Kudos