TYPO3 - userFunc
Je nach Version unterschiedlich V6.3-7.4 Links
https://nic3.de/typo3/php (bis Version 7.4 (inkl.) V7.4: http://www.schmutt.de/542/userfunc-tutorial-update/ http://insight.helhum.io/post/130876393595/how-to-configure-class-loading-for-extensions-in V8.7: http://typo3blogger.de/userfuncs-per-typoscript-in-typo3-8-7-einbinden/
4.7 und kleiner[Bearbeiten]
Einbindung über PHP Script Objekt
lib.marker = PHP_SCRIPT lib.marker.file = fileadmin/php/skript.php
Im PHP-Skript muss die Ausgabe in einer Variable namens $content gespeichert werden. In nachfolgenden Beispiel-Code wird das durch Output-Buffering erledigt.
ob_start(); echo 'Diese Ausgabe wurde durch PHP erzeugt.'; $content = ob_get_contents(); ob_end_clean();
UserFunc in TYPO3 6.3 - 7.3[Bearbeiten]
Der Objekttyp PHP_SCRIPT wurde in der TYPO3-Version 4.7 als veraltet erklärt und in Version 6.0 entfernt. Ab der TYPO3-Version 6.0 wird stattdessen der Objekttyp USER angeboten. Die Funktionsweise ist sehr ähnlich. Statt einem linearen PHP-Skript, ist nun eine Klasse mit einer Methode für die Ausgabe erforderlich.
includeLibs.user_klasse = fileadmin/php/user_klasse.php
lib.marker = USER lib.marker.userFunc = user_klasse->ausgabe
Mit includeLibs wird der Pfad zur Klasse user_klasse definiert. Diese befindet sich in diesem Beispiel im Ordner /fileadmin/templates/php.
Die Klasse user_klasse stellt Methoden bereit, die den auszuführenden PHP-Code enthalten. Der Klassenname muss immer in der Form user_[klassenname] vorliegen.
class user_klasse
{
function ausgabe()
{
return 'Diese Ausgabe wurde durch PHP erzeugt.';
}
}
UserFunc in TYPO3 7.4[Bearbeiten]
In TYPO3 7.4 wurde die Methode, eigene PHP-Dateien via includeLibs einzubinden, angepasst.
Einfaches Beispiel ohne eigene Extension[Bearbeiten]
lib.marker = USER_INT lib.marker.includeLibs = fileadmin/php/user_klasse.php lib.marker.userFunc = user_klasse->ausgabe
Anmerkung Steff: Beispiel Funktioniert in 7.6
Einfache Extension für die userFunc[Bearbeiten]
Empfohlen wird aber, die benötigten Klassen über eine Extension einzubinden und das Autoload-Verhalten mit Namepaces auszunutzen. Dafür ist minimal nötig (Beispiel – danke dafür an Peter Linzenkirchner):
Ein Ordner in typo3conf/ext/ mit diesem Inhalt:
typo3conf/ext/myincludes
typo3conf/ext/myincludes/Classes/
typo3conf/ext/myincludes/Classes/Example.php
typo3conf/ext/myincludes/ext_emconf.php
typo3conf/ext/myincludes/ext_icon.gif
Der Inhalt der ext_emconf.php:
<?php
$EM_CONF[$_EXTKEY] = array(
'title' => 'Include all my Classes',
'description' => 'Einbinden der Klassen für userFunc',
'category' => 'fe',
'author' => 'my Name',
'author_email' => 'my Email',
'state' => 'alpha',
'author_company' => 'my Company',
'version' => '0.0.1',
'constraints' => array(
'depends' => array(
),
'conflicts' => array(
),
'suggests' => array(
),
),
);
Der Inhalt der Example.php:
<?php
namespace Myvendor\Myincludes;
class Example {
public function myExampleFunction($content, $conf) {
$color = $conf['userFunc.']['color'];
return '<p style="color:' . $color. ';">Dynamic time: ' . date('H:i:s') . '</p><br />';
}
}
Und der Aufruf im TS:
page.30 = USER_INT
page.30 {
userFunc = Myvendor\Myincludes\Example->myExampleFunction
userFunc.color = #ff0000
}
ExtBase Extension mit userFunc Action
Oft hat man bereits eine Extbase Extension und will eine bestimmte Action als userFunc aufrufen. Das geht so:
10 = USER_INT
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
vendorName = MyVendor\Myincludes
extensionName = MyExtension
pluginName = Pi1
switchableControllerActions {
Example {
1 = myUserFunc
}
}
}
Und das ist der zugehörige Controller. Der Eintrag in switchableControllerActions ist nötig, da sonst die default listAction aufgerufen wird:
<?php
namespace MyVendor\MyExtension\Controller;
class ExampleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
public function listAction() {
...
}
public function myUserFuncAction() {
return '<p style="color: red;">Dynamic time: ' . date('H:i:s') . '</p><br />';
}
}
Weitere Infos zu der ExtBase Variante findet man hier: http://blog.teamgeist-medien.de/2014/03/typo3-eine-extbase-extension-per-typoscript-einbinden.html
Vorsicht Fallen[Bearbeiten]
Für die Schreibweisen der Namespaces: https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Namespaces/Index.html#namespaces
Damit das Autoloading funktioniert muss alles zusammenpassen. Beispiel:
Extensionname: myextensionname Klassendatei: myextension/Classes/Example.php Funktion in der Klasse: myExampleFunction Klassenname: Example Namespace: Myvendorname\Myextensionname Aufruf im TypoScript: userFunc = Myvendorname\Myextensionname\Example->myExampleFunction
Vorsicht normales Cache löschen im Backend reicht nicht. Im Installtool löschen oder Extension Deinstallieren / Installieren