Listen über individuelle PHP Callback Funktion filtern
Veröffentlichungsdatum: 04. Oktober 2016
Änderungsdatum: 23. Mai 2022
liste listenoptionen filter php callback
Nutzen Sie eigene PHP-Funktionen, um die für eine Weblication® Liste definierten Dateien vor der Ausgabe individuell manipulieren zu können.
Reichen Ihnen die Möglichkeiten der Weblication® Listenfunktionen und Filtermöglichkeiten nicht aus, können Sie die Abfragen vorab sowie die Ausgabe einer Dateiliste individuell beeinflussen.
Die erforderlichen Anpassungen werden nachfolgend beschrieben. Weisen Sie dem Listenelement einen der folgenden Filter zu:
PHP Callback Funktion POST - manipuliert das Listenergebnis vor der Ausgabe
PHP Callback Funktion PRE - ergänzt den Listenfilter vor der Anfrage an das Repository
Geben Sie nun in den Filtereinstellungen einen Funktionsaufruf an, zum Beispiel wMyProject::myListFunction.
In der Standardauslieferung der wMyProject.php werden bereits Beispiele für diese Funktionen mitgeliefert. Das sind zum Beispiel: myListFunction, myListFunctionPre, myListFunctionOptionsPre.
Je nach ausgewählten Filter wird die angegebene Funktion mit entsprechenden Parametern aufgerufen.
- Beispiel 1: POST - Die ersten drei Listeneinträge nach Zufall sortieren
- Beispiel 2: POST - Veranstaltungstermine Uhrzeit genau filtern
- Beispiel 3: POST - Listeneinträge nach Besitzer filtern
- Beispiel 4: PRE - Listeneinträge nur bei HTTP-Parameter
- Beispiel 5: PRE - Listeneinträge nach Jahren für Seitenbesucher filtern
- Beispiel 6: POST - Listeneinträge nach aktuellstem Verzeichniseintrag filtern
- Beispiel 7: PRE - Splitten von Listeneinträgen mit Mehrfachdaten
Beispiel 1: POST - Die ersten drei Listeneinträge nach Zufall sortieren
Das nachfolgende Beispiel führt an, wie Sie die ersten drei Listeneinträge der Dateiliste nach Zufall sortieren.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zur Zufallssortierung
<?php
//*********************************************************************************/
/**
* @method Array myListFunction(Array $files, Array $listOptions)
*
* @description Callback Funktion für eigene Listenfilter
*
* @param files Über die Liste eingelesene Dateien
*
* @param listOptions (Eigene) Listenoptionen zur Steuerung der Listenausgabe
*
* @return Array
*
*/
//*********************************************************************************/
public static function myListFunction($files, $listOptions){
//$files['file'] beinhaltet die Dateien der Liste. Sie können diese hier nachträglich manipulieren
//print '<pre>'; var_dump($files); print '<hr />'; var_dump($listOptions); print '</pre>';
// sortiert die ersten drei Listeneinträge nach Zufall:
$filesToSortRandomly = array_splice($files['file'], 0, (count($files['file']) < 3 ? $files['file'] : 3));
shuffle($filesToSortRandomly);
$files['file'] = array_merge($filesToSortRandomly, $files['file']);
return $files;
}
?>Beispiel 2: POST - Veranstaltungstermine Uhrzeit genau filtern
Ein anderes Beispiel zur PHP Callback Funktion POST wird nachfolgend für die Liste des Veranstaltungskalenders aufgezeigt.
Hier werden die Termine nachträglich zur "normalen" Listenausgabe gem. dem aktuellen Zeitpunkt Uhrzeit genau gefiltert.
Standardmäßig zeigt der Veranstaltungskalender Termine des aktuellen Tages noch an, auch wenn die Endzeit schon abgelaufen ist (z.B. Termin von 10:00 - 11:00 Uhr und Aufruf am gleichen Tag um 12:00 Uhr).
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Veranstaltungsterminen
<?php
//*********************************************************************************/
/**
* @method Array myEventlistFunction(Array $files, Array $listOptions)
*
* @description Callback Funktion für eigene Veranstaltungslistenfunktion
*
* @param files Über die Liste eingelesene Dateien
*
* @param listOptions (Eigene) Listenoptionen zur Steuerung der Listenausgabe
*
* @return Array
*
*/
//*********************************************************************************/
public static function myEventlistFunction($files, $listOptions){
$eventCheckTimeNowString = time();
$filesMyEventlistFunction = array();
foreach($files as $filePath){
$toDate = wURL::getParameter($filePath,'to');
$toDateString = strtotime($toDate);
if($toDateString > $eventCheckTimeNowString){
$filesMyEventlistFunction[] = $filePath;
}
}
return $filesMyEventlistFunction;
}
?>Beispiel 3: POST - Listeneinträge nach Besitzer filtern
Dieses Beispiel zur PHP Callback Funktion POST zeigt auf, wie eine Weblication® Liste nach dem Besitzer-Eintrag (wd:owner) gefiltert werden kann.
Die Liste wird nachträglich hinsichtlich der Einträge darauf geprüft, in welchen Dateien der aktuell eingeloggte Benutzer als Besitzer (wd:owner) eingetragen ist. In der Ausgabe erscheinen somit nur die Listeneinträge, die dem aktuellen Benutzer als Besitzer zugewiesen sind.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Listeneinträgen für Besitzer
<?php
//*********************************************************************************/
/**
* @method Array myListFunctionOwner(Array $files, Array $listOptions)
*
* @description Callback Funktion POST für eigene Listenfunktion für Besitzer
*
* @param files Über die Liste eingelesene Dateien
*
* @param listOptions (Eigene) Listenoptionen zur Steuerung der Listenausgabe
*
* @return Array
*
*/
//*********************************************************************************/
public static function myListFunctionOwner($files, $listOptions){
$wUserCurent = wUserCur::getName();
$filesFilterOwner = array();
foreach($files as $filePath){
$filePathToCheck = preg_replace('/\?.*/', '', $filePath); // Querystrings rausnehmen (z.B. bei Veranstaltungsterminen wichtig)
$eventOwner = wDocumentData::getData($filePathToCheck, '/wd:extension/wd:permissions/wd:owner/@name');
if($eventOwner == $wUserCurent){
$filesFilterOwner[] = $filePath;
}
}
//var_dump($fileslistFilterIsOwner);
return ($filesFilterOwner);
}
?>Beispiel 4: PRE - Listeneinträge nur bei HTTP-Parameter
Dieses Beispiel zur PHP Callback Funktion PRE zeigt auf, wie eine
Weblication® Liste die Einträge nur bei übergebenem HTTP-Parameter Wert
anzeigt.
Die Liste wird vor dem Ausführen darauf geprüft, ob dem URL-Parameter "firstLetter" ein Wert übergeben wurde. Ist dem nicht der Fall, werden keine Einträge an die Liste übergeben.
Auf diese Weise können Sie z.B. eine Liste mit Filter "Nach dem ersten Buchstaben des Titels filtern" umsetzen, welche beim Aufruf ohne URL-Parameter erstmal keine Einträge zeigt. Einträge werden erst beim Filtern über z.B. eine A-Z-Filterliste angezeigt.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Listeneinträgen nur bei HTTP-Parameter
<?php
//*********************************************************************************/
/**
* @method Arras hasFirstLetter(Array $query)
*
* @description Callback Funktion PRE für eigene Listenfunktion bei HTTP-Parameter
*
* @param query Über die Liste eingelesene Dateien
*
* @return Array
*
*/
//*********************************************************************************/
public static function hasFirstLetter($query){
if(wRequest::getParameter('firstLetter') == '') $query = array();
return $query;
}
?>Beispiel 5: PRE - Listeneinträge nach Jahren für Seitenbesucher filtern
Dieses Beispiel zur PHP Callback Funktion PRE zeigt auf, wie eine Weblication® Liste nach Jahren gefiltert werden kann. Die Auswahl wird in diesem Fall dem Seitenbesucher über eine Auswahlbox ermöglicht.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Listeneinträgen auf Jahre gefiltert
<?php
//*********************************************************************************/
/**
* @method Array myListFunctionPreFilterYear(Array $query)
*
* @description Callback Funktion für Listenfilter vorab nach Jahr
*
* @param query Parameter, welcher der URL übergeben wird
*
* @return Array
*
*/
//*********************************************************************************/
public static function myListFunctionPreFilterYear($query){
$dirYear = date('Y');
if(wRequest::getParameterPathSecure('year') != ''){
$dirYear = wRequest::getParameterPathSecure('year');
}
$query['dir'][0] = $query['dir'][0].'/'.$dirYear;
//print '<pre>';
//var_dump($query);
//print '</pre>';
return $query;
}
?>Auf diese verweisen Sie über einen PHP Callback Funktion PRE Filter in den Listenoptionen (nachfolgend linker Screenshot) und setzen oberhalb des Listenelementes in der Seitenbearbeitung ein PHP Quelltext-Element, welches die Auswahlbox erzeugt (siehe Beispiel rechts unten).
Im Beispiel wird diese Auswahlbox aus den Unterverzeichnissen von /base/aktuelles/meldungen befüllt, welche vom Verzeichnisnamen das entsprechende Jahr gesetzt haben.
Also z.B.:
/base/aktuelles/meldungen/2016
/base/aktuelles/meldungen/2017
/base/aktuelles/meldungen/2018
Beispiel: Inhalt des PHP-Quelltext Elementes für Jahresauswahl
$dirsYear = wRepository::getSubdirsDir('/base/aktuelles/meldungen');
rsort($dirsYear);
$selectedYear = wRequest::getParameter('year');
print '<select class="wglSelect" onchange="wSetParameterAndReload(\'year\', this.options[this.options.selectedIndex].text)">';
print '<option '.(wPathName::getDirName($dirYear) == '' ? 'selected="selected"' : '').'>Aktuelle Meldungen</option>';
foreach($dirsYear as $dirYear){
print '<option '.($currentYear == wPathName::getDirName($dirYear) ? 'selected="selected"' : '').'>'.wPathName::getDirName($dirYear).'</option>';
}
print '</select>';
//Die Funktion wSetParameterAndReload ist in der aktuellen ui.js definiert
In der Seite wird dem Seitenbesucher bei dieser Umsetzung oberhalb der Liste eine Auswahlbox angezeigt, über welche die Auswahl der Jahre (Unterverzeichnisse) möglich ist. Nach Auswahl des entsprechenden Jahres wird die Seite über die in der aktuellen ui.js hinterlegten wSetParameterAndReload Funktion neu geladen und filtert nach dem gewählten Jahr.
Beispiel 6: POST - Listeneinträge nach aktuellstem Verzeichniseintrag filtern
Dieses Beispiel zur PHP Callback Funktion POST zeigt auf, wie eine Weblication® Liste Einträge aus mehreren Verzeichnissen auf den jeweils aktuellsten Eintrag zu jedem ausgelesenen Verzeichnis filtern kann.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Listeneinträgen auf aktuellsten Verzeichniseintrag gefiltert
<?php
//*********************************************************************************/
/**
* @method Array getNewestEntryDir(Array $files)
*
* @description Callback Funktion, hier werden die Ergebnisse auf das 1. Ergebnis eines Verzeichnisses beschränkt.
* d.h. von einem Unterverzeichnis immer die aktuellste Datei.
* In den Listenoptionen sollte nach Erstelldatum sortiert werden und alle Einträge als Listenergebnis ausgewählt sein.
*
* @param file jeweilige Datei
*
* @return Array
*
*/
//*********************************************************************************/
public static function getNewestEntryDir($files, $listOptions){
//$files Beinhaltet alle Dateien der Liste. Sie können diese hier nachträglich manipulieren.
//print '<pre>';
//var_dump($files);
//var_dump($listOptions);
$tmpResult = array();
for($i = 0; $i < count($files); $i++){
$dirName = wPathName::getDirFile($files[$i]);
if(!array_key_exists($dirName, $tmpResult)) $tmpResult[$dirName] = $files[$i];
//print "<br/>".$files[$i]." ".wPathName::getDirFile($files[$i]);
}
$files = array_values($tmpResult);
var_dump($files);
// print '</pre>';
return $files;
}
?>Beispiel 7: PRE - Splitten von Listeneinträgen mit Mehrfachdaten
Dieses Beispiel zur PHP Callback Funktion PRE zeigt auf, wie eine Weblication® Liste Einträge, die Mehrfachdaten (z.B. Termine, Kategorien oder Bilder) enthalten, innerhalb der Liste aufgesplittet werden kann. Das bedeudet, dass ein Artikel, der zum Beispiel einen Mehrfacheintrag für wd:data id="thumbnail" enthält, auch mehrfach im Listenergebnis aufgeführt wird.
Zu diesem Beispiel ein Auszug aus den Objektdaten:
<wd:data id="thumbnail">
<wd:entry src="/wAssets/img/demo/1.jpg"/>
<wd:entry src="/wAssets/img/demo/2.jpg"/>
</wd:data>
Für die Umsetzung wird der Filter "PHP Callback Funktion PRE" gewählt und die ab CMS-Version 016.005.030.... verfügbare Option "Options anpassen" verwendet.
Beispiel: Auszug aus /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyProject.php zu Splitten von Listeneinträgen mit Merfachdaten
<?php
//*********************************************************************************/
/**
* @method myListFunctionOptionsPre(Array $listOptions)
*
* @description Die Funktion ergänzt in diesem Fall die Option "elementSplit", um die Listeneinträge
* bei existierenden Mehrfachdaten für thumbnail nach dem src-Attribut zu splitten
*
* @return Array
*
*/
//*********************************************************************************/
public static function myListFunctionOptionsPre($listOptions){
$listOptions["elementSplit"] = array();
$listOptions["elementSplit"]["wPath"] = "/wd:extension/wd:object/wd:data[@id = 'thumbnails']/wd:entry";
$listOptions["elementSplit"]["conditions"][0][0] = "@src";
$listOptions["elementSplit"]["conditions"][0][1] = "!=";
$listOptions["elementSplit"]["conditions"][0][2] = "";
$listOptions["elementSplit"]["data"] = array('@src');
$listOptions['elementSplitIsOptional'] = '1';
//print '<pre>';
//var_dump($listOptions);
//print '</pre>';
return $listOptions;
}
?>- Was ist der Zweck von „PHP Callback Funktion“ Filtern bei Weblication® Listen?
- Mit „PHP Callback Funktion“ Filtern können Sie eigene PHP-Funktionen verwenden, um die für eine Weblication® Liste definierten Dateien vor der Ausgabe individuell zu manipulieren bzw. die Abfrage und die Ausgabe der Dateiliste gezielt zu beeinflussen.
- Welche zwei Arten von PHP Callback Funktion Filtern gibt es?
- Es gibt zwei Filtertypen: - **PHP Callback Funktion POST**: manipuliert das Listenergebnis **vor der Ausgabe**. - **PHP Callback Funktion PRE**: ergänzt den Listenfilter **vor der Anfrage an das Repository**.
- Wie gebe ich in den Filtereinstellungen eine eigene PHP Callback Funktion an?
- In den Filtereinstellungen geben Sie einen Funktionsaufruf an, z. B. **wMyProject::myListFunction**. In der Standardauslieferung der **wMyProject.php** werden bereits Beispiel-Funktionen mitgeliefert, u. a. **myListFunction**, **myListFunctionPre** und **myListFunctionOptionsPre**.
- Was wird bei „PHP Callback Funktion POST“ übergeben und was wird zurückgegeben?
- Bei **POST** wird eine Funktion mit den Parametern aufgerufen, z. B. **(Array $files, Array $listOptions)**. Sie können damit die in **$files** enthaltenen Dateieinträge nachträglich manipulieren und als Ergebnis das **manipulierte Array** zurückgeben.
- Wie kann ich mit „PHP Callback Funktion POST“ die ersten drei Listeneinträge zufällig sortieren?
- Sie können in Ihrer POST-Callback-Funktion die Liste so manipulieren, dass nur die ersten drei Einträge herausgenommen, zufällig sortiert (z. B. mit <code class="codeInline">shuffle</code>) und anschließend wieder an den Anfang der Liste eingefügt werden.
- Wie filtere ich mit „PHP Callback Funktion POST“ Veranstaltungstermine anhand der Uhrzeit?
- Mit POST können Termine nachträglich zur aktuellen Zeit gefiltert werden. Beispielhaft wird geprüft, ob das **to**-Datum (Endzeit) noch **in der Zukunft** liegt (z. B. <code class="codeInline">strtotime($to) > time()</code>) und nur dann der Termin ins Ergebnis übernommen.
- Wie filtere ich eine Liste mit „PHP Callback Funktion POST“ nur für den aktuell eingeloggten Besitzer?
- Die POST-Callback-Funktion kann pro Datei ermitteln, ob der aktuell eingeloggte Benutzer als **Owner** in den Dokumentdaten hinterlegt ist (z. B. über <code class="codeInline">wd:owner/@name</code>). Nur Einträge, bei denen der Owner-Name dem aktuellen Benutzernamen entspricht, werden ins Ergebnis übernommen.
- Wie funktioniert „PHP Callback Funktion PRE“ zur Steuerung über HTTP-Parameter?
- Mit PRE wird **vor** der Anfrage an das Repository geprüft. Im Beispiel wird kontrolliert, ob der URL-Parameter **firstLetter** einen Wert hat. Ist er leer, wird das Query-/Eingabe-Array auf **leer gesetzt**, sodass zunächst **keine Einträge** geliefert werden (und erst bei Filteraufruf Einträge erscheinen).
- Wie kann ich mit „PHP Callback Funktion PRE“ nach einem Jahr filtern (z. B. per Auswahlbox)?
- Sie können PRE nutzen, um die Repository-Query um einen Jahresparameter zu erweitern. Beispielhaft wird das Jahr entweder aus **<code class="codeInline">date('Y')</code>** oder aus <code class="codeInline">wRequest::getParameterPathSecure('year')</code> genommen und anschließend in den Verzeichnispfad eingesetzt (z. B. <code class="codeInline">.../meldungen/<jahr></code>).
- Wie wird eine Jahresauswahlbox typischerweise umgesetzt, die mit PRE-Filtern zusammenarbeitet?
- Oben auf der Seite wird eine **Auswahlbox** erzeugt, die z. B. aus den Unterverzeichnissen eines Basis-Pfads befüllt wird (z. B. <code class="codeInline">.../meldungen/2016</code>, <code class="codeInline">.../meldungen/2017</code>, ...). Beim Wechsel ruft JavaScript (z. B. <code class="codeInline">wSetParameterAndReload</code>) die Seite neu auf und übergibt den Parameter **year**, den die PRE-Callback-Funktion auswertet.
- Wie kann ich mit „PHP Callback Funktion POST“ sicherstellen, dass pro Unterverzeichnis nur der aktuellste Eintrag erscheint?
- Die POST-Callback-Funktion kann aus einer Liste der sortierten Einträge pro Unterverzeichnis nur **einen** Eintrag behalten. Im Beispiel wird pro Verzeichnis der erste (bzw. aktuellste bei passender Sortierung) Eintrag in ein temporäres Ergebnis übernommen und der Rest verworfen.
- Was bedeutet „Splitten von Listeneinträgen mit Mehrfachdaten“ bei PRE?
- Wenn ein Datenelement in einem Dokument mehrere Werte enthält (z. B. mehrere Thumbnails), kann die Liste so konfiguriert werden, dass der Eintrag im Listenergebnis **mehrfach** erscheint—je Wert z. B. pro <code class="codeInline">wd:entry</code> anhand des Attributs <code class="codeInline">src</code>.
- Wie wird das Splitten von Mehrfachdaten (z. B. Thumbnails) mit „PHP Callback Funktion PRE“ umgesetzt?
- Mit einer PRE-Callback-Funktion wie <code class="codeInline">myListFunctionOptionsPre</code> wird eine Option ergänzt, z. B. **<code class="codeInline">elementSplit</code>**. Dabei werden XPath/Regeln definiert, welche Mehrfach-Elemente gesplittet werden (z. B. Einträge innerhalb eines Datenblocks) und welche Bedingung/Datenspalte verwendet wird (z. B. Split-Kriterium anhand <code class="codeInline">@src</code>). Außerdem kann die Option **optional** gesetzt werden (z. B. <code class="codeInline">elementSplitIsOptional = '1'</code>).