| 
17.08.2007
 | 
13:45

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!

  •  
  • 14 Kommentare
  •  
Gravatar: fuxifuxi
13.04.2008
22:26

Danke!

gute info, danke,
aber bitte im php-code das

Gravatar: fruxifruxi
13.04.2008
22:26

Danke...

"kleiner-als fragezeichen" meinte ich ;-) php-open-tag

Gravatar: maxmax
14.08.2008
07:41

Stimmt!

Stimmt, habe ich geändert...

Gravatar: semidarksemidark
11.09.2008
11:43

cool

cool. Danach habe ich schon des öfteren gesucht.
Danke

Gravatar: tmtm
01.10.2008
08:59

super

super, danke für die 1a funktionierende erklärung!

Gravatar: KarstenKarsten
26.12.2010
18:16

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.

Gravatar: WebagenturWebagentur
18.11.2008
13:14

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?

Gravatar: MaxMax
18.11.2008
13:29

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.

Gravatar: DigedagDigedag
11.02.2009
12:57

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!

Gravatar: MaxMax
11.02.2009
17:18

Re: Korrektur!

Danke für die Anmerkung!

Gravatar: Elisabeth MersnikElisabeth Mersnik
11.10.2009
21:55

Toll!

Ausgezeichnet, tolles Thema für einen Blog.

Gravatar: Markus GüntherMarkus Günther
25.08.2010
12:36

Danke

Dankeschön, der Beitrag hat mir sehr geholfen.

Gravatar: LukasLukas
17.10.2012
12:16

Labels für Content Elemente in Spaltenansicht ändern

Hallo,



danke für das gute Tutorial. Mithilfe deiner Anleitung habe ich es hinbekommen die Labels für die Content Elemente in der Listenansicht (also Ansicht als Datensätze) zu ändern. Leider sehe ich aber in der Spalten Ansicht nach wie vor den Inhalt der Felder Header und Bodytext in den Labels. Weiß zufällig jemand wie man auch diese Felder über eine Userfunc o.ä. überschreiben kann ??



viele Grüße,

Lukas

Gravatar: ZenZen
03.07.2013
14:46

Agentur Typo3 Programmierung

Thanks for the tutorial.I got a good descriptive core information on Typo3 Programming. Keep Posting .

Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück