Kategorienfilter als Auswahlbox für Listen

Ermöglichen Sie dem Seitenbesucher innerhalb von Listen ein Filtern der Ausgabe nach vordefinierten Kriterien.

Dem Besucher Ihrer Webseite können Sie das Filtern einer Weblication® Liste direkt in der Seite erlauben. Diverse Weblics® haben diese Möglichkeit bereits im Standard umgesetzt (Veranstaltungskalender, Firmenverzeichnis, Personenverzeichnis, etc.). Anhand des Weblic® Personenverzeichnis beschreiben wir, wie Sie Kategorienfilter über eine Auswahlbox innerhalb der Liste zur Verfügung stellen.

Zusätzlich zum Filter nach Abteilungen (departments) wollen wir einen Länderfilter zur Verfügung stellen. Die Liste der Ansprechpartner soll dem Seitenbesucher zwei Selektboxen zur Verfügung stellen:

Personenverzeichnis mit Kategorienfilter als Auswahlbox
Personenverzeichnis mit Kategorienfilter als Auswahlbox
Umsetzung in aktuellen BASE 2.x Projekten
Umsetzung in älteren Projekten (nicht mehr supportet)

Weitere Filter-Auswahlbox einbinden

1) Kategorienfilter Element hinzufügen

Öffnen Sie die Ansprechpartner-Seite (z.B. /base/ansprechpartner/index.php) zur Bearbeitung.

Fügen Sie unterhalb des bestehenden Strukturelementes "Kategorienfilter" (Auswahlbox "Alle Personen anzeigen") ein weiteres "Kategorienfilter" Element ein.

Ansprechpartner - Entwurfsansicht index.php
Ansprechpartner - Entwurfsansicht index.php
Ansprechpartner - Entwurfsansicht index.php - Erweitert
Ansprechpartner - Entwurfsansicht index.php - Erweitert

2) Kategorienfilter Element konfigurieren und neue Kategorien anlegen

Nun konfigurieren Sie die neue Auswahlbox, also das Element Kategorienfilter für die Länder. Kopieren Sie hierzu am besten innerhalb des verwendeten categories-Verzeichnisses die bestehende Kategoriendatei departments.wCategories.php und legen dies als countries.wCategories.php ab. In der neuen Kategoriendatei löschen Sie dann alle vorhandenen Kategorien und legen die neuen Kategorien an (z.B. Deutschland, Österreich, Schweiz). Diese Kategoriendatei verlinken Sie dann im Kategorienfilter-Element unter "Pfad der Kategoriendatei" und ändern die "Bezeichnung im Auswahlfeld" und den "Name des HTTP-Parameters" (siehe Screen rechts).

Ansprechpartner - Kategorienfilter Länder
Ansprechpartner - Kategorienfilter Länder
Ansprechpartner - Kategoriendateien
Ansprechpartner - Kategoriendateien

3) Listen-Element um den Kategorien-Filter über URL-Parameter erweitern

Die bestehende Liste erweitern Sie über die Listenoptionen um einen weiteren Filter "Nach Kategorien über URL-Parameter filtern". Fügen Sie hierzu im Bereich "Filter für die aufzulistenden Dateien" zusätzlich zum bestehenden Filter den weiteren Filter ein und konfigurieren diesen.
Im Filter geben Sie bei "Name des Parameters" im Feld den Namen (z.B. country) und im Feld "ID des Kategorienfeldes" die Objekt-ID an, unter welcher die Kategorien abgelegt werden (hier z.B. country).

Ansprechpartner - Listenoptionen aufrufen
Ansprechpartner - Listenoptionen aufrufen
Ansprechpartner - Listenoptionen (Kategorien über URL-Parameter filtern)
Ansprechpartner - Listenoptionen (Kategorien über URL-Parameter filtern)

4) Listen-Element für die Anzahl der Kategorien hinzufügen

Soll in der Auswahlbox hinter jeder Kategorie zusätzlich angezeigt werden, wieviele Einträge diese hat (z.B. Deutschland (2)), fügen Sie zum bestehenden Element "Anzahl der vorhandenen Einträge einer Kategorieauswahl hinzufügen bzw. leere Elemente ausblenden" ein weiteres Element für die neue Auswahlbox hinzu. Kopieren Sie hierzu einfach das bestehende Element und passen Sie die Listenoptionen des Elementes auf die neue Kategorie an (hier: country).

Sofern mehrere Kategorienfilter zur Auswahl verwendet werden (z.B. wie beim Veranstaltungskalender einmal für Veranstaltungsarten und Veranstaltungsorte), muss dies in der Liste "Anzahl der vorhandenen Einträge einer Kategorieauswahl hinzufügen ..." entsprechend berücksichtigt werden.
Beim Einsatz von mehr als einem Kategorienfilter muss somit pro toolsEntriesPerCategory-Element ein Listenfilter "Kategorien über URL-Parameter" für die jeweils andere Kategorie genutzt werden (also n-1).
Am Beispiel des Veranstaltungskalenders deutlich gemacht:
"Anzahl der vorhandenen Einträge einer Kategorieauswahl hinzufügen ..." für die Orte müssen die Kategorien über URL-Parameter der Arten filtern und bei den Arten die der Orte.

Ansprechpartner - toolEntriesPerCategory-Element
Ansprechpartner - toolEntriesPerCategory-Element
Ansprechpartner - toolEntriesPerCategory Listenoptionen
Ansprechpartner - toolEntriesPerCategory Listenoptionen

5) Objekt-Template für Ansprechpartner erweitern

Passend zur weiteren Kategorienfilter Auswahlbox erweitern Sie nun das Objekt-Template der Anwendung um die Pflege und Ausgabe der neuen Kategorie:

Auszug: Objekt-Template contactPerson.wObject.php um weitere Kategorie erweitern

...
    <xsl:choose>
      <xsl:when test="$wIsInEditor and php:functionString('wEnv::getGlobalValue', 'wUseEditor') != '0'">
      ...
            ...
            <div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'Country', 'Land', 'Pays')"/></div>                  
            <div class="wEditorExtensionValue">                     
              <!--web:categories:start valuepre="" textpre="&#160;" language="<xsl:value-of select="php:functionString('wUserCur::getLanguage')" />" pathCategories="<xsl:value-of select="php:functionString('wPathName::getDirParent', $wDocumentDir)" />/categories/countries.wCategories.php" multiple="0" size="" inputStyle="width:240px"--><xsl:copy-of select="/wd:document/wd:extension/wd:object/wd:data[@id='country']"/><!--web:categories:stop-->
              <wsl:buttonEdit path="{php:functionString('wPathName::getDirParent', $wDocumentDir)}/categories/countries.wCategories.php" icon="editStatus" caption="{php:functionString('wTexts::showTextUser', 'Edit countries', 'Länder bearbeiten', 'Editer pays')}" style="float:right;margin:2px 2px 2px 0"/>
            </div>
            ...
      ...
      </xsl:when>
      <xsl:otherwise>
        ...
        <div class="elementStandard elementContent elementText">        
          <p>            
            ...
            <xsl:variable name="categoryFileCountries" select="concat(php:functionString('wPathName::getDirParent', $wDocumentDir), '/categories/countries.wCategories.php')"/>
            <xsl:for-each select="/wd:document/wd:extension/wd:object/wd:data[@id='country']/wd:category">
            <xsl:variable name="categoryIDCountry"><xsl:value-of select="text()"/></xsl:variable>
              <xsl:if test="$categoryIDCountry != '' and php:functionString('wRepository::documentExists', $categoryFileCountries)">
                <xsl:choose>
                  <xsl:when test="string-length(document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@*[name() = concat('title_', $wLanguageProject)]) &gt; 0">
                    <xsl:value-of select="document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@*[name() = concat('title_', $wLanguageProject)]"/>
                  </xsl:when>                
                  <xsl:otherwise>
                    <xsl:value-of select="document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@text"/>
                  </xsl:otherwise>
                </xsl:choose>
              <br/>
              </xsl:if>
            </xsl:for-each>           
            ...
          </p>
        ....
        </div>      
      </xsl:otherwise>
...

6) Listen-Template für Ansprechpartner erweitern

Passend zur weiteren Kategorienfilter Auswahlbox erweitern Sie nun das Listen-Template der Anwendung um die Ausgabe der neuen Kategorie:

Auszug: Listen-Template contactPerson.wFilelist.php um weitere Kategorie erweitern

...
  <wd:editmaskExtended>
    <![CDATA[
      <!--wOptionsEditmaskExtended="showInputAllowSelf:no;showInputOrder:yes;showInputLimits:yes;showInputLimitFrom:no;showInputManualOrder:yes"-->
      ...
      <div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'File with categories', 'Kategoriendatei der Länder', 'Fichier catégories')"/></div>        
      <div class="wEditorElementValue"><!-- web:text:start editor="file" --><xsl:value-of select="wd:fragment[@id='pathCategoriesCountries']/text()"/><!-- web:text:stop --></div>
    ]]>    
  </wd:editmaskExtended>
  ...
  ...
              <xsl:choose>
                <xsl:when test="/wFilelist/wData/data[@name = 'showDetails']/text() = '1'">   
                  <div class="listEntryDescription">
                    <xsl:if test="wd:extension/wd:object/wd:data[@id='street']/text() or wd:extension/wd:object/wd:data[@id='town']/text()">
                      <p>
                        ...
                        <xsl:variable name="categoryFileCountries" select="/wFilelist/wData/data[@name = 'pathCategoriesCountries']/text()"/>
                        <xsl:for-each select="wd:extension/wd:object/wd:data[@id='country']/wd:category">
                          <xsl:variable name="categoryIDCountry"><xsl:value-of select="text()"/></xsl:variable>
                          <xsl:if test="$categoryIDCountry != '' and php:functionString('wRepository::documentExists', $categoryFileCountries)">
                            <xsl:choose>
                              <xsl:when test="string-length(document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@*[name() = concat('title_', $wLanguageProject)]) &gt; 0">
                                <xsl:value-of select="document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@*[name() = concat('title_', $wLanguageProject)]"/>
                              </xsl:when>                
                              <xsl:otherwise>
                                <xsl:value-of select="document(concat($wDocumentRoot, $categoryFileCountries))//category[@id = $categoryIDCountry]/@text"/>
                              </xsl:otherwise>
                            <br/>
                            </xsl:choose>
                          </xsl:if>             
                         </xsl:for-each>
                         ...
                      </p>
                    </xsl:if>
                    ...
...

7) Weitere Hinweise

Diese Umsetzung berücksichtigt keine Abhängigkeiten zwischen den Kategorien. So kann z.B. bei gewähltem Land "Deutschland" die Auswahlbox für die Abteilungen zu "Einkauf" einen Eintrag in Klammer anzeigen, auch wenn die Liste keinen Eintrag findet.
Soll dies berücksichtigt werden, kann dies individuell erweitert/berücksichtigt werden, was als Projektdienstleistung durchzuführen ist. Gerne können Sie hierzu auch ein Angebot bei uns anfordern.

Tipp:
Durch Einsatz des Weblics® / Strukturelementes "Bedingter Inhaltscontainer für HTTP-Parameter" und intelligente Aufteilung bzw. Strukturierung der Kategoriendatei(en) können Sie schon ohne Zusatzprogrammierung mit Standardmitteln Abhängigkeiten bei Wahl von bestimmten Kategorien berücksichtigen.

Weitere Filter-Auswahlbox einbinden

Die Auswahlbox für den Abteilungen-Filter befindet sich in der Zeilenvorlage der Liste. Wir wollen eine weitere Auswahlbox in der Liste hinzufügen, die ein Filtern nach Länder ermöglicht.

Die Auswahlbox wird über einen xsl:call-template Aufruf mit dem Namen "templateCategoryfilter" eingelesen. Dieses Template liegt global unter /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/misc/categoryfilter.global.php ab und kann für beliebige Kategoriendateien dieser vordefinierten XML-Struktur verwendet werden (siehe z.B. standard.wCategories.php).

Für die weitere Auswahlbox kopieren Sie den xsl:call-template Aufruf mit dem Namen "templateCategoryfilter" und passen die Parameter (xsl:with-param) an. Die Bearbeitenmaske erweitern Sie um das Auswahlfeld für die entsprechende Kategoriendatei (wd:editmaskExtended).

Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/lists/contactPerson.wFilelist.php

...
  <wd:editmaskExtended>
    <![CDATA[  
      ...
      <div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'File with Departments', 'Kategoriendatei mit Abteilungen')"/></div>        
      <div class="wEditorElementValue"><!-- web:text:start editor="file" --><xsl:value-of select="wd:fragment[@id='pathCategories']/text()"/><!-- web:text:stop --></div>
      <div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'File with Countries', 'Kategoriendatei der Länder')"/></div>        
      <div class="wEditorElementValue"><!-- web:text:start editor="file" --><xsl:value-of select="wd:fragment[@id='pathCategoriesCountries']/text()"/><!-- web:text:stop --></div>
    ]]>    
  </wd:editmaskExtended>
...
...
    <!-- Aufruf Kategorienfilter und Länderfilter -->
    <xsl:if test="/wFilelist/wData/data[@name = 'showFilterCategories']/text() = '1'">      
      <xsl:call-template name="templateCategoryfilter">
        <xsl:with-param name="pathCategories" select="/wFilelist/wData/data[@name = 'pathCategories']/text()"/>             
        <xsl:with-param name="dataCategories" select="'department'"/>
        <xsl:with-param name="parameterCategories" select="'department'"/>
        <xsl:with-param name="textShowAllCategories" select="php:functionString('wTexts::getText', 'contactPerson_show_all_categories')"/>                 
      </xsl:call-template>    
      <xsl:call-template name="templateCategoryfilter">
        <xsl:with-param name="pathCategories" select="/wFilelist/wData/data[@name = 'pathCategoriesCountries']/text()"/>             
        <xsl:with-param name="dataCategories" select="'country'"/>
        <xsl:with-param name="parameterCategories" select="'country'"/>
        <xsl:with-param name="textShowAllCategories" select="php:functionString('wTexts::getText', 'contactPerson_show_all_countries')"/>                 
      </xsl:call-template>
    </xsl:if>
...

Bedeutung der Parameter:

  • pathCategories
    Über das select-Attribut lesen Sie per xPath den Pfad zur Kategoriendatei aus.
    Diesen Pfad pflegen Sie über die Listenoptionen ein (siehe o.g. Quelltextbeispiel im wd:editmaskExtendes Block).
  • dataCategories
    Über das select-Attribut geben Sie den Namen der Kategorie an, die gefiltert werden soll (Wert des id-Attributes der entsprechenden Objektdaten (Personendatei)).
    Im Beispiel:
    Wert aus: wd:data id="country"
  • parameterCategories
    Über das select-Attribut geben Sie den Namen der Kategorie an, die über den URL-Parameter gefiltert werden soll (Wert des id-Attributes der entsprechenden Objektdaten (Personendatei)).
    Im Beispiel:
    Wert aus: wd:data id="country"
  • textShowAllCategories
    Über das select-Attribut geben Sie den Text für die Auswahlbox an, um alle Kategorien anzuzeigen (z.B. "Alle Länder anzeigen"). Im Quelltextbeispiel wird der Text über einen Textbaustein eingelesen.

Objekt-Template um die Pflege und Ausgabe der Länder-Kategorie erweitern

Um das jeweilige Land in den Personendaten einpflegen zu können, erweitern Sie die Objektmaske um die Auswahlbox der Länderkategorien. Kopieren Sie hierzu den Pflegebereich zu den Abteilungen und passen Sie die Werte auf die Kategorie der Länder an.

Die Ausgabe der Personendaten erweitern Sie im otherwise-Block, siehe nachfolgendes Quelltextbeispiel.

Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/objects/contactPerson.wObject.php

...
<xsl:when test="$wIsInEditor and @wEditorId">
...
<div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::showTextUser', 'Country', 'Land')"/></div>                  
<div class="wEditorExtensionValue">                     
  <!--web:categories:start valuepre="" textpre="&#160;" language="<xsl:value-of select="php:functionString('wUserCur::getLanguage')" />" pathCategories="<xsl:value-of select="php:functionString('wPathName::getDirParent', $wDocumentDir)" />/categories/countries.wCategories.php" multiple="0" size="" inputStyle="width:240px"--><xsl:copy-of select="/wd:document/wd:extension/wd:object/wd:data[@id='country']"/><!--web:categories:stop-->
  <wsl:buttonEdit path="{php:functionString('wPathName::getDirParent', $wDocumentDir)}/categories/countries.wCategories.php" icon="edit" caption="{php:functionString('wTexts::showTextUser', 'Edit countries', 'Länder bearbeiten')}" style="float:right;margin:2px 2px 2px 0"/>
</div>
...
</xsl:when>
<xsl:otherwise>
...
<div class="elementText">        
  <p>            
    ...
    <xsl:variable name="countryID"><xsl:value-of select="/wd:document/wd:extension/wd:object/wd:data[@id='country']/wd:category/text()"/></xsl:variable>
    <xsl:if test="$countryID != '' and php:functionString('wRepository::documentExists', concat(php:functionString('wPathName::getDirParent', $wDocumentDir), '/categories/countries.wCategories.php'))">
      <xsl:value-of select="document(concat($wDocumentRoot, php:functionString('wPathName::getDirParent', $wDocumentDir), '/categories/countries.wCategories.php'))//category[@id = $countryID]/@text"/><br/>
    </xsl:if>
    ...
  </p>
...
</xsl:otherwise>

Länderfilter in den Listenoptionen setzen.

Damit der Seitenbesucher die Liste nach dem in der Auswahlbox gewählten Land gefiltert bekommt, müssen Sie die Listenoptionen und den URL-Parameter erweitern. Rufen Sie hierzu die Seitenbearbeitung der Listenseite (z.B. /IhrProjekt/ansprechpartner/index.php) auf und öffnen Sie die Listenoptionen. Zum bestehenden Kategorienfilter für Abteilungen setzen Sie einen weiteren Kategorienfilter für die Länder.

Kopieren Sie entweder den bestehenden Kategorienfilter der Abteilungen oder legen Sie über "Element hinzufügen" und Auswahl des Strukturelementes "Nach Kategorien filtern" einen neuen Kategorienfilter an. Als ID des Kategorienfeldes geben Sie die ID des entsprechenden Objekteintrages an (im Beispiel: country).

Listenoptionen des Personenverzeichnisses mit Kategorienfilter
Listenoptionen des Personenverzeichnisses mit Kategorienfilter

Nach Auswahl der entsprechenden Filter durch den Seitenbesucher sieht ein Aufruf mit gesetzten Filtern z.B. so aus:
http://IhreDomain.tld/IhrProjekt/ansprechpartner/?country[]=DE&department[]=650497650497