Example: Breadcrumb
Beispiel "Breadcrumb"#
Im Folgenden zeigen wir Ihnen ein Beispiel für die Konfiguration/Erzeugung einer Horizontal-Navigation mit dem Namen breadcrumb
.
Die folgende Konfiguration wird für jede einzelne Seite, durchgeführt; nur im Falle der aktuell geöffneten Seite, d.h. "active", wird eine andere CSS-Klasse gewählt, um die tatsächlich geöffnete Ebene farblich hervorzuheben.
Folgender Rubrikenbaum liegt zugrunde:
-Wurzelknoten (0)
-Stadtthemen (1)
-Aktelles (2)
-News (3)
-Veranstaltungen (3)
-Bildung (2)
-Schulen (3)
-Kinderbetreuung (3)
-Buergerservice (1)
-Tourismus (1)
0. Darstellung im HTML-Code
Im HTML-Code wird die Navigation folgendermaßen dargestellt.
Für das Beispiel wird in der Navigation die Ebene 2 "Bildung" gewählt:
Die Angabe der Ebene wurde zur besseren Veranschaulichung hier hinzugefügt und bezieht sich auf den Rubrikenbaum und die Beschreibung im nächsten Schritt.
<ul class="level_1 clearfix"> "Ebene 1 ul"
<li>
<a href="/index.html.de">Stadtthemen</a> "Ebene 1 li"
<ul class="level_2"> "Ebene 2 ul"
<li>
<a href="/aktuelles/index.html.de">
<span class="nav_label">Aktuelles</span> "Ebene 2 li"
</a>
<ul class="level_3"> "Ebene 3 ul"
<li>
<a href="/aktuelles/news/index.html.de"> "Ebene 3 li"
<span class="nav_description">News</span>
</a>
</li>
<li>
<a href="/aktuelles/veranstaltungen/index.html.de"> "Ebene 3 li"
<span class="nav_description">Veranstaltungen</span>
</a>
</li>
</ul>
</li>
<li class="active"> "Ebene 2
<a href="/schauen/bildung/index.html.de"> aktuell
<span class="nav_label">Bildung</span> gewählt"
</a>
</li>
</ul>
</li>
</ul>
Beschreibung der Darstellung im HTML-Code bezogen auf die Konfigurationsdatei (siehe unten):
- Auf jedes
ul
-Snippet folgt einli
-Snippet. - Die "ul-Zeile" im
li
-Snippet (siehe unten Konfigurationsdatei) sorgt dafür, dass die Rekursion von neuem startet, bis dascontent_maxlevel
erreicht ist. - Aufgrund der Angabe des
content_startlevel
bzw.content_maxlevel
in der Konfigurationsdatei erkennt diese, ab bzw. bis zu welcher Rubrik die Navigation erstellt werden soll. - Anhand des Rubrikenknoten im Rubrikenbaum erkennt die Konfigurationsdatei, welches Level zutrifft und gibt diese entsprechend im HTML-Code aus.
- Die Klasse
"active"
wird angewendet, wenn die Ebene aktuell gewählt ist, i.d.F. "Bildung", sodass sie farblich hervorgehoben wird.
1. Umsetzung in der Konfigurationsdatei
In der Konfigurationsdatei (z.B. navigation_generator.conf) wird die Navigation durch die "Verschachtelung" von <!--XX-li_content--> und <!--XX-ul_content--> umgesetzt.
Die nummiererten Zeilen veranschaulichen die Schritte der Rekursion, die für den Aufbau der Navigation zuständig ist, und werden unten beschrieben.
Schritte
[ ] <breadcrumb>
[ ] file_startlevel = "0"
[ ] file_maxlevel = "10"
[ ] content_startlevel = "1"
[ ] content_maxlevel = "3"
[ ] fulltree = 1
[ ]
[ ] li_snippet <<EOF
[ ] #IF (("<!--XX-current-->" EQ "1") OR ("<!--XX-nodeid-->" EQ "<!--XX-current_nodeid-->")
[ 14 ] <li class="active">
[ ] #ELSE
[2,5,8,11] <li>
[ ] #ENDIF
[ ]
[ ] #IF ("<!--XX-level-->" EQ "1")
[ 3 ] <a href="<!--XX-link-->"><!--XX-name--></a>
[ ] #ELSIF ("<!--XX-level-->" EQ "2")
[ 6,15 ] <a href="<!--XX-link-->"><span class="nav_label"><!--XX-name--></span></a>
[ ]
[ ] #ELSE
[ 9,12 ] <a href="<!--XX-link-->"><span class="nav_description"><!--XX-name--></span></a>
[ ] #ENDIF
[ul-Zeile] <!--XX-ul_content-->
[ ] </li>
[ ] EOF
[ ] ul_snippet <<EOF
[ ] #IF ("<!--XX-level-->" EQ "0")
[ 1 ] <ul class="level_1 clearfix">
[ ] #ELSIF ("<!--XX-level-->" EQ "1")
[ 4,13 ] <ul class="level_2">
[ ] #ELSE
[ 7,10 ] <ul class="level_3">
[ ] #ENDIF
[ ] <!--XX-li_content-->
[ ] </ul>
[ ] EOF
[ ] </breadcrumb>
Beschreibung der Schritte der Rekursion:
- Die Rekursion startet mit dem
ul
-Snippet in Level 1. - Sie springt dann zum
li
-Content hoch. - Die Navigation gibt das erste Level als
href
aus, d.h.link
mitname
— Navigationsebene "Stadtthemen". - Erneut beginnt es mit dem
ul
-Snippet, diesmal in Level 2.Wie bereits erwähnt, sorgt die "ul-Zeile" imli
-Snippet dafür, dass die Rekursion von neuem startet, bis dascontent_maxlevel
erreicht ist. - Sie springt zum
li
-Content hoch. - Das Level 2 trifft zu, sodass der zweite Link als
nav_label
ausgegeben wird — Navigationsebene "Aktuelles". - Das neue
ul
-Snippet beginnt, diesmal in Level 3. - Sie springt dann zum
li
-Content hoch. - In Level 3 wird der Link als
nav_description
ausgegeben — Navigationsebene "News". - bis 12. Schritt: Navigationsebene "Veranstaltungen" liegt auf derselben Ebene wie "News", sodass hier erneut ein Link als
nav_description
ausgegeben wird.
13.bis 14. Schritt: Da in der Navigation die Ebene 2 "Bildung" gewählt ist, trifft hier zusätzlich class="active"
zu.
2. SSI in Codeincludes einbinden
Die Navigationsdateien (SSI) sind für jede Seite hinterlegt; dies erfolgt in der Regel über die Codeincludes. Auch können dabei verschiedene Navigationen gleichzeitig angegeben werden z.B. für mobile und Desktop-Versionen.
Gehen Sie wie folgt vor:
- Legen Sie einen neuen Codeinclude, z.B. navigation.htms an.
-
Tragen Sie in diesem Codeinclude den Code-Schnipsel ein, z.B.:
<!--#include virtual="/ssi/navigation<!--SECTION:DIRECTORY-->/breadcrumb.<!--SECTION:__CAT_ID-->.<!--XX-lingua-->.ssi" -->
- DIRECTORY: zeigt das entsprechende Verzeichnis.
- "breadcrumb": ist der Name der Navigation aus der Konfigurationsdatei.
- CAT_ID: Rubrik, ab der begonnen wird.
- XX-lingua: beschreibt die Sprache, z.B. de.
3. SSI generieren (Menüeintrag erzeugen)
Anschließend wird die Navigation generiert. Dafür kann ein Controller in der imperia-Oberfläche folgendermaßen gesetzt werden:
- Öffnen Sie Menü -> System -> Menüs konfigurieren.
- Erstellen Sie einen neuen Menüeintrag (für nähere Informationen, siehe Kapitel Menükonfiguration):
- Wählen Sie dort den entprechenden Controller
/navigation
aus. -
Tragen Sie die Controller-Parameter ein (wie bei jedem Menüeintrag durch die Angabe der Rubriken-ID und der Konfigurationsdatei), z.B.:
?rootNodeId=/28&conf=/config/navigation_generator.conf
. -
Speichern Sie Ihre Einstellungen.
Die Navigation kann dann über einen Klick auf den Menüeintrag generiert werden.
Andere Navigationen#
Andere Navigationen können mit den folgenden Konfigurationsdateien umgesetzt werden.
Wie bereits erwähnt, ist es möglich neben dem allgemeinen Block <common>
mehrere Navigationen in einer Konfigurationsdatei zu hinterlegen.
Die folgenden Codes sind zur besseren Lesbarkeit umgebrochen.
Breadcrumbs#
Eine Breadcrumb-Navigation kann bspw. mit dem folgenden Code bewerkstelligt werden:
<breadcrumb>
file_startlevel = "0"
file_maxlevel = "10"
content_startlevel = "1"
content_maxlevel = "10"
filename = /ssi/breadcrumb<!--directory-->/<!--nav_element-->.<!--cat_id-->.<!--lingua-->.ssi
li_snippet <<EOF
#IF (("<!--XX-current-->" EQ "1") OR ("<!--XX-has_children-->" EQ "1"))
/ <a href="<!--XX-link-->" title="<!--XX-description-->"><!--XX-name--></a>
<!--XX-ul_content-->
#ENDIF
EOF
ul_snippet <<EOF
<!--XX-li_content-->
EOF
</breadcrumb>
Darstellung im HTML-Code:
/ <a href="/index.html.de" title="">Stadtthemen</a>
/ <a href="/aktuelles/index.html.de" title="">Aktuelles</a>
/ <a href="/aktuelles/news/index.html.de" title="News, Verkehrsinfo, Bekanntmachungen">News</a>
Auch hier findet wieder die Rekursion statt:
ul_snippet
bezieht sich auf dasli_content
.-
Hat das
li
-Element einen Link, Titel und Namen, so wird dieses im HTML-Code ausgegeben.- Das erste Element besitzt einen Link und den Namen "Aktuelles", aber keinen Titel (description).
- Das zweite Element besitzt einen Link, den Titel/Beschreibung sowie den Namen "News".
Anderes Code-Beispiel für eine Breadcrumb-Navigation:
<breadcrumb>
file_startlevel = "0"
file_maxlevel = "10"
content_startlevel = "0"
content_maxlevel = "10"
fulltree = "1"
li_snippet <<EOF
#IF ("<!--XX-current-->")
#IF ("<!--XX-level-->" EQ "4")
#ELSE
<li><a href="/<!--XX-project_lang--><!--XX-directory-->" title="<!--XX-description-->" class="active"><!--XX-name--></a></li>
#ENDIF
#ELSIF ("<!--XX-current_nodeid-->" REQ "<!--XX-nodeid-->")
<li><a href="/<!--XX-project_lang--><!--XX-directory-->" title="<!--XX-description-->"><!--XX-name--></a></li>
#IF ("<!--XX-has_children-->")
<span class="hasChildren">/</span>
#ENDIF
#ENDIF
<!--XX-ul_content-->
EOF
ul_snippet <<EOF
<!--XX-li_content-->
EOF
</breadcrumb>
Einfache Navigationen#
Einfache Horizontal- oder Vertikal-Navigationen können bspw. mit folgenden Codes bewerkstelligt werden (aus navigation_generator.conf.sample):
Horizontal
<hnav>
file_startlevel = "0"
file_maxlevel = "0"
content_maxlevel = "1"
li_snippet <<EOF
<li class="hnav">
<a href="<!--XX-link-->" title="<!--XX-description-->" target="<!--XX-linktarget-->"><!--XX-name--></a>
<!--XX-ul_content-->
</li>
EOF
ul_snippet <<EOF
<ul class="hnav">
<!--XX-li_content-->
</ul>
EOF
</hnav>
Vertikal
<vnav>
file_startlevel = "0"
file_maxlevel = "02"
content_maxlevel = "03"
li_snippet <<EOF
<li class="vnav">
<a href="<!--XX-link-->" title="<!--XX-description-->"
target="<!--XX-linktarget-->"><!--XX-name--></a>
<!--XX-ul_content-->
</li>
EOF
ul_snippet <<EOF
<ul class="vnav">
<!--XX-li_content-->
</ul>
EOF
</vnav>
Sub-Navigation
<subnav>
file_startlevel = "0"
file_maxlevel = "10"
content_startlevel = "3"
content_maxlevel = "3"
fulltree = 0
li_snippet <<EOF
#IF (("<!--XX-current-->" EQ "1") OR ("<!--XX-nodeid-->" EQ "<!--XX-current_nodeid-->")
<li class="active">
#ELSE
<li>
#ENDIF
<a href="<!--XX-link-->" class="btn btn-lg btn-primary btn-block">
<span><!--XX-name--></span>
</a>
<!--XX-ul_content-->
</li>
EOF
ul_snippet <<EOF
#IF ("<!--XX-level-->" EQ "2")
<ul class="subnav_list">
#ENDIF
<!--XX-li_content-->
#IF ("<!--XX-level-->" EQ "2")
</ul>
#ENDIF
EOF
</subnav>
Navigationen mit Drop-Down#
Horizontal-Navigationen mit Drop-Down können bspw. mit folgenden Codes bewerkstelligt werden (aus navigation_generator.conf.sample):
Horizontal mit Drop-Down
<navigationmenu>
file_startlevel = "0"
file_maxlevel = "3"
content_startlevel ="1"
content_maxlevel = "2"
fulltree = "1"
ul_snippet <<EOF
#IF ("<!--XX-level-->" EQ "0")
<ul class="nav navbar-nav uppercase topnavigation">
<!--XX-li_content-->
</ul>
#ELSIF ("<!--XX-level-->" EQ "1")
<a href="#" class="dropdown-toggle customCollapseCaret" data-toggle="dropdown" role="button" >
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<!--XX-li_content-->
</ul>
#ELSIF ("<!--XX-level-->" EQ "2")
<ul class="dropdown-menu" role="menu">
<!--XX-li_content-->
</ul>
#ENDIF
EOF
li_snippet <<EOF
#IF ("<!--XX-level-->" EQ "1")
<li class="dropdown">
<a href="/<!--XX-project_lang--><!--XX-directory-->"
title="<!--XX-description-->" target="<!--XX-linktarget-->"><!--XX-name--></a>
<!--XX-ul_content-->
</li>
#ELSIF ("<!--XX-level-->" EQ "2")
<li class="dropdown">
<a href="/<!--XX-project_lang--><!--XX-directory-->"
title="<!--XX-description-->" target="<!--XX-linktarget-->"><!--XX-name--></a>
</li>
#ENDIF
EOF
</navigationmenu>
Mobile Navigation mit Drop-Down
<mobile_nav>
file_startlevel = "0"
file_maxlevel = "10"
content_startlevel = "1"
content_maxlevel = "10"
# include all category entries
fulltree = 1
li_snippet <<EOF
#IF (("<!--XX-level-->" EQ "1") AND ("<!--XX-has_children-->" EQ "1"))
#IF ("<!--XX-current-->" EQ "1")
<li class="dropdown open">
#ELSE
<li class="dropdown">
#ENDIF
<a href="<!--XX-link-->" class="dropdown-toggle" data-toggle="dropdown" title="<!--XX-description-->"><!--XX-name--> <b class="caret"></b></a>
#ELSE
#IF ("<!--XX-current-->" EQ "1")
<li class="active">
#ELSE
<li>
#ENDIF
<a href="<!--XX-link-->" title="<!--XX-description-->"><!--XX-name--></a>
#ENDIF
<!--XX-ul_content-->
</li>
EOF
ul_snippet <<EOF
#IF ("<!--XX-level-->" EQ "0")
<ul class="nav nav_mobile">
#ELSE
<ul class="dropdown-menu">
#ENDIF
<!--XX-li_content-->
</ul>
EOF
</mobile_nav>
Sitemaps#
Ein Sitemap kann bspw. mit den folgenden Codes bewerkstelligt werden (aus navigation_generator.conf.sample):
Beispiel 1:
<sitemap>
file_startlevel = "0"
file_maxlevel = "0"
content_maxlevel = "1"
# include all category entries
fulltree = 1
li_snippet <<EOF
<li class="hnav">
<a href="<!--XX-link-->" title="<!--XX-description-->"
target="<!--XX-linktarget-->"><!--XX-name--></a>
<!--XX-ul_content-->
</li>
EOF
ul_snippet <<EOF
<ul class="hnav">
<!--XX-li_content-->
</ul>
EOF
</sitemap>
Beispiel 2 (Tabellenform):
<sitemap>
file_startlevel = "0"
file_maxlevel = "0"
content_maxlevel = "0"
content_maxlevel = "10"
# include all category entries
fulltree = 1
li_snippet <<EOF
<hr />
<table border="0" style="border:thin solid silver" >
<tr><td width="200px">name </td><td width="350px"><!--XX-name--></td></tr>
<tr><td>description </td><td><!--XX-description--></td></tr>
<tr><td>cat-directory </td><td><!--XX-directory--></td></tr>
<tr><td>cat-filename </td><td><!--XX-filename--></td></tr>
<tr><td>link </td><td><!--XX-link--></td></tr>
<tr><td>linktarget </td><td><!--XX-linktarget--></td></tr>
<tr><td>current </td><td><!--XX-current--></td></tr>
<tr><td>has_children </td><td><!--XX-has_children--></td></tr>
<tr><td>active </td><td><!--XX-active--></td></tr>
<tr><td>cat_skip </td><td><!--XX-cat_skip--></td></tr>
<tr><td>doc_count </td><td><!--XX-doc_count--></td></tr>
<tr><td>level </td><td><!--XX-level--></td></tr>
<tr><td>levelindex </td><td><!--XX-levelindex--></td></tr>
<tr><td>catid </td><td><!--XX-catid--></td></tr>
<tr><td>nodeid </td><td><!--XX-nodeid--></td></tr>
<tr><td>current_nodeid </td><td><!--XX-current_nodeid--></td></tr>
</table>
<!--XX-ul_content-->
EOF
ul_snippet <<EOF
<!--XX-li_content-->
EOF
</sitemap>
Footer#
<fnav>
file_startlevel = "0"
file_maxlevel = "0"
content_startlevel = "1"
content_maxlevel = "2"
fulltree = "1"
li_snippet <<EOF
#IF NOT ("<!--XX-description-->" REQ "PAGEFOOTER")
#IF ("<!--XX-level-->" EQ "1")
<div class="subLinkBox">
<h2><!--XX-name--></h2>
<!--XX-ul_content-->
</div>
#ELSE
#IF ("<!--XX-level-->" EQ "2")
<!--XX-ul_content-->
<li><a href="<!--XX-link-->"><!--XX-name--></a></li>
#ELSE
<!--XX-ul_content-->
#ENDIF
#ENDIF
#ENDIF
EOF
ul_snippet <<EOF
#IF NOT ("<!--XX-description-->" REQ "PAGEFOOTER")
#IF ("<!--XX-level-->" EQ "1")
<ul class="subLinkList">
#ENDIF
<!--XX-li_content-->
#IF ("<!--XX-level-->" EQ "1")
</ul>
#ENDIF
#ENDIF
EOF
</fnav>
escaper-Plug-in CATMETA.pm
- in Entwicklung#
Dieses Plug-in kann in der navigation_generator.conf
genutzt werden, um alle relevanten Metadaten der Rubriken zu erhalten.
NAME
Dynamic::Escape::CATMETA
DESCRIPTION
The Dynamic::Escape::CATMETA module can be used for accessing Category-Metafields when the node_id is given.
SYNTAX
In templates:
<!--XX-CATMETA(__imperia_ac_enabled):cat_nodeid-->
This will return the value of the field __imperia_ac_enabled from the category specified by the node_id <!--XX-cat_nodeid--> of the element
rendered.
Data will automatically be HTML-escaped.
You can specify another escaper by passing it seperated by a comma.
<!--XX-CATMETA(__imperia_ac_enabled,HTML):cat_nodeid-->
Would return the Field unescaped.