Module
Um den Aufruf von PHP-Funktionen zu verhindern wird innerhalb der index.php ein Array mit der Bezeichnung allowedFunctions deklariert. Vor Aufruf des Moduls erfolgt eine Überprüfung, ob der Modulname in diesem Array vorhanden ist. Erst dann erfolgt der Modulaufruf. Ansonsten wird folgendes zurückgegeben:
Das Modul: modulname ist nicht vorhanden!
Beispiel
wir erstellen ein Modul mit der Bezeichnung datum, welches nur das aktuelle Datum zurückgibt.
array_push($allowedFunctions, 'datum');
dann deklarieren wir die Funktion:
function datum ($parameter){
}
$parameter ist zwingend erforderlich, dazu später mehr.
Die erstellte Funktion muss HTML oder Text zurückgeben und wird nicht mehr durch den MarkDown Parser geschickt.
Für einen ersten Test geben wir einfach nur den Text Datum von heute zurück
function datum ($parameter){
return "Datum von heute";
}
Nun erstellen wir eine neue Seite mit folgenden Eingaben:
Die Ansicht im Frontend:
Wir wollten das heutige Datum ausgeben und ändern die Funktion:
function datum ($parameter){
setlocale(LC_TIME, 'de_DE.UTF8');
return date('d.m.Y');
}
Die Ansicht im Frontend:
Der erforderliche Code für das Modul datum:
array_push($allowedFunctions, 'datum');
function datum ($parameter){
setlocale(LC_TIME, 'de_DE.UTF8');
return date('d.m.Y');
}
die Parameter
erstellen Sie folgendes Modul:
array_push($allowedFunctions, 'showparameter');
function showparameter ($parameter){
$ret = '<h2>Information Parameter</h2>';
ob_start();
echo '<pre>';
var_export($parameter);
echo '</pre>';
$ret.= ob_get_clean();
return $ret;
}
und geben folgende Zeile im Bereich Seiteninhalt ein:
<mod>showparameter</mod>
Die Ansicht im Frontend:
Grundsätzlich werden übergeben:
- $parameter[0] = Das PDO Datenbankobjekt der aktuell benutzten Datenbank
- $parameter[1] = die aktuelle Seite
nun ändern wir die im Seiteninhalt eigegebene Zeile:
<mod>showparameter("myPara1","2","myPara2")</mod>
Die geänderte Ausgabe im Frontend:
Die Parameterübergabe gestaltet sich nun wie folgt:
- $parameter[0] = Das PDO Datenbankobjekt der aktuell benutzten Datenbank
- $parameter[1] = die aktuelle Seite
- $parameter[2] = 1.Parameter im Modulaufruf
- $parameter[3] = 2.Parameter im Modulaufruf
- $parameter[4] = 3.Parameter im Modulaufruf
Modul mit Parametern
wir erstellen ein Modul, welches eine Liste aller als sichtbar gekennzeichneten Seiten ausgibt. Der Modulname wird mit seitenuebersicht festgelegt.
Die Systematik der Seiten ist wie folgt:
Seitennamen ohne Bindestrich = Hauptseiten
Seitennamen mit Bindestrich = den Hauptseiten untergeordnete Seiten
Beispiel:
Demnach muss die Liste wie folgt aussehen:
- startseite
- doku
- doku-einfuehrung
- doku-installraspberry
- doku-installwindows
- doku-module
- news
- todo
Das Modul:
array_push($allowedFunctions, 'seitenuebersicht');
function seitenuebersicht($parameter){
//ich brauche die Datenbank
$db = $parameter[0];
//und teste ob eine Klasse für die Liste
//übergeben wurde
$myClass = $parameter[2] ?? null;
if ($myClass){
$myClass = 'class="'.$myClass.'"';
}
else {
$myClass = '';
}
//Definiere Abfrage
$myQuery = "
select
title,
menutitle,
metadescription
from
websites
where
visible='ja'
order by
menuorder";
/*
benutze die interne Function
execQuery($db, $query)
die mir die Daten wie folgt zurückgibt
' status' => 'OK',
'message' => 'Abfrage erfolgreich',
'affected' => 0,
'rows' =>
array (
0 =>
(object) array(
'title' => 'startseite',
'menutitle' => 'Home',
'metadescription' => 'Startseite mit kurzer Information',
), .....
*/
$myData = execQuery($db, $myQuery);
if ($myData['status']==='OK'){
$depth = 0; //Listentiefe
$tdepth = 0; //aktuelle Listentiefe
$ret = "<ul {$myClass}>".PHP_EOL;
forEach ( $myData['rows'] as $row){
$link="<a href=\"./index.php?site={$row->title}\">{$row->menutitle}</a>"
.PHP_EOL."<p>{$row->metadescription}</p>";
$tdepth = substr_count($row->title,"-"); // Zähle Bindestriche
if ($tdepth == $depth){
$ret.= "<li>".$link.PHP_EOL;
}
if ($tdepth > $depth){
$depth=$tdepth;
$ret.= "<ul>".PHP_EOL."<li>".$link.PHP_EOL;
}
if ($tdepth < $depth){
for ( $i = $tdepth ; $i < $depth; $i++ ){
$ret.= "</ul>".PHP_EOL;
}
$depth = $tdepth;
$ret.= "<li>".$link.PHP_EOL;
}
}
$ret.= "</ul>";
return $ret;
}
//Wenn Query nicht erfolgreich
if ($myData['status']==='ERROR'){
return $myData['message'];
}
}
Den Code innerhalb der foreach Schleife habe ich nicht näher dokumentiert, weil hier lediglich etwas Grundlagenwissen erforderlich ist.
nun ändern wir die im Seiteninhalt eingegebene Zeile:
<mod>seitenuebersicht("sites-overview")</mod>
und geben damit der Liste die Klasse sites-overview.
Der vom Modul generierte Quelltext:
<ul class="sites-overview">
<li><a href="./index.php?site=startseite">Home</a>
<p>Startseite mit kurzer Information</p>
<li><a href="./index.php?site=doku">Dokumentation der CMS</a>
<p>Dokumentation</p>
<ul>
<li><a href="./index.php?site=doku-einfuehrung">Einführung</a>
<p>Einführung in das CMS</p>
<li><a href="./index.php?site=doku-installraspberry">Installation Raspberry</a>
<p>Installation Raspberry</p>
<li><a href="./index.php?site=doku-installwindows">Windows</a>
<p>Installation unter Windows</p>
<li><a href="./index.php?site=doku-module">module</a>
<p>Beschreibung der Module</p>
</ul>
<li><a href="./index.php?site=news">Neues</a>
<p>Neues</p>
<li><a href="./index.php?site=todo">ToDo</a>
<p>Noch zu erledigen</p>
</ul>
führt zu folgender Darstellung im Frontend: