Extbase Plugin per TypoScript einbinden

Wenn man ein auf Extbase/Fluid-Basis erstelltes Plugin auf jeder Seite einsetzen möchte, dann braucht man folgenden Code im Setup des Seitentemplates:

temp.myPlugin = USER
temp.myPlugin {
   userFunc = tx_extbase_core_bootstrap->run
   pluginName = MyPlugin
   extensionName = MyExtension
 
   settings =< plugin.tx_myextension.settings
   persistence =< plugin.tx_myextension.persistence
   view =< plugin.tx_myextension.view
}

Statt MyPlugin und MyExtension muss man natürlich den Namen des eigenen Plugins und der Extension einsetzen. Wichtig ist, dass das Plugin mit configurePlugin und registerPlugin in ext_localconf.php bzw. ext_tables.php registriert und konfiguriert ist. In meinem Fall ist MyPlugin so konfiguriert, dass TestController->listAction aufgerufen werden soll.

Nun hatte ich das Problem, dass ich meine Klassen bereits nach TYPO3 6 Manier also mit Namespaces geschrieben habe. Wenn der Extbase Bootstrapper aber aus den Angaben den Controller-Klassennamen zusammenbaut, dann bekommt er folgendes: Tx_MyExtension_Controller_TestController. Die Klasse existiert natürlich nicht, denn sie heißt genamespaced ja so: \Vendor\MyExtension\Controller\TestController.

Ich habe rausgefunden, dass es eine ClassAliasMapper.php gibt, in der die alten Klassennamen auf die neuen Namen mit Namespace gemappt werden. So funktioniert ja z.B. der Aufruf Tx_Extbase_Core_Bootstrap immer noch, obwohl es die Klasse nicht gibt. Dann hab ich rausgefunden, dass alle Extensions nach der gleichen Datei durchsucht werden und diese Mapping-Liste erweitert wird. Im Extension-Ordner die Ordnerstruktur Migrations/Code/ und darin die Datei ClassAliasMap.php anlegen. Die Datei hat folgenden Inhalt:

return array(
	'Tx_MyExtension_Controller_TestController' => 'Vendor\\MyExtension\\Controller\\TestController'
);

3 Kommentare

  1. Sebastian

    Hi, danke für den Tipp, hat mit weitergeholfen.

    Kleine Sache am Rande: der Extension-Ordner muss

    Migrations/Code/ und nicht
    Migrations/Core/ heißen

    und ich würde noch das Tx_ vor dem Extention Namen schreiben, also:

    Tx_MyExtension_Controller_TestController

    Achso und da ich so kleinlich bin, der Vendor Name muss natürlich mit dem in der ext_localconf.php verwendeten übereinstimmen. Wenn man seine Extention per Extention Builder erstellt hat, ist das meistens TYPO3, es sei denn, man hat was anderes angegeben.

  2. natalia

    Danke. Die zwei Sachen habe ich geändert.

    Danke für den Hinweis mit dem Vendor. Man sollte es unbedingt ändern, denn der Vendor TYPO3 ist eigentlich für Core-Classen reserviert.

  3. Robbie

    Wenn man auf einer Seite mal eine andere default-Action benötigt, klappt das wie folgt: (Die zusätzliche action muss natürlich in ext_localconf.php registriert sein)


    lib.foo = USER
    lib.foo {
    userFunc = tx_extbase_core_bootstrap->run
    extensionName = MyExtension
    pluginName = MyPlugin
    switchableControllerActions {
    MyController {
    1 = listspecial
    }
    }
    }