CMS erweitern: Hooks verstehen und nutzen

2014-10-15 11:00 (Kommentare: 0)

CMS Hooks
© Trueffelpix - Fotolia.com

Viele aktuelle Content Management Systeme setzen auf das Design Pattern Hooks - unter anderem Wordpress und Typo3. Wir zeigen euch, was Hooks sind und wie ihr sie für eure Erweiterungen einsetzt.

Was sind Hooks?

Hooks sind ein Design Pattern – also ein Entwurfsmuster. Es dient der Implementierung einer Erweiterungsfunktion in Softwaresystemen. Diese wird über eine Schnittstelle realisiert. Die genaue Implementierung ist von Softwarelösung zu Softwarelösung verschieden. Alle Hooks haben jedoch gemein, dass sie es erlauben, an definierten Stellen erweiternde Funktionen einfach einzuhängen beziehungsweise einzuschieben. Gelegentlich werden Hooks daher auch als Einschubmethoden bezeichnet.

Der Vorteil von Hooks ist, dass ohne Umschreiben des Cores externe Funktionen im Kern ausgeführt werden. Der Basis-Quellcode bleibt so sauber und update-freundlich. Nachteil ist, dass die Reihenfolge der Hook-Funktionen eine Rolle spielen kann und das Einhängen nur an vorab von den Systementwicklern definierten Punkten möglich ist.

Hooks in Wordpress

Wordpress nutzt zwei verschiedene Hooks. Sie werden mit Actions und Filters bezeichnet. Actions erlauben zusätzliche Aktionen auszuführen. Filters ermöglichen vorhandene Daten zu manipulieren.

Actions

Um eine Funktion einzuhängen, ist logischerweise ein Einhängepunkt nötig. Diese sind im Wordpress-Code verteilt. Zu erkennen sind sie am Funktionsaufruf do_action(). Ein bekannter Action-Einhängepunkt ist die Action wp_head, sie ist im File wp-includes/general-template.php in der Funktion wp_head zu finden und sieht so aus:

  
function wp_head() { 
 do_action('wp_head'); 
}  


Haben wir nun das Ziel den Header einer Wordpress-Installation zu verändern, ist dies unser Einhängepunkt. Um Modifikationen durchzuführen, bearbeiten wir nicht den Core. Wir modifizieren unser Template oder ein Plugin.

Um das Hook zu nutzen benötigen wir zwei Komponenten. Zum einen ist dies die Funktion, die die gewünschten Aktionen durchführt. Zum anderen ist es die Zuweisung unserer Funktion zum Hook. Letzterer Schritt geschieht bei Wordpress Actions durch den Funktionsaufruf add_action() mit dem Hook-Tag und dem Funktionsnamen als Parameter:

  
add_action( 'wp_head', 'my_actionhook' ); 


Anschließend wird die Funktion definiert, so dass dem Template oder dem Plugin folgendes Snippet hinzugefügt wird:

  
<?php 
 add_action( 'wp_head', 'my_actionhook' ); 
 function my_actionhook() { 
  //... do something 
 } 
?>  


Nun wird in der Funktion wp_head() unsere Funktion my_actionhook() aufgerufen und ausgeführt.

Filter

Filter in Wordpress arbeiten ähnlich. Nur wird bei diesen bereits Vorhandenes verändert – beispielsweise ein String ausgetauscht.

  
<?php 
 add_filter( ‘wp_title’, ‘my_sitename_in_title’, 2, 1 ); 
 my_sitename_in_title( $title) { 
  /* Get site name. */ 
  $name = get_bloginfo( ‘name’ ); 
  /* Concat site name and $title. */ 
  $title .= ‘ ‘ . $name; 
  /* Return title. */ 
  return $title; 
 } 
?> 


Eine Liste mit Wordpress-Hooks findet ihr hier

Weitere Beispiele für die Arbeit mit Actions und Filters hier und hier.

Hooks in Typo3

Unter Typo3 ist die Arbeit mit Hooks im Vergleich zu Wordpress komplizierter. Das liegt auch daran, dass die Dokumentation der Hooks in Typo3 als schlechter zu bezeichnen ist: Selbst einige Core-Hooks sind undokumentiert. Wer einen Einhängepunkt für seine Typo3-Extension sucht, kommt meist nicht um das Durchwühlen des Typo3-Quellcodes herum.

Beispiel für ein Hook in TCEMain:

  
while (list(,$hookObj) = each($hookObjectsArr)) { 
 if (method_exists ($hookObj, 'processDatamap_postProcessFieldArray')) { 
  $hookObj->processDatamap_postProcessFieldArray ($status, $table, $id, $fieldArray, $this); 
 } 
} 


Ein Einhängepunkt ist gefunden: Nun ist der Code für die eigene Hook-Funktion in einer eigenen Extension zu platzieren.

  
Class tx_myextension_tcemainprocdm { 
 function processDatamap_postProcessFieldArray ($status, $table, $id, & $fieldArray, &$this) { 
  // do something  
 } 
} 


Anschließend muss die Klasse mitsamt unserer Hook-Funktion noch registriert werden. Dies erfolgt in der ext_localconf.php unserer Typo3-Extension. Dazu genügt meist eine Codezeile nach folgendem Muster:

  
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS'][(dir)/class.[classname].php][hookname] 


für Core-Hooks oder

  
$GLOBALS ['TYPO3_CONF_VARS']['EXTCONF'][extkey][hookname]  


für Extension-Hooks

Für obiges Beispiel sähe die Codezeile so aus:

  
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] ='tx_myextension_tcemainprocdm';  


Dabei handelt es sich um ein mehrdimensionales Array. Beim Einsatz von Core Hooks sind die ersten beiden Parameter bzw. Arrays ['TYPO3_CONF_VARS'] und ['SC_OPTIONS']. Darauf folgt der Pfad zur Datei und Klasse t3lib/class.t3lib_tcemain.php sowie die Zuweisung der Hook-Funktion tx_myextension_tcemainprocdm.

Eine ausführlichere Erklärung des Typo3-Beispiels findet ihr auf Typo3.org.

Ein Vortrag vom Typo3camp Berlin 2011 zu Typo3 & Extensions hier.

Zurück

 
domainssaubillig © 2007-2022 Alle Rechte vorbehalten. | Support | AGB | Datenschutzerklärung | Impressum