So geben Sie Listeninhalte in der Navigation aus

Dieser Artikel beschreibt, wie Sie eine Weblication® CMS Liste in die Navigation integrieren.

Um in der Navigation auch Listeninhalte mit auszugeben, erweitern Sie das Navigationstemplate um die Abfrage auf das Listenelement.

Das nachfolgende Beispiel führt dies anhand des Inhaltsverzeichnisses (Sitemap) an.

Erweitern Sie das XSL-Stylesheet für Listen um die Abfrage, ob die aufgerufene URL eine Sitemap ist. Das Beispiel geht davon aus, dass die Sitemap im Verzeichnis .../sitemap/... liegt. Trifft dies zu, wird für die Liste ein spezielles Listentemplate gesetzt.

BASE Mobile First
BASE Classic
BASE Mobile First

Beispiel: Auszug aus dem XSL-Element der Liste (z.B. list.standard.wItem.php)

<!-- ... (ab ca. Zeile 383) -->
          <wsl:php>
            <xsl:if test="not($wIsInEditor and @wEditorId) and wd:fragment[@id = 'execution']/text() = 'post' and not($wViewMode = 'newsletter')">
              <xsl:attribute name="execution">post</xsl:attribute>
              <!--
              <xsl:attribute name="expires"><xsl:value-of select="wd:fragment[@id = 'expires']/text()"/></xsl:attribute>
              -->
              <xsl:attribute name="cacheIdCallback"><xsl:value-of select="wd:fragment[@id = 'cacheIdCallback']/text()"/></xsl:attribute>
            </xsl:if>

            $elementId      = '<xsl:value-of select="@uid"/>';
            $listId         = substr($elementId, 0, 8);
            //if(isset($GLOBALS['wTmp']['listIds'][$listId])){
            //  $listId = substr(md5(rand(0, 999999)), 0, 8);
            //}
            //$GLOBALS['wTmp']['listIds'][$listId] = 1;
            //$template       = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='listtemplate']/text())"/>';
            /*
              ### Manuelle Anpassung für Listenausgabe in der Navigation bei der Sitemap ($template Zeile per Abfrage) - ANFANG ###
            */
            // Prüfen, ob die Sitemap als URL aufgerufen wird (z.B. /de/sitemap/index.php), um ein anderes Listen-Template mitzugeben:
            if(preg_match('/\/sitemap\//', $_SERVER['REQUEST_URI'])){
              $template = '/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/lists/sitemap.wFilelist.php';
            }
            else{
              $template = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='listtemplate']/text())"/>';
            }
            /*
              ### Manuelle Anpassung - ENDE ###
            */
            $filterOperator = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='filterOperator']/text())"/>';
            // ...
<!-- ... -->
...

Dieses Listentemplate gestalten Sie entsprechend Ihren Vorstellungen. Ein Auszug aus einem beispielhaften Listentemplate finden Sie nachfolgend.

Beispiel: Eigenes Zeilentemplate für die Listenansicht (z.B. sitemap.wFilelist.php)

<?php $version="1.0"; $encoding="UTF-8"; ?>
<?php exit; ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" xmlns:php="http://php.net/xsl" exclude-result-prefixes="wd wsl php" version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="UTF-8"/>

  <!-- Dieser Block enthält die Information, die im Struktureditor bei der Auswahl der Zeilenvorlage angezeigt wird -->
  <wd:extension type="weblication" version="5.0" uid="de8f7d3485049e69d140f47c69e49b5a">  
    <wd:meta>
      <wd:title>Sitemap (Custom)</wd:title>
      <wd:title_en>sitemap</wd:title_en>      
      <wd:description/>
    </wd:meta>
    <wd:version value="1"/>
  </wd:extension> 
  
  <!-- Hier werden zentral die benötigten System-Parameter eingebunden -->
  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/misc/standard.wParams.php"/>   
 
  <xsl:template match="/wFilelist">     
    <div>
      <xsl:if test="files/file">
        <ul class="listSitemapEntries">
          <!-- Schleife über alle Dateien -->
          <xsl:for-each select="files/file">
            <li class="listEntry clickable">
              <a class="listEntryMoreOnly" href="{@path}"><xsl:value-of select="wd:extension/wd:meta/wd:title/text()"/></a>
            </li>
          </xsl:for-each>
        </ul>
      </xsl:if>    
    </div>
  </xsl:template>
</xsl:stylesheet>

Um die Liste in der Navigation auszugeben, setzen Sie innerhalb der gewünschten Navigationsebenen den Template-Aufruf für das Listenelement. Das verwendete Listen-Element (im Beispiel: list.standard.wItem.php) muss vor dem Template-Aufruf eingebunden sein.

Das Beispiel prüft jeden Navigationspunkt des Levels auf einen vorhandenen Link und ob es sich um eine Listendatei handelt. Am Beispiel ist dies innerhalb des zweiten Navigationslevels angeführt (Auszug).

Achten Sie darauf, dass Sie um die eingelesenen Navigationspunkte einen Container definiert haben (im Beispiel <div id="navigationSitemap"><ul class="navLevel1space">...)!

Beispiel: Auszug aus dem Navigationstemplate für die Sitemap (z.B. sitemap.wNavigation.php)

<?php $version="1.0"; $encoding="UTF-8"; ?>
<?php exit; ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" xmlns:php="http://php.net/xsl" exclude-result-prefixes="wd wsl php" version="1.0">
  <xsl:output method="xml" indent="no" omit-xml-declaration="yes" encoding="UTF-8"/>

  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/misc/standard.wParams.php"/> 
  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/items/list.standard.wItem.php"/>

  <!--Hier werden Die Daten hingeschrieben-->
  <xsl:template match="/wNavigation">
    <div id="navigationSitemap">  
      <ul class="navLevel1space">
        <xsl:apply-templates select="/wNavigation/navPoint"/>
      </ul>
    </div>
  </xsl:template>

  <!--Dieses Template wird auf jeden Navigtionspunkt des ersten Levels angewandt-->
  <!-- ... -->
  <!-- ... -->

  <!--Dieses Template wird auf jeden Navigtionspunkt des zweiten Levels angewandt-->
  <xsl:template match="/wNavigation/navPoint/navPoint">
    <xsl:choose>
      <xsl:when test="php:functionString('wRepository::documentExists', @link) and document(concat($wDocumentRoot, @link))/wd:document/wd:group/wd:item[@type = 'list.standard']">
        <xsl:apply-templates select="document(concat($wDocumentRoot, @link))//wd:document/wd:group[@id = 'content1']//wd:item[@type = 'list.standard']" />
      </xsl:when>
      <!-- ... -->
    <!-- ... -->
  <!-- ... -->
<!-- ... -->
BASE Classic

Beispiel: Auszug aus dem XSL-Element der Liste (z.B. list.standard.wItem.php)

<!-- ... (ab ca. Zeile 326) -->
          <wsl:php>
            <xsl:if test="not($wIsInEditor and @wEditorId) and wd:fragment[@id = 'execution']/text() = 'post' and not($wViewMode = 'newsletter')">
              <xsl:attribute name="execution">post</xsl:attribute>
              <!--
              <xsl:attribute name="expires"><xsl:value-of select="wd:fragment[@id = 'expires']/text()"/></xsl:attribute>
              -->
              <xsl:attribute name="cacheIdCallback"><xsl:value-of select="wd:fragment[@id = 'cacheIdCallback']/text()"/></xsl:attribute>
            </xsl:if>

            $elementId      = '<xsl:value-of select="@uid"/>';
            $listId         = substr($elementId, 0, 8);
            //if(isset($GLOBALS['wTmp']['listIds'][$listId])){
            //  $listId = substr(md5(rand(0, 999999)), 0, 8);
            //}
            //$GLOBALS['wTmp']['listIds'][$listId] = 1;
            //$template       = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='listtemplate']/text())"/>';
            /*
              ### Manuelle Anpassung für Listenausgabe in der Navigation bei der Sitemap ($template Zeile per Abfrage) - ANFANG ###
            */
            // Prüfen, ob die Sitemap als URL aufgerufen wird (z.B. /de/sitemap/index.php), um ein anderes Listen-Template mitzugeben:
            if(preg_match('/\/sitemap\//', $_SERVER['REQUEST_URI'])){
              $template = '/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/lists/sitemap.wFilelist.php';
            }
            else{
              $template = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='listtemplate']/text())"/>';
            }
            /*
              ### Manuelle Anpassung - ENDE ###
            */
            $filterOperator = '<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='filterOperator']/text())"/>';
            // ...
<!-- ... -->
...

Dieses Listentemplate gestalten Sie entsprechend Ihren Vorstellungen. Ein Auszug aus einem beispielhaften Listentemplate finden Sie nachfolgend.

Beispiel: Eigenes Zeilentemplate für die Listenansicht (z.B. sitemap.wFilelist.php)

<?php $version="1.0"; $encoding="UTF-8"; ?>
<?php exit; ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" xmlns:php="http://php.net/xsl" exclude-result-prefixes="wd wsl php" version="1.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="UTF-8"/>

  <!-- Dieser Block enthält die Information, die im Struktureditor bei der Auswahl der Zeilenvorlage angezeigt wird -->
  <wd:extension type="weblication" version="5.0" uid="de8f7d3485049e69d140f47c69e49b5a">  
    <wd:meta>
      <wd:title>Sitemap (Custom)</wd:title>
      <wd:title_en>sitemap</wd:title_en>      
      <wd:description/>
      <wd:modification name="hornstein" time="1627480170"/>
      <wd:creation name="hornstein" time="1627480161"/>
    </wd:meta>
    <wd:version value="1"/>
  </wd:extension> 
  
  <!-- Hier werden zentral die benötigten System-Parameter eingebunden -->
  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/misc/standard.wParams.php"/>   

  <xsl:template match="/wFilelist">     
    <div>
      <xsl:if test="files/file">
        <ul class="listSitemapEntries">
          <!-- Schleife über alle Dateien -->
          <xsl:for-each select="files/file">
            <li class="listEntry clickable">
              <a class="listEntryMoreOnly" href="{@path}"><xsl:value-of select="wd:extension/wd:meta/wd:title/text()"/></a>
            </li>
          </xsl:for-each>
        </ul>
      </xsl:if>    
    </div>
  </xsl:template>
</xsl:stylesheet>

Um die Liste in der Navigation auszugeben, setzen Sie innerhalb der gewünschten Navigationsebenen den Template-Aufruf für das Listenelement. Das verwendete Listen-Element (im Beispiel: list.standard.wItem.php) muss vor dem Template-Aufruf eingebunden sein.

Das Beispiel prüft jeden Navigationspunkt des Levels auf einen vorhandenen Link und ob es sich um eine Listendatei handelt. Am Beispiel ist dies innerhalb des zweiten Navigationslevels angeführt (Auszug).

Achten Sie darauf, dass Sie um die eingelesenen Navigationspunkte einen Container definiert haben (im Beispiel <div id="navigationSitemap"><ul class="navLevel1space">...)!

Beispiel: Auszug aus dem Navigationstemplate für die Sitemap (z.B. sitemap.wNavigation.php)

<?php $version="1.0"; $encoding="UTF-8"; ?>
<?php exit; ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" xmlns:php="http://php.net/xsl" exclude-result-prefixes="wd wsl php" version="1.0">
  <xsl:output method="xml" indent="no" omit-xml-declaration="yes" encoding="UTF-8"/>

  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/misc/standard.wParams.php"/> 
  <xsl:include href="$XSLTPRE[wDocumentRoot]/[IHR-GLOBALES-PROJEKT]/wGlobal/layout/templates/items/list.standard.wItem.php"/>

  <!--Hier werden Die Daten hingeschrieben-->
  <xsl:template match="/wNavigation">
    <div id="navigationSitemap">  
      <ul class="navLevel1space">
        <xsl:apply-templates select="/wNavigation/navPoint"/>
      </ul>
    </div>
  </xsl:template>

  <!--Dieses Template wird auf jeden Navigtionspunkt des ersten Levels angewandt-->
  <!-- ... -->
  <!-- ... -->

  <!--Dieses Template wird auf jeden Navigtionspunkt des zweiten Levels angewandt-->
  <xsl:template match="/wNavigation/navPoint/navPoint">
    <xsl:choose>
      <xsl:when test="php:functionString('wRepository::documentExists', @link) and document(concat($wDocumentRoot, @link))/wd:document/wd:group//wd:item[@type = 'list.standard']">
        <xsl:apply-templates select="document(concat($wDocumentRoot, @link))//wd:document/wd:group[@id = 'content1']//wd:item[@type = 'list.standard']" />
      </xsl:when>
      <!-- ... -->
    <!-- ... -->
  <!-- ... -->
<!-- ... -->