mario_harnisch
I'm new here

Navigation encodieren

Jump to solution

Hallo,

ich habe eine Herausforderung mit der Encodierung von Menünamen.

Der Menüname in der Struktur lautet bspw.: "Hilfreiches" Wissen => also mit Hochkomma

Über eine Navigationsfunktion aus Modul etracker wird ähnlich einer Breadcrumb die Ordnerstruktur herausgeschrieben, um diese für die etracker-Auswertung "Bereich" (area) zu verwenden.

=> Im obigen Fall wäre dies entsprechend: "/Newsticker/Meldung/"Hilfreiches" Wissen"

Das geschulte Auge erkennt sofort: hier stimmt entwas mit den Hochkommata nicht. Smiley Wink

Diese Ausgabe wird dann etracker übergeben und macht verständlicherweise Probleme in der Auswertung.

Glücklicherweise gibt es in FS nützliche Funktionen auf Strings, wie "encode".

In der Navigationsfunktion wird #nav.label benutzt, um den jeweiligen Knoten auszulesen. Laut Doku sollte dies auch einen String zurückgeben. Tut es aber nicht. Smiley Sad Aus diesem Grund kann ich hier also, soweit mir bekannt, das "encode" nicht nutzen.

Später im Code wird die Navigation in die Variable "area" geschrieben:

$CMS_SET(area, fr_navigation_etracker)$

Sowohl "area" und "fr_navigation_etracker" sind vom Typ "NavigationFunction", welche nicht in der API verzeichnet ist. Smiley Sad

Daher die Frage: wie schaffe ich es, dass die Navigation von Sonderzeichen befreit HTML-encodiert ausgegeben wird?

Am reellen Beispiel:

<script....

     ...    

     var et_areas = '$CMS_VALUE(area,default:"")$';

     ...

</script>

Spätestens im No-Skript-Teil gibt es Probleme:

<noscript>

     ...

     &amp;et_areas=$CMS_VALUE(area,default:"")$

     ...

</noscript>

Vielen Dank für Feedback Smiley Happy

Grüße

Mario

0 Kudos
1 Solution

Accepted Solutions

Sorry, habe deine neuen Posts erst jetzt gesehehn - "encode" ist ja auch nicht die Methode, die du aufrufen willst - du willst wahrscheinlich "quoteJS" aufrufen?!

>>>

/private/"Unternehmen"

===

/private/\"Unternehmen\"

<<<

Peter

View solution in original post

0 Kudos
12 Replies
Peter_Jodeleit
Crownpeak employee

"#nav.label" ist vom Typ "java.lang.String". Der Trick wäre also, die dort enthaltenen doppelten Hochkommatas durch JavaScript-escapte zu ersetzen.

Peter
0 Kudos

Hallo Peter,

danke für dein Antwort.

Wenn du escapen mit JS meinst: Das ist richtig, funktioniert aber jedoch nur im <script>-Bereich. Im <noscript>-Bereich geht's dann leider nicht mehr so. Smiley Sad

Ja, ist ein String. Hast recht.

Soo.. nun die letzt Bearbeitung. Musste es erst nochmal nachstellen:

Also folgendes getan:

<CMS_ARRAY_PARAM name="selectedHTML">

            <CMS_ARRAY_ELEMENT index="0..10"><![CDATA[$CMS_TRIM(level:4)$/$CMS_VALUE(#nav.label.encode,default:"")$$CMS_END_TRIM$]]></CMS_ARRAY_ELEMENT>

        </CMS_ARRAY_PARAM>

Ergebnist:

Ausgabe: /FSID:cHJpdmF0ZQ--/FSID:SG9tZQ--

Viele Grüße

Mario

0 Kudos

Jetzt blick ich nicht mehr durch. Sagst du gerade, das du 2x "area" ausgibst und das sich die erste Ausgabe von der zweiten unterscheidet?

Peter
0 Kudos

Hallo Peter,

bzgl. der Frage: nein.

Also.. in der Vorlage des Webcontrollingsmodul (etracker) steht folgendes:

Oben die Navigationsfunktion zum Aufbau für das etracker-Feld "Bereich"

<CMS_FUNCTION name="Navigation" resultname="fr_navigation_etracker" context="PAGE">

[...]

        <CMS_PARAM name="expansionVisibility" value="all"/>

<CMS_ARRAY_PARAM name="selectedHTML">

            <CMS_ARRAY_ELEMENT index="0..10"><![CDATA[$CMS_TRIM(level:4)$/$CMS_VALUE(#nav.label,default:"")$$CMS_END_TRIM$]]></CMS_ARRAY_ELEMENT>

        </CMS_ARRAY_PARAM>

[...]

Weiter unten setzt die Webcontrolling-Vorlage dann

$CMS_SET(area, fr_navigation_etracker)$

Und die Variable "area" wird dann in den JS-Teil des etrackers gestetzt

<script type="text/javascript">

[...]

var et_areas = '$CMS_VALUE(area,default:"")$';

[...]

</script>

<noscript>

[...]

&amp;et_areas=$CMS_VALUE(area,default:"")$

[...]

</noscript>

Mein Problem ist, dass über die Struktur auf dem Knoten der Menüname gesetzt wird und Sonderzeichen aufweist. Das Problem macht eigentlich nur das Hochkomma.

Wenn ich das Problem mit JS erschlage wöllte, funktioniert das im <script>-Bereich mit

<script type="text/javascript">

[...]

var et_areas = 'escape('$CMS_VALUE(area,default:"")$')';

[...]

</script>

(jedoch nur solange nicht einfache Hochkommas verwendet werden).

FS-generiert wird ja folgendes erzeugt

<script type="text/javascript">

[...]

var et_areas = '"Hilfreiches" Wissen"';

[...]

</script>

Jedoch im <noscript>-Bereich funktioniert ja logischerweise JS nicht. Also fällt das Vorgehen raus.

Wenn ich die Encodierung mit JSP erschlagen will, funktioniert das auch nicht, wie am Beispiel:

<%

     String area = "$CMS_VALUE(area,default:"")$";

     area = StringEscapeUtils.escapeHtml4(area);

%>

=> nach der FS-Genierierung

<%

     String area = ""Hilfreiches" Wissen";

     area = StringEscapeUtils.escapeHtml4(area);

%>

Error wegen den Hochkommas. Somit funktioniert JSP auch nicht, weil die generierte Variable noch Sonderzeichen besitzt.

Also müsste man es mit FS-Mitteln erschlagen, also bspw. die String-Funktion "encode".

Diese funktioniert aber nicht auf "#nav.label" (#nav.label.encode), weder noch auf "area" ($CMS_SET(area2, area.encode)$)

Auf #nav.label musste es evtl. funktionieren, jedoch bringt er (wie oben gezeigt) hier die FS-IDs zurück. Auf "area" funktioniert die String-Methode nicht, weil "area" bzw. "fr_navigation_etracker" vom Typ "NavigationFunction" ist.

"NavigationFunction" ist jedoch nicht in der API und auch ein javap hat mir keine (mir logische) Methode auf die Klasse zurückgegeben, mit der ich arbeiten könnte, um das Ergebnis (die Encodierung) zu erreichen.

Mir ist es auch noch nicht gelungen, "area" irgendwie in einen String umzuwandeln.

Wie könnte ich das Problem lösen?

Viele Grüße

Mario

0 Kudos

Keine Ideen / Lösungsvorschläge?

0 Kudos

Hallo Mario,

vielleicht bin ich auf dem falschen Dampfer, aber eigentlich solltest Du die Ausgabe Deiner Navigationsfunktion mit area.toString() erhalten (also in einen String umwandelt).

Danach kannst Du ja Deine benötigten Ersetzungen auf diesem String machen.

$CMS_SET(areaString, area.toString())$

//Ersetzung....

$CMS_VALUE(areaString)$

Viele Grüße

Jan Tilo

0 Kudos

Hallo Jan Tilo,

vielen Dank für deine Antwort. Das funktioniert aber leider nicht.

Die Anweisung

>>><br/>

$CMS_SET(areaString, area.toString())$

$CMS_VALUE(areaString)$<br/>

===<br/>

$CMS_VALUE(areaString.encode)$<br/>

<<<

bringt folgendes zurück:

>>>

/private/"Unternehmen"

===

FSID:L3ByaXZhdGUvIlVudGVybmVobWVuIg--

<<<

Das Problem mit dem "encode" besteht also leider weiterhin.

Viele Grüße

Mario

0 Kudos

Hallo Mario,

ich denke jetzt hab ich's verstanden.

Du solltest einfach eine andere Methode benutzen. Encode ist denke ich nicht das was du brauchst: siehe Doku--> Returns an encoded representation of a string that follows the rules for HTML id-attributes.

Evtl. dachtest Du an die Methode urlEncode:

$CMS_VALUE("/private/\"Unternehmen\"".urlEncode)$ --> %2Fprivate%2F%22Unternehmen%22

Wenn das nicht das ist was Du brauchst, könntest Du ein einfaches Replace machen:

$CMS_VALUE("/private/\"Unternehmen\"".replaceAll("\"", "'"))$ --> /private/'Unternehmen'

oder Du arbeitest mit Konvertierungsregeln:

$CMS_VALUE(areaString.convert(<Name der Konvertierungsregel>))$

wobei du entsprechende Konvertierungregeln definieren müsstest die für Dich passen.

Viele Grüße

Jan Tilo

0 Kudos

Sorry, habe deine neuen Posts erst jetzt gesehehn - "encode" ist ja auch nicht die Methode, die du aufrufen willst - du willst wahrscheinlich "quoteJS" aufrufen?!

>>>

/private/"Unternehmen"

===

/private/\"Unternehmen\"

<<<

Peter
0 Kudos