AddOn-Entwicklung #5 - Extension Points

Wie in vielen andere CMS gibt es auch in REDAXO so genannten Extension Points. (In Typo3 oder Wordpress zum Beispiel heißen sie Hooks.) So oder so – sie geben dem Entwickler mächtige Möglichkeiten an die Hand.

  • rex_register_extension($name, $callback)
    Mit dieser Funktion kann man eine neue Extension registrieren. Man kann sich in den Extension Point eines anderen AddOns oder des REDAXO-Kerns “hängen” oder einklinken, um dadurch das Verhalten zu erweitern.
  • rex_register_extension_point($name, $subject, $params) erstellt genau diese Einklink-Möglichkeit.

Doch am besten ist es, wir sehen uns das Ganze an einem konkreten Beispiel an. Nehmen wir an, wir möchten den Status eines Artikels auf “Online” setzen, sobald wir den Namen verändern. Dies könnte zum Beispiel bei einer artikelbasierten Newsverwaltung sinnvoll sein.

In der config-Datei unseres AddOns registrieren wir die Extension, die beim Extension Point ART_UPDATED aktiv werden soll – dieser tritt eben genau dann in Kraft, wenn ein Artikel aktualisiert wird. Es soll eine Funktion namens putArticleOnline aufgerufen werden, die wir in einer eigenen Datei functions.inc.php ablegen und includen.

if ($REX['REDAXO']) {
require $REX['INCLUDE_PATH'].'/addons/'.$mypage.'/functions/functions.inc.php';
}
rex_register_extension('ART_UPDATED', 'putArticleOnline');

Die Funktion könnte auszugsweise so aussehen:

function putArticleOnline($params) {
global $REX;

$message = $params['subject'];
$articleID = (int) $params['id'];
$clangID = (int) $params['clang'];
$article = $params['article'];

$article->setValue('status', 1); // Hier wird der Status geändert.
$article->setTable($REX['TABLE_PREFIX'].'article');
$article->setWhere('id = '.$articleID.' AND clang = '.$clangID);
$article->update();

return $message;
}

Die komplette Funktion ist im Beispiel-AddOn zu finden.

AddOn in sieben Schritten

Ein anderer, gern genutzter Extension Point ist PAGE_HEADER, mit dem man das Einbinden von bestimmten Aufrufen (CSS- oder Javascript-Dateien) im Header realisieren kann – zum Beispiel, um ein News-AddOn mit einem Datepicker auszustatten.

Man könnte nun natürlich die Datei include/layout/top.php editieren, aber sollte man es NICHT machen, um den Kern unverändert zu belassen.
Stattdessen hängen wir uns in den Extension Point PAGE_HEADER und platzieren dort unseren Javascript-Aufruf:

rex_register_extension('PAGE_HEADER', 'AddJS');

function AddJS($params) {
echo '<script type="text/javascript" src="include/addons/adressen/js/datepicker.js"></script>';
}

Voila, schon haben wir unsere Javascript-Datei eingebunden – sofern sie im js-Verzeichnis unseres AddOns vorhanden ist, natürlich …

Eine vollständige Liste aller REDAXO Extension Points und der API mit einigen Erklärungen

Weiter zum Teil 6 - Seitengenerierung

Zurück zum Teil 4 - Frontend-Ausgabe