Search the FirstSpirit Knowledge Base
Hallo zusammen.
Ein Kunde von uns möchte gerne selbstständig Sitemaps für Unterbereiche seines Projekts erzeugen.
Unser Plan war das ganze über ein eigenes Seiten-Template zu realisieren. Der Kunde kann in den Einstellungen der Seite den Ordner wählen der der Root für die Sitemap sein soll und das Template erzeugt über die Navigation Header Funktion eine Sitemap.
Auf dem Papier sollte das auch gehen, indem der ausgewählte Ordner als root Parameter an die Funktion übergeben wird. Mit fest eingetragenen Referenznamen funktioniert das auch super. Aber wir bekommen es nicht hin, dass der Ausgewählte Ordner als Parameter akzeptiert wird.
Das Template sieht wie folgt aus:
<CMS_HEADER>
<CMS_FUNCTION name="Navigation" resultname="fr_ft_sitemap">
<CMS_PARAM name="expansionVisibility" value="all"/>
<CMS_PARAM name="siteMap" value="1" />
<CMS_VALUE_PARAM name="root" value="pt_rootFolder"/>
<CMS_ARRAY_PARAM name="pageRefRendering">
<CMS_ARRAY_ELEMENT index="0..10"><![CDATA[
...
]]></CMS_ARRAY_ELEMENT>
</CMS_ARRAY_PARAM>
</CMS_FUNCTION>
</CMS_HEADER>
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
$CMS_VALUE(fr_ft_sitemap.toString.trim)$
</urlset>
Wobei pt_rootFolder die FS_REFERENCE Eingabekomponente für den Ordner ist.
Die Generierung wirft folgenden Fehler:
ERROR (header function 'Navigation', resultname = 'fr_ft_sitemap' at 2, 2): at 2, 2: invalid value for parameter 'root', invalid reference '[services_2:SITESTORE_FOLDER]@4af3a35d'
Ok. Offenbar ist das nicht der Typ von Referenz, der dort gefragt ist. Leider konnten wir der Dokumentation nicht entnehmen was genau da benötigt wird.
Außerdem scheint es auch nicht zu funktionieren dort frei im Template definierte Variablen zu übergeben.
Wenn wir im Template vorher eine Variable definieren
$CMS_SET(set_root, #global.node)$
und diese dann als Parameter übergeben wollen
<CMS_VALUE_PARAM name="root" value="set_root"/>
kommt immer der Fehler
ERROR (header function 'Navigation', resultname = 'fr_ft_sitemap' at 2, 2): at 2, 2: invalid value for parameter 'root', invalid reference ''
Und das unabhängig davon was wir da definieren. Wir haben also gar nicht die Chance und so den richtigen Typ von Value für den Parameter zusammenzubauen.
Hat jemand einen Tipp was wir falsch machen, oder wo es eine Dokumentation dafür geben könnte?
Grüße
Patrick
Hallo Patrick,
die Navigationsfunktion erwartet an der Stelle einen String, der den Startpunkt definiert. Also etwas in der Art von "pagefolder:my_folder".
Ihr müsste also "nur" dafür sorgen, dass dieser String als Wert des CMS_VALUE_PARAMs übergeben wird.
Eine einfache Lösung wäre es, das per Hand zusammenzubauen, also beispielsweise:
<CMS_VALUE_PARAM name="root" value='"pagefolder:" + pt_rootFolder.get().getUid()'/>
Ich schreibe "einfache Lösung", da diese Lösung sich darauf verlässt, dass in der Eingabekomponente ein Ordner aus der Struktur-Verwaltung ausgewählt wurde. Die FS_REFERENCE Eingabekomponente muss also entsprechend konfiguriert sein.
Anmerkung: Im Header können " und ' verwendet werden. Die Schreibweise oben ist also korrekt und sollte auch so funktionieren
Und noch ein kurzer Hinweis, warum es mit dem CMS_SET nicht klappt - das ist ein Reihenfolgeproblem. Die Navigationsfunktion im Header wird beim Parsen des Headers berechnet. Zu dem Zeitpunkt wurde das CMS_SET noch nicht aufgerufen, die Variable existiert also noch nicht. Lösung hier ist es, ein Formattemplate zu benutzen, in das manuell ein <CMS_HEADER> mit der Navigationsfunktion eingefügt wird und in dem die Navigationsfunktion dann auch (unterhalb des schließenden </CMS_HEADER>) ausgegeben wird.
Entweder kann in dem CMS_RENDER Aufruf die entsprechende Variable direkt übergeben werden oder diese kann zuvor (beispielsweise über ein CMS_SET) in den Kontext geschrieben werden. In beiden Fällen ist die Variable dann beim Berechnen der Navigationsfunktion verfügbar.
Viele Grüße
Holger
Hallo Patrick,
die Navigationsfunktion erwartet an der Stelle einen String, der den Startpunkt definiert. Also etwas in der Art von "pagefolder:my_folder".
Ihr müsste also "nur" dafür sorgen, dass dieser String als Wert des CMS_VALUE_PARAMs übergeben wird.
Eine einfache Lösung wäre es, das per Hand zusammenzubauen, also beispielsweise:
<CMS_VALUE_PARAM name="root" value='"pagefolder:" + pt_rootFolder.get().getUid()'/>
Ich schreibe "einfache Lösung", da diese Lösung sich darauf verlässt, dass in der Eingabekomponente ein Ordner aus der Struktur-Verwaltung ausgewählt wurde. Die FS_REFERENCE Eingabekomponente muss also entsprechend konfiguriert sein.
Anmerkung: Im Header können " und ' verwendet werden. Die Schreibweise oben ist also korrekt und sollte auch so funktionieren
Und noch ein kurzer Hinweis, warum es mit dem CMS_SET nicht klappt - das ist ein Reihenfolgeproblem. Die Navigationsfunktion im Header wird beim Parsen des Headers berechnet. Zu dem Zeitpunkt wurde das CMS_SET noch nicht aufgerufen, die Variable existiert also noch nicht. Lösung hier ist es, ein Formattemplate zu benutzen, in das manuell ein <CMS_HEADER> mit der Navigationsfunktion eingefügt wird und in dem die Navigationsfunktion dann auch (unterhalb des schließenden </CMS_HEADER>) ausgegeben wird.
Entweder kann in dem CMS_RENDER Aufruf die entsprechende Variable direkt übergeben werden oder diese kann zuvor (beispielsweise über ein CMS_SET) in den Kontext geschrieben werden. In beiden Fällen ist die Variable dann beim Berechnen der Navigationsfunktion verfügbar.
Viele Grüße
Holger
Hallo Holger,
deine Lösung funktioniert.
Danke für die Schnelle Hilfe und die ausführliche Erklärung