Listen über individuelle PHP Callback Funktion filtern

Nutzbar ab: Version

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, myListFunctionPremyListFunctionOptionsPre.

Je nach ausgewählten Filter wird die angegebene Funktion mit entsprechenden Parametern aufgerufen.

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.

Listenoptionen mit "PHP Callback Funktion" Filter
Listenoptionen mit "PHP Callback Funktion" Filter

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

Listenoptionen mit "PHP Callback Funktion PRE" Filter
Listenoptionen mit "PHP Callback Funktion PRE" Filter

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
Liste mit Auswahlbox nach Jahren
Liste mit Auswahlbox nach Jahren

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;

}

?>