TYPO3 - userFunc: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „Je nach Version unterschiedlich V7.6: http://www.schmutt.de/542/userfunc-tutorial-update/ V8.7: http://typo3blogger.de/userfuncs-per-typoscript-in-typo3-8-7-…“) |
|||
| (9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
Je nach Version unterschiedlich | 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 == | |
| + | 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. | |
| + | <pre> | ||
| + | ob_start(); | ||
| + | echo 'Diese Ausgabe wurde durch PHP erzeugt.'; | ||
| + | $content = ob_get_contents(); | ||
| + | ob_end_clean(); | ||
| + | </pre> | ||
| + | == UserFunc in TYPO3 6.3 - 7.3 == | ||
| + | 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. | ||
| + | |||
| + | <pre> | ||
| + | class user_klasse | ||
| + | { | ||
| + | function ausgabe() | ||
| + | { | ||
| + | return 'Diese Ausgabe wurde durch PHP erzeugt.'; | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | == UserFunc in TYPO3 7.4 == | ||
| + | '''In TYPO3 7.4 wurde die Methode, eigene PHP-Dateien via includeLibs einzubinden, angepasst.''' | ||
| + | === Einfaches Beispiel ohne eigene Extension === | ||
| + | |||
| + | <pre> | ||
| + | lib.marker = USER_INT | ||
| + | |||
| + | lib.marker.includeLibs = fileadmin/php/user_klasse.php | ||
| + | lib.marker.userFunc = user_klasse->ausgabe | ||
| + | </pre> | ||
| + | |||
| + | Anmerkung Steff: Beispiel Funktioniert in 7.6 | ||
| + | |||
| + | === Einfache Extension für die userFunc === | ||
| + | |||
| + | 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:''' | ||
| + | <pre> | ||
| + | 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 | ||
| + | </pre> | ||
| + | '''Der Inhalt der ext_emconf.php:''' | ||
| + | <syntaxhighlight lang="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( | ||
| + | ), | ||
| + | ), | ||
| + | ); | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | '''Der Inhalt der Example.php:''' | ||
| + | <syntaxhighlight lang="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 />'; | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | '''Und der Aufruf im TS:''' | ||
| + | <syntaxhighlight lang="typoscript"> | ||
| + | page.30 = USER_INT | ||
| + | page.30 { | ||
| + | userFunc = Myvendor\Myincludes\Example->myExampleFunction | ||
| + | userFunc.color = #ff0000 | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | ExtBase Extension mit userFunc Action | ||
| + | |||
| + | Oft hat man bereits eine Extbase Extension und will eine bestimmte Action als userFunc aufrufen. Das geht so: | ||
| + | <syntaxhighlight lang="typoscript"> | ||
| + | 10 = USER_INT | ||
| + | 10 { | ||
| + | userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run | ||
| + | vendorName = MyVendor\Myincludes | ||
| + | extensionName = MyExtension | ||
| + | pluginName = Pi1 | ||
| + | switchableControllerActions { | ||
| + | Example { | ||
| + | 1 = myUserFunc | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | Und das ist der zugehörige Controller. Der Eintrag in switchableControllerActions ist nötig, da sonst die default listAction aufgerufen wird: | ||
| + | |||
| + | <syntaxhighlight lang="php"> | ||
| + | <?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 />'; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | 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 === | ||
| + | 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 | ||
| + | |||
| + | ==Sammlung== | ||
Aktuelle Version vom 29. Januar 2018, 16:02 Uhr
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