Hi Leute,
leider finde ich hierzu keine Dokumentation. Ich habe eine UserFunc, welche im TCA einen Custom-Title generiert. Wie wäre hier unter TYPO3 6+ der Namespace zu definieren bzw wo waere die UserFunc-Klasse abzulegen?
a) Vendor/ExtName/Classes/UserFunc/ClassName
b) Vendor/ExtName/Configuration/TCA/UserFunc/ClassName
c) Vendor/ExtName/Classes/UserFunc/TCA/ClassName
d) was ganz anderes?
Gibt es hierfür eine Dokumentation bzw. ein Cheat-Sheet?
Hab mich auch gerade damit beschäftigt und das ganze folgendermaßen gelöst bekommen...
1) Im Extverzeichnis im Ordner "Classes" einen Unterordner "UserFunc" anlegen. Dort legen wir dann die PHP-Datei "ContentTeaserRelations.php" an. Der Code darin sieht ganz vereinfacht z.B. so aus:
<?php
namespace TYPO3\ContentTeaser\UserFunc;
class ContentTeaserRelations {
public function renderOverview($PA, $fObj) {
return 'Test';
}
}
?>
Der vollständige Pfad lautet also: typo3conf/ext/content_teaser/Classes/UserFunc/ContentTeaserRelations.php
Leider habe ich auch keine Dokumentation darüber gefunden, ob ein bestimmter Ordername für UserFunc-Dateien vorgesehen ist. Das einzige was ich in der folgenden Doku finden konnte, dass der Ordner bzw. die UserFunc Datei zwingend im Ordner Classes angelegt sein muss:
https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Namespaces/Index.html
2) Im TCA tragen wir dann noch folgendes ein:
<?php
...
'relations' => array(
'exclude' => 0,
'label' => 'Seiten:',
'config' => array(
'type' => 'user',
'size' => 30,
'userFunc' => 'TYPO3\ContentTeaser\UserFunc\ContentTeaserRelations->renderOverview',
)
),
...
?>
Der Teil "TYPO3\ContentTeaser\" entspricht der Namespace-Logik "Vendor\Extname\". Der Extname ist in diesem Fall "content_teaser" und wird in upper camel-case Schreibweise geschrieben.
Beim restlichen Teil geben wir dann den kompletten Pfad zur userFunc Datei an (ohne den Ordner "Classes" und ohne ".php" beim Dateinamen). Siehe auch hier die Anmerkungen innerhalb der Namespace Doku die oben verlinkt ist ;-)
Hoffe das hilft dir weiter
So habe ich das auch gelöst.
Finde es etwas schade, dass es hier keine offzielle Guideline gibt in welchem Namesapce man welche Sachen anlegen soll.
Namespaces sind zum einen an ein package bzw. Extension geknüpft, zum anderen an einen Vendor. Daraus ergibt sich eigentlich schon, in welchem Namespace sich etwas befinden sollte...
Für den TYPO3 Core ist der Vendor bspw. "TYPO3\CMS". Innerhalb dieses Namespaces gehören nur Core-Bestandteile hin.
The TYPO3\CMS vendor name is reserved and may not be used by extensions!
(Quelle: TYPO3 Core APIs 6.2.0)
D.h. als Programmierer solltest Du Dir einen Vendor ausdenken, den Du fortan verwendest, und der Dein Namensraum für Deine Projekte (Extension/Packages) ist.
Etwas umfangreicher als die TYPO3 Core API-Doku gehen die Guidelines von FLOW auf Namespaces ein: http://docs.typo3.org/flow/TYPO3FlowDocumentation/stable/TheDefinitiveGuide/PartV/CodingGuideLines/PHP.html
Darum geht's hier ja garnicht. Es geht um den Namensraum INNERHALB meines Vendor/ExtName-Namespaces.
also: Vendor/ExtName/###????###
Ups, ok. Dann war das Beispiel oben nur ungünstig (und darauf bin ich eher angesprungen).
Die Copy&paste-und-dann-vielleicht-nachdenk-Fraktion bastelt sich anhand solcher Schnipsel vermutlich doch gerne mal Methoden in geschützen Namensräumen.
@Julian. Interesse halber würde mich interessieren ob mein Beispiel denn grundsätzlich falsch so ist?
Hab in der verlinkten Dokumentation keine Information dazu gefunden dass ich zwingend einen eigenen Namensraum schaffen muss. Vielleicht habe ich aber auch nur etwas übersehen.
In der Doku gab es folgendes Beispiel, was meinem Vorschlag (Vendor\ExtensionName\) von oben entsprechend würde:
So a test class in EXT:foo_bar_baz/Tests/Unit/Bla/ will have as namespace \Vendor\FooBarBaz\Tests\Unit\Bla.
JBrooks schrieb
Hab in der verlinkten Dokumentation keine Information dazu gefunden dass ich zwingend einen eigenen Namensraum schaffen muss.
Die Gesetze der Logik sollten dir aber sagen, daß dies mehr als sinnvoll ist, oder nicht?
"TYPO3\ContentTeaser" ist ja nicht wirklich originell, auf die Idee kommen sicherlich auch andere.
Ok, danke für den Hinweis