So setzen Sie eine kategorisierte und nach Priorität sortierte Liste um
20. Dezember 2010
liste kategorien sortierung sortieren priorität
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> ...

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=" " 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' => 'and'); $filtersSpecialistArea = array('type' => 'or'); $filtersSpecialistArea[] = array("wPath" => "/wd:extension/wd:object/wd:data[@id='fachgebiete'][wd:category/text() = '<xsl:value-of select="wd:fragment[@id='categories']/wd:category/text()"/>']", "operator" => "", "condition" => ""); $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.
