[TYPO3-german] Tipps, wie man Extensions für TYPO3 4.x und 6.x implementieren kann

Chris Wolff - AERTiCKET AG cwolff at aer.de
Fri Feb 14 12:46:04 CET 2014


Danke Für das Teilen Deiner Erkenntnisse.
Normalerweise Solltest du deine Classen Nicht in ext_autoload eintragen müssen wenn sie dem Typo3 Namenschema entsprechen.
Dann findet typo3 sie automatisch.

Ext_autoload.php ist nur für classen gedacht die nicht dem typo3 namenschema entsprechen z.b weil sie aus einer externenlibary kommen.

Es kann sein das es einschränkungen beim autoloading für "low-level" entry points gibt. (eID,scheduler) das weiss ich nicht genau.

Es stimmt das man die classenamen in ext_autoload.php kleinschreiben muss (jedenfalls unter typo3 4.5 später wurde das behoben)

Gruss chris


-----Ursprüngliche Nachricht-----
Von: typo3-german-bounces at lists.typo3.org [mailto:typo3-german-bounces at lists.typo3.org] Im Auftrag von Norbert Sendetzky
Gesendet: Freitag, 14. Februar 2014 12:02
An: typo3-german at lists.typo3.org
Betreff: [TYPO3-german] Tipps, wie man Extensions für TYPO3 4.x und 6.x implementieren kann

Hallo zusammen

Letzte Woche haben wir die erste Version der Arcaivas Webshop Extension veröffentlicht, die mit allen TYPO3 Versionen von 4.5 bis 6.1 funktionsfähig war (für die, die es interessiert gibt es hier mehr Infos dazu: http://forum.typo3.org/index.php/t/200655/). Dabei haben wir einige Erfahrungen gesammelt, die wir während des Anpassens und Testens der Extensions gemacht haben und die wir gerne hier teilen möchten.


Wenn ihr eure Extension direkt mit Extbase anstatt dem PI-basierenden Ansatz entwickelt habt, dann habt ihr sicher auch die neuen Tx_ Klassen benutzt, die die benötigte Funktionalität wesentlich sauberer kapseln. In TYPO3 6.x wurde das zwar auf Namespaces umgestellt, aber es gibt eine Kompatibilitätsschicht, so dass in den meisten Fällen auch die Tx_ Klassen in 6.x benutzt werden können. Leider haben sich aber einige Implementierungen in 6.x stark geändert und für genau die gibt es dann auch keine Kompatibilitätsschicht.

Einer dieser Problemfälle ist die Handhabung von flash messages im Tx_ ActionController bzw. in den neuen Namespace-Variante. Im Tx_Extbase_MVC_Controller_ActionController gibt es eine Eigenschaft flashMessageContainer, die ein Objekt enthält, zu dem man wichtige Nachrichten für den Benutzer hinzufügen kann, z.B. falls ein Fehler aufgetreten ist, der nicht weiter behandelt werden kann:

$this->flashMessageContainer->add( ... );

In TYPO3 6.x hat sich die Implementierung der flash message Objekte ziemlich stark geändert und ist nicht mehr kompatibel mit dem $this->flashMessageContainer Objekt weil sich die Methodennamen und die benutzten Objekte im Vergleich zu 4.x stark geändert haben. Eine Kompatibilitätsschicht gibt es dafür nicht, aber für die ganz alte t3lib_ Variante. Anstatt also die schönen neuen Objekte zu benutzen muss man hier auf die "altertümlichen" t3lib Klassen zurück greifen, damit es mit 4.x und 6.x funktioniert:

t3lib_FlashMessageQueue::addMessage( new t3lib_FlashMessage( '<message>', 'Error', t3lib_Flashmessage::ERROR );


Die Scheduler Tasks ("Planer" in der deutschen Übersetzung) machen auch Probleme, weil sich das PHP Interface für die "additional field provider" (Klassen um zusätzliche Felder im Task anzeigen und auswerten zu können) geändert hat und auch nicht rückwärtskompatibel ist.

In TYPO3 4.x erben die "additional fields provider" nur von tx_scheduler_Task und müssen folgende Methoden implementieren:
- public function getAdditionalFields( array &$taskInfo, $task, tx_scheduler_Module $parentObject )
- public function saveAdditionalFields( array $submittedData, tx_scheduler_Task $task )
- public function validateAdditionalFields( array &$submittedData, tx_scheduler_Module $parentObject ) 

Die Provider in 6.x müssen dagegen das \TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface implementieren, das folgende Methodensignaturen beinhaltet:
- public function getAdditionalFields( array &$taskInfo, $task, \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject )
- public function saveAdditionalFields( array $submittedData, \TYPO3\CMS\Scheduler\Task\AbstractTask $task )
- public function validateAdditionalFields( array &$submittedData, \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject )

Der Unterschied ist im Typ des letzten Parameters der Methoden. Die übergebenen Objekte sind nicht kompatibel und haben unterschiedliche Methoden und es gibt auch nicht die Möglichkeit, nur die alte Variante zu benutzen. Unsere Lösung dafür war, zwei verschiedene Klassen zu implementieren mit dem jeweils richtigen Interface zu implementieren und den gemeinsamen Code in eine Basisklasse auszulagern, der von den jeweiligen getAdditionalFields(), saveAdditionalFields() und validateAdditionalFields() Methoden benutzt wird. Um die richtige Implementierung für die jeweilige TYPO3 Version bereit zu stellen haben wir eine Art "feature detection" in der ext_localconf.php benutzt (die TYPO3 Version als Weiche zu benutzen schlägt früher oder später immer fehl!):

if( class_exists( '\TYPO3\CMS\Scheduler\Task\AbstractTask' ) ) {
    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']['Arcavias\Arcavias\Scheduler\Task\Typo6'] = ...
} else {
    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']['Tx_Arcavias_Scheduler_Task_Typo4'] = ...
}


Zu guter letzt sollte man sich vor Augen halten, dass die Namen der Tx_ Klassen in ext_autoload.php immer klein geschrieben werden müssen (das steht auch irgenwo in der Doku). In manchen Fällen funktioniert es auch mit der Orginalschreibweise (also camel-cased), aber nicht für den Schedulerteil. Um die Sache noch etwas komplizierter zu machen betrifft das allerdings nicht die neuen Klassen mit Namespaces in 6.x! Folgendes Beispiel für 4.x und 6.x funktioniert:

'tx_arcavias_scheduler_task_typo4' => $extensionPath . 'Classes/Scheduler/Task/Typo4.php',
'tx_arcavias_scheduler_provider_typo4' => $extensionPath . 'Classes/Scheduler/Provider/Typo4.php',
'Arcavias\Arcavias\Scheduler\Task\Typo6' => $extensionPath . 'Classes/Scheduler/Task/Typo6.php',
'Arcavias\Arcavias\Scheduler\Provider\Typo6' => $extensionPath . 'Classes/Scheduler/Provider/Typo6.php',

wobei $extensionPath = t3lib_extMgm::extPath( 'arcavias' );


Wenn ihr vor dem gleichen Problem steht und euere 4.x Extbase Extension fit für 6.x machen wollt, spart euch das hoffentlich einiges an Zeit, die wir nach vernünftigen Lösungen gesucht haben. Wenn ihr eine bessere Lösung für eines der Probleme kennt, dann würde ich mich freuen, wenn ihr sie hier posten würdet :-)


Norbert

_______________________________________________
TYPO3-german mailing list
TYPO3-german at lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german


More information about the TYPO3-german mailing list