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.
Das nachfolgende Beispiel führt an, wie Sie die ersten drei Listeneinträge der Dateiliste nach Zufall sortieren.
<?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;
}
?>
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).
<?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;
}
?>
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.
<?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);
}
?>
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.
<?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;
}
?>
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.
<?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
$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.
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.
<?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;
}
?>
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.
<?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;
}
?>