TYPO3 - userFunc: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(5 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.4: 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 ==
 
== UserFunc in TYPO3 7.4 ==
Ab 7.4 hat sich die include Syntax geändert, config.includeLibrary und config.includeLibs wurden entfernt. Userfuncs müssen ab TYPO3 7.4 folgendermaßen eingebunden werden:
+
'''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
  
<syntaxhighlight lang="typoscript">
 
page.20 = USER_INT
 
page.20 {
 
  userFunc = user_printTime
 
  includeLibs = fileadmin/example_time.php
 
}
 
</syntaxhighlight>
 
 
=== Einfache Extension für die userFunc ===
 
=== Einfache Extension für die userFunc ===
  
Zeile 107: Zeile 146:
 
Weitere Infos zu der ExtBase Variante findet man hier: http://blog.teamgeist-medien.de/2014/03/typo3-eine-extbase-extension-per-typoscript-einbinden.html
 
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 Namespaces und Cache ===
+
=== Vorsicht Fallen  ===
 
Für die Schreibweisen der Namespaces:  
 
Für die Schreibweisen der Namespaces:  
 
https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Namespaces/Index.html#namespaces
 
https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Namespaces/Index.html#namespaces
  
Die Namespaces haben mir noch Probleme bereitet ... Ausserdem muss man beim Testen die Extension nach Änderungen de- und wieder installieren oder im Installtool den Cache löschen. Normales Cache löschen hat manchmal nicht ausgereicht.
+
Damit das Autoloading funktioniert muss alles zusammenpassen. Beispiel:
 
 
Finde ich schon aufwändiger, aber auch aufgeräumter, da in einer Extension. Der Vorteil kommt wohl vor allem zum Tragen, wenn man mehrere Userfuncs einbinden muss. Neue Datei in Classes und fertig … Und an die Namespaces werde ich mich auch noch gewöhnen :-)
 
  
OK, ich finde die Diskussion hat sich rentiert, für mich zumindest. Herzlichen Dank Helmut!
+
Extensionname: myextensionname
 
+
Klassendatei: myextension/Classes/Example.php
Peter
+
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==
 
==Sammlung==
TYPO3 Versionen 6.0 bis 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 einem Doppelklick kann der gesamte Code markiert werden.
 
 
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.';
 
}
 
}
 
 
Mit einem Doppelklick kann der gesamte Code markiert werden.
 
TYPO3 Version 7.4 und größer
 
 
In TYPO3 7.4 wurde die Methode, eigene PHP-Dateien via includeLibs einzubinden, angepasst.
 
 
<pre>
 
lib.marker = USER_INT
 
 
lib.marker.includeLibs = fileadmin/php/user_klasse.php
 
lib.marker.userFunc = user_klasse->ausgabe
 
</pre>
 

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]