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:

Beispiel Module

Die Ansicht im Frontend:

Beispiel Module

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:

Beispiel Module

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>

Beispiel Module

Die Ansicht im Frontend:

Beispiel Module

Grundsätzlich werden übergeben:

nun ändern wir die im Seiteninhalt eigegebene Zeile:

<mod>showparameter("myPara1","2","myPara2")</mod>

Die geänderte Ausgabe im Frontend:

Beispiel Module

Die Parameterübergabe gestaltet sich nun wie folgt:

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:

Beispiel Module

Demnach muss die Liste wie folgt aussehen:

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:

Beispiel Module