Schick programmiert

Service, Hook, XCLASS extension usw in TYPO3

In TYPO3 gibt es 6 verschiedene Variationen um Extensions oder den Core selbst zu erweitern oder Funktionen abzuändern ohne deren Code direkt anzufassen:

Hier ist eine persönliche Zusammenfassung, wann ich welche Methode wähle. Jede der Methoden hat ihre Vor- und Nachteile.

Service

Durch das Schreiben eines neuen Services kann man einen Dienst, der als Service geschrieben wurde, durch eine eigene Implementierung ersetzen.

Eine Besonderheit hierbei ist, dass jeder Service in Sub-Services aufgeteilt werden kann. Jeder dieser Sub-Services kann, unabhängig vom Rest des Services, überschrieben werden.

Ein gutes Beispiel für einen Service in TYPO3 ist die Anmeldung. Zu diesem Service konnte ich keine Dokumentation finden, daher verweise ich hier auf die Dokumentation von cc_sv_auth. Dieser Service wird, laut Dokumentation, in Backend und Frontend, und Benutzer bzw. Gruppen hohlen und authentifizieren getrennt. Durch diese Trennung ist es zum Beispiel möglich, jeden Benutzer über das gleiche Passwort zu verifizieren, wie es in cc_magicpw umgesetzt wurde. Ich hoffe stark, dass diese Erweiterung nur als Beispiel dient, und nicht produktiv eingesetzt wird.

Hook

Durch einen Hook können an einer, vom Programmierer vorgesehenen, Stelle Variablen geändert oder Funktionen hinzugefügt werden. An einer solchen Stelle können beliebig Implementationen geladen werden.

XCLASS extension

Die XCLASS extension ist die älteste, TYPO3 bekannte, Form die Funktionalität einer Erweiterung zu ändern – sie ist damit auch die unflexibelste. FYI: Implementation für XCLASS extensions wurde zum Wechsel auf TYPO3 v6.0 geändert (siehe Link zur Dokumentation in der Überschrift).

Bei dieser Variante wird die PHP-Klasse erweitert. Da PHP keine Mehrfachvererbung unterstützt, stellt sich hier schnell die Frage, was passieren soll, wenn zwei Personen die gleiche Erweiterung an unterschiedlichen Stellen ändern wollen. Ein Beispiel dafür ist die Erweiterung tipafriend, welche durch tipafriend_captcha mit Hilfe einer XCLASS die Funktion des Captcha dazu bekommt. Alle Erweiterungen, die tipafriend auch erweitern, werden somit mit tipafriend_captcha kompatibel sein, in dem sie deren XCLASS wieder erweitern, oder nicht, wenn sie die Klasse von tipafriend erweitern.

Code des TYPO3 Core’ oder einer Extension abändern

Das ist die, bei weitem, schnellste Variante das Problem zu lösen. Problem hierbei ist nur, dass man die Erweiterung nicht mehr aktualisieren kann, ohne dass der eigene Code verloren geht. Deswegen ist diese Variante auch wirklich als aller, aller letzte Möglichkeit zu sehen.

Wann nutze ich was?

Services und Hooks verfolgen im Ansatz ganz unterschiedliche Ziele. Je nach dem, ob ein Service oder Hook existiert, wird dieser in meinen Entwicklungen bevorzugt verwendet. Hierbei achte ich auch (speziell bei Hooks), wofür der Programmierer ihn gedacht hat. Dementsprechend kann ich auch erwarten, dass meine Implementation in der nächsten Version noch funktionieren wird.

Gibt es keine Hooks oder Services, muss ich zur XCLASS extension zurückgreifen. Nicht schön – aber selten. Diese speichere ich vorzugsweise in einer separaten Erweiterung, welche mit dem Status experimental gekennzeichnet wird. Der Key der Erweiterung beginnt immer mit user_ und enthält den Namen der Erweiterung(en), von denen eine XCLASS erstellt wurde, und die ID des Eintrages im BugTracker. Passen diese Daten nicht in den Key, wird dieser auf andere Weise gut formuliert und die Liste der Erweiterungen und die ID kommen in die Beschreibung. Alle Erweiterungen, auf die diese Erweiterung aufbaut, werden in die constraints als depends mit genauer Versionsnummer oder Versionsbereich aufgenommen.

Hier noch kurz als Beispiel die Konfigurationsdatei einer von mir erstellten XCLASS für crawler, die mit einer bestimmten Version von realurl nicht mehr funktioniert:

ext_emconf.php

/***************************************************************
 * Extension Manager/Repository config file for ext "user_crawler_realurlfix".
 *
 * Auto generated 15-01-2013 15:30
 *
 * Manual updates:
 * Only the data in the array - everything else is removed by next
 * writing. "version" and "dependencies" must not be touched!
 ***************************************************************/

$EM_CONF[$_EXTKEY] = array(
	'title' => 'Crawler-width-realurl xClass',
	'description' => 'xClass for Crawler using realURL (http://forge.typo3.org/issues/44554)',
	'category' => 'misc',
	'shy' => 0,
	'version' => '0.0.0',
	'dependencies' => 'crawler,realurl',
	'conflicts' => '',
	'priority' => '',
	'loadOrder' => '',
	'module' => '',
	'state' => 'experimental',
	'uploadfolder' => 0,
	'createDirs' => '',
	'modify_tables' => '',
	'clearcacheonload' => 0,
	'lockType' => '',
	'author' => 'Simon Schick',
	'author_email' => 'ssc@softvision.de',
	'author_company' => '',
	'CGLcompliance' => '',
	'CGLcompliance_note' => '',
	'constraints' => array(
		'depends' => array(
			'crawler' => '3.0.0-3.3.0',
			'realurl' => '1.8.0-1.10.2',
		),
		'conflicts' => array(
		),
		'suggests' => array(
		),
	),
	'_md5_values_when_last_written' => 'a:3:{s:17:"ext_localconf.php";s:4:"1a47";s:34:"xClass/class.ux_tx_crawler_lib.php";s:4:"12d0";s:30:"xClass/class.ux_tx_realurl.php";s:4:"bc30";}',
	'suggests' => array(
	),
);

Noch seltener kommt es vor, dass ich Erweiterungen dort überarbeiten muss, wo es auch keine XCLASS gibt. Ist dies der Fall bei einer installierten Erweiterung, wird diese mit dem Status excludeFromUpdates in der Datei ext_emconf.php gekennzeichnet.

Zum Weiterlesen:


Categorised as: Uncategorized


One Comment

  1. Tim sagt:

    Hallo, eine schöne zusammenstellung! Ich würde in den Zusammenhang gerne die Dependency Injection von ExtBase noch ergänzen. Die Auflösung von Abhänigkeiten im Code macht die Programmierung deutlich flexibler, zudem wird via Dependency Injection auch sichergestellt das die ObjectFactory benutzt wird (was wiederrum die Erweiterbarkeit gewährleistet s.o.)… Grüße, Tim

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>