TYPO3: Eigene Labels mit label_userFunc
Wer eigene Extensions in TYPO3 programmiert, kennt das Problem: Man erstellt eigene Datenbanktabellen, die über das Backend befüllt werden können. Dort kann man diese Einträge dann über die Listenansicht bewundern bzw. ändern. Ein Label gibt Auskunft über den jeweiligen Datensatz. Was aber, wenn der Label aus mehreren Einträgen bestehen soll?
Lösung 1: label_alt
Die einfache Lösung bis Typo 4.0 ist folgende: Man ergänzt die Daten ext_tables.php um zwei Zusätzliche Einträge für die TCA:
$TCA["..."] = array (
...
"ctrl" => array (
'title' => 'LLL:EXT:...',
'label' => 'ersterlabel',
'label_alt' => 'zweiterlabel, dritterlabel',
'label_alt_force' => 1,
...
);
Die Ausgabe wäre dann “ersterlabel, zweiterlabel, dritterlabel”.
Praktisch ist natürlich dann auch, wenn man den Eintrag default_sortby entsprechend ebenfalls sortieren lässt:
'default_sortby' => "ORDER BY ersterlabel, zweiterlabel, dritterlabel",
Lösung 2: label_userFunc
Was aber nun, wenn die Label in einer anderen Tabelle stehen oder aus einem Dropdown kommen sollen, das ja nur Int-Werte enthält? Seit TYPO3 -Version 4.1 steht dafür eine Funktionalität bereit. Ich werde den zweiten Fall (Dropdown) beschreiben, die Abfrage einer anderen Tabelle ist recht ähnlich, vielleicht sogar einfacher.
Folgende Annahmen werden getroffen:
- Ich habe ein Dropdown/eine Checkbox o.ä. über den Kickstarter eingerichtet.
- Die Labels des Dropdowns, o.ä. stehen damit in locallang_db.xml.
So, als erstes müssen wir eine Erweiterungsfunktion bereit stellen, die die Ausgabe dann übernimmt. Dazu erweitern wir ext_tables.php um folgende Zeilen:
//Custom Labels
require_once(t3lib_extMgm::extPath($_EXTKEY).'class.userLabelClass.php');
// enable label_userFunc only for TYPO3 v 4.1 and higher
if (t3lib_div::int_from_ver(TYPO3_version) >= 4001000) {
$TCA['tx_makmeister_meister']['ctrl']['label_userFunc'] =
"user_LabelClass->getUserLabel";
}
Wichtig hier, dass der Klasse user_ vorangestellt wird – ansonsten ignoriert Typo3 den Methodenaufruf!
So, nun benötigen wir noch die Klasse. Dazu legen wir eine Datei class.userLabelClass.php im selben Verzeichnis wie ext_tables.php an:
< ?
require_once(PATH_t3lib.'class.t3lib_befunc.php');
class user_LabelClass {
function getUserLabel(&$params, &$pObj) {
$id = $params['row']['uid']; //aktuelle uid
$mylabel = $params['row']['[ERSTERLABEL]']; //wie oben holen wir uns den ersten Label
if ($id) { //zur Sicherheit... $item = t3lib_BEfunc::getRecord('[TABELLENAME]', $id); //uid aus Tabelle holen $label = $GLOBALS['LANG']->sL('LLL:EXT:[EXTKEY]/locallang_db.xml:[XMLFRAGMENT].'.$item['[DROPDOWNWERT]']);
} else $label = '[Fehler!]';
$params['title'] = $mylabel.', '.$label;
}
}
?>
Folgende Werte müssen noch ersetzt werden:
- [ERSTERLABEL] steht für den ersten Label, z.B. Titel, Jahr, etc.
- [TABELLENAME] ist der Tabellenname.
- [EXTKEY] ist der Extension Key, den man angegeben hat, also z.B. user_myext.
- [XMLFRAGMENT] ist der Teil der Dropdown-Einträge in der Datei locallang_db.xml ohne Nummer. Wenn die Einträge also user_myext.dropdown.I.0,1,2… heißen, dann ist dieser Eintrag “user_myext.dropdown.I.”.
- [DROPDOWNWERT] ist der Spaltenname des Wertes in der Datenbanktabelle.
Damit sollte dann alles klappen!
- 12 Kommentare
Danke!
gute info, danke,
aber bitte im php-code das
Danke...
"kleiner-als fragezeichen" meinte ich ;-) php-open-tag
Stimmt!
Stimmt, habe ich geändert...
cool
cool. Danach habe ich schon des öfteren gesucht.
Danke
super
super, danke für die 1a funktionierende erklärung!
Ich raffs nicht...
Hallo,
ich habe jetzt schon einige Beispiele für eigene Labels gefunden. So auch dieses hier. Leider hab ich nirgends eins gefunden welches ich verstanden habe. Mein Problem, Datensätze im Backend anzeigen mit 2 Labels aus 2 verschiedenen Datenbankrelationen, also auch aus 2 verschiedenen Tabellen. Das beste was ich gefunden hatte war dieses hier: http://wiki.innovations.at/bin/view/Knowledge/Typo3ExtensionEntwicklungLabelslabel_userfunc
Allerdings hab ich es damit auch nicht hinbekommen.
Habe die Klasse eingebunden und meine Tabellennamen eingesetzt. Leider weiß ich nicht, wo ich die Spaltennamen der jeweiligen Tabelle eintrage, aus der das Label kommt.
Vielleicht hat ja hier jemand einen Hinweis für mich.
Hallo
Hallo,
danke, das tut hat mir wirklich sehr geholfen. Gibt es auch ein solches Tutorial, wo erklärt wird, wie man in seinen eigenen Extensions eigene bzw. andere PHP-Klassen einbinden kann und wo dann die ganzen Typo3-Funktionen zur Verfügung steht?
Re: hallo
Hallo, Webagentur,
ja, solche Tutorials gibt es. sk-typo3.de ist meiner Ansicht nach eine der besten deutschen Seiten zum Thema. Extensionprogrammierung kann man auf folgender Seite finden:
http://www.sk-typo3.de/PHP-Extensionprogrammierung.140.0.html
Max.
Korrektur!
Zitat: “Wichtig hier, dass der Klasse user_ vorangestellt wird – ansonsten ignoriert Typo3 den Methodenaufruf!”
Diese Aussage stimmt nicht. Der Klassenname kann ganz normal gestaltet werden. Also auch tx_extkey_klasse. Wichtig ist nur, daß die PHP Datei vorher per require korrekt eingebunden wird.
Ansonsten ein sehr schönes Tutorial. Vielen Dank!
Re: Korrektur!
Danke für die Anmerkung!
Toll!
Ausgezeichnet, tolles Thema für einen Blog.
Danke
Dankeschön, der Beitrag hat mir sehr geholfen.