TYPO3 - userFunc: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
(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/
  
V7.6: http://www.schmutt.de/542/userfunc-tutorial-update/
+
== 4.7 und kleiner ==
 +
Einbindung über PHP Script Objekt
 +
lib.marker = PHP_SCRIPT
 +
lib.marker.file = fileadmin/php/skript.php
  
V8.7: http://typo3blogger.de/userfuncs-per-typoscript-in-typo3-8-7-einbinden/
+
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

Sammlung[Bearbeiten]