So setzen Sie eine kategorisierte und nach Priorität sortierte Liste um

Dieser Artikel beschreibt, wie Sie eine Liste umsetzen, die Dateien einer bestimmten Kategorie auflistet und diese nach Priorität ordnet.

Wie Sie eine kategorisierte Liste nach der Priorität der Einträge sortieren, zeigen wir Ihnen anhand folgendem Fallbeispiel.

Es besteht eine Anwendung, die die Bearbeitung und strukturierte Ausgabe von Personendaten ermöglicht. Die Personen sind unter anderem bestimmten Fachgebieten zugewiesen, was über eine kategorisierte Liste ausgegeben wird. Innerhalb der Fachgebiete haben die Personen unterschiedliche Qualifikationen. Sie wollen nun zu den Fachgebieten die jeweils zuständigen Personen auflisten, aber nach Priorität sortieren. Die Person, die sich am besten im Fachgebiet auskennt, soll auch zuoberst in der Liste erscheinen.

Als Grundlage für dieses Fallbeispiel verwenden wir das Weblic® Personenverzeichnis und passen diese Anwendung entsprechend an.

Schritt 1: Kategoriendatei für die Fachgebiete anlegen

Legen Sie die Kategoriendatei an, die die Fachgebiete abbildet. Hierzu legen Sie über die Kategorienverwaltung eine neue Datei an (z.B. fachgebiete.wCategories.php). Die Struktur der Kategorien kann z.B. wie folgt aussehen:

  • HTML
    • HTML 4
    • HTML 5
  • XHTML
  • XSLT
  • PHP
  • CSS


Schritt 2: Objekt-Datei zur Pflege der Personendaten anpassen

Erweitern Sie die contactPerson.wObject.php um die Auswahl der Fachgebiete und Vergabe einer Priorität. In der Bearbeitung erhalten Sie zu jeder Kategorien-Auswahlbox eine Auswahlbox für die Priorität. Folgende Möglichkeiten stehen Ihnen zur Verfügung:

  • Auswahl einer Kategorie und Zuweisung einer Priorität zu dieser Kategorie
    Zum Fachgebiet "XHTML" kann somit z.B. eine Priorität von 1 (für hohe Priorität), etc. vergeben werden.
  • Weitere Felder für eine Kategorien-und Priorität-Auswahl lassen sich hinzufügen und löschen
  • erstes Feld/Element kann nicht gelöscht werden

Diese Umsetzung erfordert, dass die jeweilige Inhaltsdatei bereits mindestens einen wd:category Eintrag beinhaltet (siehe Schritt 3). Im Screenshot unterhalb des folgenden Quelltext-Beispieles sehe Sie, wie die Bearbeitenmaske des Objektes bei dieser Umsetzung aussieht.

Beispiel: Auszug aus /wGlobalProject/wGlobal/layout/templates/objects/contactPerson.wObject.php

...
<div class="wEditorExtensionLabel">Fachgebiete / Priorität</div>
<div class="wEditorExtensionValue">
 <xsl:for-each select="/wd:document/wd:extension/wd:object/wd:data[@id='fachgebiete']/wd:category">
   <xsl:variable name="allowDelete"><xsl:if test="position() = 1">hidden</xsl:if></xsl:variable>        
   <!--web:row:start delete="<xsl:value-of select="$allowDelete" />"-->
   <div style="overflow:hidden;clear:left">
   <!-- web:text:start editor="categories" pathCategories="/wGlobalProject/wGlobal/content/categories/fachgebiete.wCategories.php" inputStyle="float:left;width:60%"--><xsl:value-of select="text()"/><!-- web:text:stop -->               
   <!-- web:text:start editor="select" values="1|2|3|4|5|6|7|8|9" inputStyle="float:left;width:40px"--><xsl:value-of select="@prio"/><!-- web:text:stop -->
   </div>
   <!-- web:row:stop-->
 </xsl:for-each>   
</div>
...
Objekt-Daten einer Person mit Pflege der Fachgebiete/Prioritäten
Objekt-Daten einer Person mit Pflege der Fachgebiete/Prioritäten

Schritt 3: Inhaltsdatei für die Personen anpassen

Das Festlegen der jeweiligen Kategorie und zugehörigen Priorität erfordert in der Inhaltsdatei die Angabe von mindestens einer Kategorie. Tragen Sie daher in evtl. schon bestehende Inhaltsdateien innerhalb des wd:object Blockes zumindest eine wd:category Angabe zu wd:data id="fachgebiete" ein.

Um dies auch gleich bei neu anzulegenden Dateien/Personen verfügbar zu haben, tragen Sie dies auch in das Template ein, das als Grundlage zum Erstellen dient.

Beispiel: Auszug aus einer Inhaltsdatei (Person), z.B.: /Ihr-Project/personenverzeichnis/datas/mueller.php

...
<wd:object name="Person" type="person">
  ...
  <wd:data id="fachgebiete" type="char.default">
    <wd:category prio="3">1292841280146</wd:category>
    <wd:category prio="1">1292841265325</wd:category>
  </wd:data>
</wd:object>
...

Schritt 4: Listen-Element anpassen (z.B. /wGlobalProject/wGlobal/layout/templates/items/list.fachgebiete.wItem.php

Zur Ausgabe der kategorisierten Liste kopieren Sie sich das Listen-Element aus dem Beispielprojekt (list.standard.wItem.php) und legen dies unter eigenem Namen ab (z.B. list.fachgebiete.wItem.php). Achten Sie darauf, auch die type-Angabe im öffnenden xsl:template Tag anzupassen!

Passen Sie nun die Stellen an, über die die Sortierung ("Sortieren nach") und der Kategorie-Filter definiert sind.

  • Die Sortierung erweitern Sie um den festen Wert "prio", der in der Ausgabe entsprechend umgeschrieben wird.
  • Den Kategorie-Filter passen Sie auf den Pfad zu Ihrer Kategoriendatei (Fachgebiete) an (siehe Schritt 1).
  • Die Ausgabe erweitern Sie um den Filter für Fachgebiete

Um auf dieses Listen-Element auch über den Struktureditor zugreifen zu können, legen Sie auf Basis des Mastertemplate-Items (list.standard.wItemMastertemplate.php) das neue Mastertemplate-Element (z.B. list.fachgebiete.wItemMastertemplate.php) an. Passen Sie auch dort die type-Angabe und den Namen an, siehe Quelltextbeispiel zum Mastertemplate-Element.

Beispiel: Auszug aus /wGlobalProject/wGloba/layout/templates/items/list.fachgebiete.wItem.php

...
  <xsl:template match="wd:item[@type = 'list.fachgebiete']"> 
    <!-- web:item:start name="Liste" ...
... <!-- Bereich Pflege -->
...
<div class="wEditorElementLabel"><xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_order_dir')"/></div>
<div class="wEditorElementValue"><!-- web:text:start editor="select" inputStyle="width:142px;margin-right:4px" values="prio|/wd:extension/wd:meta/wd:modification/@time|/wd:extension/wd:meta/wd:title/text()|/wd:stat/wd:path/text()|/wd:extension/wd:meta/wd:publication/@time|/wd:extension/wd:object/wd:data[@id='dateFrom']/text()|random()" texts="Priorität|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_modification')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_page_title')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_path')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_publication_time')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_dateFrom')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_by_random')"/>"--><xsl:value-of select="wd:fragment[@id='orderBy']/text()"/><!-- web:text:stop --><!-- web:text:start editor="select" values="asc|desc" texts="<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_dir_asc')"/>|<xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_order_dir_desc')"/>" inputStyle="width:84px"--><xsl:value-of select="wd:fragment[@id='orderDir']/text()"/><!-- web:text:stop --></div>

<div class="wEditorExtensionLabel"><xsl:value-of select="php:functionString('wTexts::getTextUser', 'editor_list_filter_categorie')"/></div>
<div class="wEditorExtensionValue"><!-- web:categories:start multiple="1" valuePre="" textPre="&#160;" pathCategories="/wGlobalProject/wGlobal/content/categories/fachgebiete.wCategories.php"--><xsl:copy-of select="wd:fragment[@id='categories']"/><!-- web:categories:stop --></div>
<wsl:buttonEdit path="/wGlobalProject/wGlobal/content/categories/fachgebiete.wCategories.php" showInEditor="1" icon="edit" title="{php:functionString('wTexts::getTextUser', 'editor_page_categories_edit')}" style="float:right;margin:0 0 2px 0"/>              
...
... <!-- Bereich Ausgabe -->
<wsl:php>
...
// Filter für Fachgebiete
if('<xsl:value-of select="php:functionString('wStringconverter::maskApos', wd:fragment[@id='categories']/wd:category)"/>' != ''){

  $listParameters['filterset'] = array('type' =&gt; 'and');

  $filtersSpecialistArea = array('type' =&gt; 'or'); 

  $filtersSpecialistArea[] = array("wPath" =&gt; "/wd:extension/wd:object/wd:data[@id='fachgebiete'][wd:category/text() = '<xsl:value-of select="wd:fragment[@id='categories']/wd:category/text()"/>']", "operator" =&gt; "", "condition" =&gt; "");            
  $listParameters['filterset'][] = $filtersSpecialistArea;
  if($listParameters['orderBy'] == 'prio'){
    $listParameters['orderBy'] = "/wd:extension/wd:object/wd:data[@id='fachgebiete']/wd:category[text() = '<xsl:value-of select="wd:fragment[@id='categories']/wd:category/text()"/>']/@prio";
  }
}
...

Beispiel: Auszug aus /wGlobalProject/wGloba/mastertemplates/items/list.fachgebiete.wItemMastertemplate.php

<?php $version="1.0"; $encoding="UTF-8"; ?>
<?php exit; ?>
<wd:document xmlns:wslMastertemplate="http://weblication.de/5.0/wslMastertemplate" xmlns:en="/en" xmlns:fr="/fr" xmlns:wsl="http://weblication.de/5.0/wsl" xmlns:wd="http://weblication.de/5.0/wd" version="1.0" type="page.standard">
  <wd:extension type="weblication" version="5.0" uid="3bb403668279d4b193ef278a653807a8">
    <wd:meta>
      <wd:title>Personenliste mit Kategorie/Prio</wd:title>
      ...
      <wd:cache expires="{wGetValueOfDefaultExtension()}"/>
  </wd:extension>
  <wd:group>
    <wd:item name="Personenliste mit Kategorie/Prio" en:name="List Person" icon="/wGlobalProject/wGlobal/layout/images/element-icons/element_list.gif" type="list.fachgebiete">
...

Schritt 5: Listenseite erstellen

Innerhalb der gewünschten Seite fügen Sie nun das zuvor erstellte Mastertemplate-Element ("Personenliste mit Kategorie/Prio") ein und stellen die Listenoptionen ein.

  • Darstellungs-Template wählen
    Wählen Sie eines der bestehenden Zeilentemplates aus. Für eine individuelle Ausgabe erstellen Sie gegebenenfalls ein eigenes Darstellungs-Template und wählen dies dann aus.
  • Aufzulistendes Verzeichnis wählen
    Wählen Sie das Verzeichnis aus, in dem die Dateien abliegen, die ausgelesen werden sollen.
  • Sortierung einstellen
    Wählen Sie unter "Sortierung nach" den Wert "Priorität" aus und definieren Sie, ob dieser auf- oder absteigend angewandt werden soll.
  • Kategorie-Filter
    Wählen Sie die Kategorie aus, nach der die aufzulistenden Dateien gefiltert werden sollen.
    Beachten Sie, dass die angeführte Umsetzung nur auf eine ausgewählte Kategorie optimiert ist. Eine Mehrfachauswahl von Kategorien ist hinsichtlich der Sortierung nach Priorität nicht möglich.
Listenoptionen der kategorisierten Liste mit Sortierung nach Priorität