Felder im TYPO3-Backend gruppieren

Mit der TYPO3-Extension Extension Kickstarter lassen sich Extensions incl. der dazu gewünschten Tabellen recht einfach anlegen. Allerdings werden alle Felder nur simpel nacheinander aufgelistet und eine echte Zusammengehörigkeit ist nicht sofort zu erkennen.

Um dem Redakteur zumindest eine kleine Hilfestellung zu geben, könnte man die Feldbeschriftungen anpassen. Dadurch lässt sich zumindest auf den zweiten Blick eine Zusammengehörigkeit erkennen.

Mit ein klein wenig Kenntnis über das „Table Configuration Array“ (TCA) kann man Felder jedoch auch sinnvoll und unverkennbar gruppieren. Wie das geht wird im Folgenden vorgestellt.

Zunächst öffnen wir die vom Extension Kickstarter angelegte Datei tca.php und suchen dort die Konfiguration für die entsprechende Tabelle. Diese sieht in stark vereinfachter Darstellung in etwa so aus:

$TCA['tx_myextension_demo'] = array (
	'types' => array (
		'0' => array('showitem' => 'hidden;;1, name, x, y, isbranch')
	),
	'palettes' => array (
		'1' => array('showitem' => 'starttime, endtime')
	)
);

Im Feld [types][0] sind alle Felder in der Reihenfolge aufgelistet, wie sie im Backend-Formular zu sehen sein werden. Im Feld [palettes][1] ist die zweite Optionspalette definiert, die dem Feld hidden über den Index 1 zugeordnet ist. Genau eine solche Optionspalette wollen wir uns, in angepasster Form, zu Nutzen machen. Zu diesem Zweck verlagern wir die Felder x, y, isbranch in eine eigene Palette.

$TCA['tx_myextension_demo'] = array (
	'types' => array (
		'0' => array('showitem' => 'hidden;;1, name, --palette--;Flash-Weltkarte;worldmap')
	),
	'palettes' => array (
		'1' => array('showitem' => 'starttime, endtime'),
		'worldmap' => array('showitem' => 'x, y, isbranch')
	)
);

Dieser geben wir der Übersichtlichkeit halber keine Zahl als Index, sondern den Namen worldmap. Zusätzlich platzieren wir in der normalen Liste aller Felder ([types][0]) ein neues Feld, das ebenfalls einer kleine Erklärung bedarf: --palette--;Worldmap;worldmap. Diese Konfiguration wird durch Semikolon in drei Bereiche unterteilt:

  • Der erste Wert --palette-- bedeutet, dass das kein reguläres Eingabefeld ist, dessen definition sich ebenfalls im TCA befindet, sondern ein Spezialfeld als Platzhalter für eine Palette.
  • Der dritte Wert worldmap ist der Index für die Palette, wie er auch im Array [palettes] auftaucht.
  • Der Zweite Konfigurations-Wert ist der angezeigte Name der Palette.

Als letzten Feinschliff geben wir der Palette noch ein Attribut canNotCollapse. Das bedeutet, dass sie nicht mit der Option „Zweite Optionspalette anzeigen“ erscheint und verschwindet, sondern immer noch zu sehen ist. Zusätzlich machen wir den Namen Übersetzbar. Das geschieht, indem wir den vorher fest eingetragenen Wert Flash-Weltkarte durch einen Verweis auf die Local-Lang ersetzen. Selbstverständlich muss in der Datei locallang_db.xml dann auch der entsprechende Eintrag vorhanden sein.

$TCA['tx_myextension_demo'] = array (
	'types' => array (
		'0' => array('showitem' => 'hidden;;1, name, --palette--;LLL:EXT:myextension/locallang_db.xml:tx_myextension_demo.worldmap;worldmap')
	),
	'palettes' => array (
		'1' => array('showitem' => 'starttime, endtime'),
		'worldmap' => array('showitem' => 'x, y, isbranch', 'canNotCollapse' => 1)
	)
);

TYPO3-Tabellen nur auf der root-Ebene

In TYPO3 ist in der Regel jeder Datensatz einer konkreten Seite zugeordnet. Das hat seinen Sinn, um Ordnung zu schaffen. Allerdings kann es in einigen Fällen auch von Nachteil sein, wenn Datensätze dadurch evtl. schwerer auffindbar sind. Abhilfe kann geschaffen werden, indem eine Tabelle nur noch für die root-Ebene (pid = 0) erlaubt wird.

Das geht ganz einfach mit einem Eintrag in der TCA der entsprechenden Tabelle, z.B. in der Datei typo3conf/extTables.php

$TCA[<tablename>]['ctrl']['rootLevel'] = 1;

Es ist aber dabei zu beachten, dass nur Backend-Benutzer mit Administrator-Rechten auf der root-Ebene arbeiten dürfen.

Tabellen nur für TYPO3-Administratoren

Im TYPO3-Backend lassen sich Tabellen mit einer simplen Zusatzkonfiguration für normale Redakteure sperren. Tabellen sind dann nur noch für Administratoren sichtbar und die Inhalte können auch nur von Administratoren bearbeitet werden.

$TCA[<tablename>]['ctrl']['adminOnly'] = 1;

Read-Only-Felder im TYPO3-Backend

In manchen Fällen ist es wünschenswert, in TYPO3 Tabellenfelder für einen BE-User bzw. Administrator zwar sichtbar zu machen, aber nicht bearbeitbar. Das funktioniert mit einer kleinen Anpassung im Table Configuration Array (TCA) der entsprechenden Tabelle.

$TCA[<tablename>]['columns'][<fieldname>]['config']['readOnly'] = 1;

Das Attribut kann auf die unterschiedlichsten Feldtypen angewendet werden. Hier ist außer einem einzeiligen und einem mehrzeiligen Textfeld sogar ein Datei-Feld auf „readOnly“ gesetzt:

Die Sinnhaftigkeit dieses Vorgehens muss natürlich in jedem Fall individuell geprüft werden. Der oben gezeigte Screenshot zeigt einen Ausschnitt aus einer Extension, die über Fronten-User-Eingaben befüllt wird. Den Backend-Usern ist es dann noch gestattet, zusätzliche Dateien anzuhängen.

Breite von Mehrfach-Auswahlboxen im TYPO3-Backend

Wer regelmäßig mit dem TYPO3-Backend arbeitet, wird auch die Auswahlboxen mit Mehrfachauswahl kennen: Rechts eine Box mit allen verfügbaren Elementen, links eine Box mit allen gewählten Elementen in der festgelegten Reihenfolge. – Eigentlich eine einfache Sache. Doch sobald die Einträge zu lang sind, werden sie automatisch abgeschnitten und lassen sich unter Umständen nicht mehr korrekt voneinander unterscheiden.

Diese Multiple-Selectboxen lassen sich jedoch mit Leichtigkeit anpassen. Dazu reichen wenige Zeilen Code, die am besten in der Datei extTables.php platziert werden. Hier am Beispiel des Feldes include_static_file der Tabelle sys_template:

t3lib_div::loadTCA('sys_template');
$TCA['sys_template']['columns']['include_static_file']['config']['selectedListStyle'] = 'width:400px';
$TCA['sys_template']['columns']['include_static_file']['config']['itemListStyle'] = 'width:400px';

Die Konfigurations-Option selectedListStyle bezieht sich auf die Liste der bereits ausgewählten Elemente, also die linke Box. Während itemListStyle die Liste aller Elemente anspricht, also die rechte Box.

Es können beliebige CSS-Informationen hinterlegt werden. Statt width könnten also ebenso Anweisungen wie min-width oder max-width hinterlegt werden. Auch Anweisungen zu Farben, Schrift etc. können hinterlegt werden. Mehrere Anweisungen lassen sich – wie bei CSS gewohnt – mit Semikolon getrennt angeben.

$TCA['sys_template']['columns']['include_static_file']['config']['itemListStyle'] = 'width:400px;font-style:italic;color:grey';

Auswahl- und Dateifelder im TYPO3-Backend mitwachsen lassen

Eigene Extensions lassen sich schnell mit dem Extension Kickstarter erstellen. Dabei lassen sich die Feldkonfigurationen schnell zusammen klicken und die entsprechende Tabellen-Konfiguration (TCA) wird automatisch erstellt. Allerdings sind über den Kickstarter nicht alle theoretisch verfügbaren Einstellungen auswählbar. Will man z.B. ein automatisch mit der Anzahl der Inhalte mitwachsendes Feld, muss man manuell nachhelfen.

Anpassen eigener Extensions

Ein Ausschnitt der Tabellen-Konfigurations-Datei tca.php, die mit dem Kickstarter erstellt wurde, könnte beispielsweise so aussehen:

$TCA['tx_myextension_table1'] = array (
	'columns' => array (
		'related' => array (
			'exclude' => 1,
			'label' => 'LLL:EXT:z7_ideaskgf/locallang_db.xml:tx_myextension_table1.related',
			'config' => array (
				'type' => 'select',
				'foreign_table' => 'tx_myextension_table2',
				'size' => 5,
				'minitems' => 0,
				'maxitems' => 100,
			)
		),
	)
);

Dabei wurde als Größe im Kickstarter der Wert 5 angegeben und als Anzahl der erlaubten Inhalte der Wert 100. Mit dieser Konfiguration können 100 Elemente ausgewählt werden, die Feldgröße bleibt jedoch bei einer Höhe von fünf Einträgen bestehen. Werden mehr als diese fünf Einträge gewählt, bleibt die Höhe trotzdem fix und die Auswahlbox erhält eine Scrollleiste.

Dieses Verhalten ist natürlich völlig in Ordnung und kann durchaus Sinn machen. In anderen Fällen kann es aber besser sein, die Auswahlbox an die Anzahl der Einträge anzupassen, um somit ohne Scrollleiste sofort alle gewählten Elemente sichtbar zu machen. Das lässt sich mit der Konfigurations-Option autoSizeMax bewerkstelligen. Diese wird in die Konfiguration des Tabellefeldes eingetragen und mit dem gewünschten Wert versehen:

$TCA['tx_myextension_table1'] = array (
	'columns' => array (
		'related' => array (
			'exclude' => 1,
			'label' => 'LLL:EXT:z7_ideaskgf/locallang_db.xml:tx_myextension_table1.related',
			'config' => array (
				'type' => 'select',
				'foreign_table' => 'tx_myextension_table2',
				'size' => 5,
				'minitems' => 0,
				'maxitems' => 100,
				'autoSizeMax' => 100,	// neu eingefügt
			)
		),
	)
);

Der Wert kann zwar beliebig gesetzt werden, er macht allerdings nur Sinn wenn er höher ist, als der bei size gesetzte Wert. Außerdem macht es Sinn, den Wert identisch mit maxitems zu setzen.

Anpassen fremder Extensions

Selbstverständlich kann diese TCA-Einstellung nicht nur auf eigene Extensions angewandt werden. Es ist auch völlig irrelevant, ob eine Extension mit dem Extension Kickstarter erstellt wurde oder nicht. Die autoSizeMax-Option kann für jedes Feld hinterlegt werden.

Dazu müssen folgende einfache Zeilen in die Datei typo3conf/extTables.php eingetragen werden. Tabellen- und Feldname, sowie der autoSizeMax-Wert sind natürlich individuell anzupassen.

t3lib_div::loadTCA('tablename');
$GLOBALS['TCA']['tablename']['columns']['fieldname']['config']['autoSizeMax'] = 20;

Typo3: TSConfig global definieren

Jeder, der schon einmal ein Multi-Tree-Projekt in Typo3 hatte, kennt das Problem. TSConfig-Konfigurationen, wie z.B. die Einstellungen des RTE-Editors oder die Anpassungen der Content-Spalten, müssen für jeden Tree in die Page TSConfig eingetragen werden. Bei einer Änderung muss die TSConfig in jedem Tree aktualisiert werden. Ähnlich sieht es mit der User TSConfig aus. Hier kann zwar theoretisch eine BE-Benutzergruppe mit der Konfiguration erstellt werden. Aber diese muss dann auch erstmal jedem Benutzer zugewiesen werden. Wenn das bei einem Benutzer vergessen wird, erhält dieser die Konfiguration nicht.

Die Lösung dieses Problems liegt darin, die TSConfig in die Datei extTables.php auszulagern.

Für die User TSConfig sieht das so aus …

t3lib_extMgm::addUserTSConfig('
	# enter your
	# configuration
	# here
');

… und für die Page TSConfig so:

t3lib_extMgm::addPageTSConfig('
	# enter your
	# configuration
	# here
');

Alle hier eingetragenen TSConfig-Einstellungen sind in ganzen Typo3-Projekt gültig. Unabhängig vom Benutzer, von der Seite und vom Seitenbaum.