Platzhalter und Hooks

WBCE bietet ein Platzhalter- und Hook-System mit dem Module und Templates auf interne Ereignisse reagieren können — ohne den Core zu verändern.


Was sind Hooks?

Hooks sind Einsprungpunkte im WBCE-Core an denen externe Code-Snippets ausgeführt werden können. Ein Modul kann sich in einen Hook einhängen und so auf Ereignisse reagieren.


Verfügbare Hooks

Frontend-Hooks

// Wird vor der Seitenausgabe ausgeführt
define('BEFORE_PAGE_CONTENT', true);

// Wird nach der Seitenausgabe ausgeführt  
define('AFTER_PAGE_CONTENT', true);

Backend-Hooks

// Wird beim Anlegen einer neuen Seite ausgeführt
// Datei: modules/mein_modul/add.php

// Wird beim Löschen einer Seite ausgeführt
// Datei: modules/mein_modul/delete.php

Outputfilter (OPF)

Der mächtigste Mechanismus in WBCE. Outputfilter können die komplette HTML-Ausgabe bearbeiten bevor sie an den Browser gesendet wird.

Filter registrieren:

opf_register_filter('mein_filter', 'meine_callback_funktion', 'frontend', 50);

Parameter:

Name:      Eindeutiger Name des Filters
Callback:  PHP-Funktion die aufgerufen wird
Typ:       frontend / backend / both
Position:  Reihenfolge (niedrig = früher)

Callback-Funktion:

function meine_callback_funktion($content) {
    // $content = kompletter HTML-Output der Seite
    // Verändern und zurückgeben:
    $content = str_replace('alt', 'neu', $content);
    return $content;
}

Droplets als Hooks

Droplets sind die einfachste Form von Hooks — wiederverwendbare PHP-Schnipsel die direkt in Seiteninhalte eingefügt werden.

Im Content aufrufen:


Droplet-Datei (/modules/droplets/droplets/MeinDroplet.php):

<?php
// Parameter auslesen
$param = isset($param) ? $param : 'standard';

// Ausgabe zurückgeben
return '<p>Hallo ' . htmlspecialchars($param) . '!</p>';

Insert-Klasse

Die Insert-Klasse ermöglicht es CSS und JavaScript aus Modulen heraus gezielt in den <head> oder vor </body> einzufügen.

// CSS einfügen:
insertCssFile(WB_URL . '/modules/mein_modul/css/style.css');

// JavaScript einfügen:
insertJsFile(WB_URL . '/modules/mein_modul/js/script.js');

// Inline-Code einfügen:
insertCssCode('.meine-klasse { color: red; }');
insertJsCode('console.log("geladen");');

Praxisbeispiel: Modul fügt CSS hinzu

In view.php:

<?php
defined('WB_PATH') or die("This file cannot be accessed directly!");

// CSS nur einmal laden (auch bei mehreren Abschnitten)
if (!defined('MEIN_MODUL_CSS_LOADED')) {
    define('MEIN_MODUL_CSS_LOADED', true);
    insertCssFile(WB_URL . '/modules/mein_modul/css/frontend.css');
}

// Inhalt ausgeben...

Wichtig: echo in include.php landet nach

Output von include.php wird in $sPreOutput gesammelt und ans Ende des fertigen HTML angehängt — also nach dem schließenden </html> Tag!

// ❌ FALSCH — CSS/JS landen außerhalb von <head>/<body>
echo '<link rel="stylesheet" href="...">';
echo '<script src="..."></script>';
// ✅ RICHTIG — Insert-Klasse verwenden
I::insertCssFile(WB_URL . '/modules/mein_modul/css/style.css', 'HEAD BTM-');
I::insertJsFile(WB_URL . '/modules/mein_modul/js/script.js', 'BODY BTM-');
I::insertHtmlCode($html, 'BODY BTM-');

Voraussetzung: OPF-Filter "Class Insert Helper" muss unter Admin-Tools → Outputfilter aktiv sein!


Nächster Schritt: Sicherheit — SQL-Injection, CSRF und mehr