Typo3 Extensions mit Extbase und Fluid – All Featured Extension | Das Model – TCA

Nun kommen wir noch zum letzten Schritt in unserer Model Gestaltung. Wir integrieren unseren Datensatz in das TCA, um es in das Gesamt-Gefüge des Typo3 Systems einzubinden. Wir beginnen die Einbindung in unserer ext_tables.php. Hier fügen wir die TCA Definition unserer Models in den Typo3 Global Array ein.

$GLOBALS['TCA']['tx_tut23bandagenda_domain_model_tut23band'] = array(
	'ctrl' => array(
		'title'	=> 'Band',
		'label' => 'titel',
		'tstamp' => 'tstamp',
		'crdate' => 'crdate',
		'cruser_id' => 'cruser_id',
		'dividers2tabs' => TRUE,

		'versioningWS' => 2,
		'versioning_followPages' => TRUE,

		'languageField' => 'sys_language_uid',
		'transOrigPointerField' => 'l10n_parent',
		'transOrigDiffSourceField' => 'l10n_diffsource',
		'delete' => 'deleted',
		'enablecolumns' => array(
			'disabled' => 'hidden',
			'starttime' => 'starttime',
			'endtime' => 'endtime',
		),
		'searchFields' => 'titel,description,images,categories,sort_order,',
		'dynamicConfigFile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($_EXTKEY) . 'Configuration/TCA/Tut23band.php',
		'iconfile' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_tut23bandagenda_domain_model_tut23band.gif'
	),
);

Die TCA Konfiguration kennen wir bereits. Doch neu ist, dass wir hier eine eigene Datensatz Struktur gewählt haben, die wir auch für das TCA dementsprechend definieren müssen. Um die Übersicht zu bewahren lagern wir diese über ‚dynamicConfigFile‘ der ‚ctrl‘ Sektion in eigene Datei namens Tut23Band.php in den Extension Ordner Configuration/TCA/ aus.

Der Aufbau unseres TCA beginnt mit der ‚ctrl‘ Sektion, die wir bereits in der ext_tables.php definiert haben und hier direkt übernehmen.

'ctrl' => $GLOBALS['TCA']['tx_tut23bandagenda_domain_model_tut23band']['ctrl'],

Gefolgt von der ‚interface‘ Sektion, in der wir die anzuzeigenden Felder definieren.

	'interface' => array(
		'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, titel, description, images, categories, sort_order',
	),

Der Bereich ‚types‘ => 0 => ’showitem‘ erzeugt nun das Typo3 Backend Eingabe Formular. Hier werden alle Eingabe Felder, sowie die Anordnung in der Reihenfolge und der Tabs definiert. Gegebenenfalls werden hier auch Elemente aus der ‚pallettes‘ Sektion mit eingebunden. Die Tabs werden über den Trenner ‚–div–‚ eingeleitet. Wie bekannt werden die Feld Defintionen sehr einfach über Feld-Name;Feld-Label sowie weiter Feldeigenschaften Semikolon getrennt notiert.

	'types' => array(
		'1' => array('showitem' => 'titel, description, images, --div--;Genres, categories, --div--;Lokalisierung, sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, --div--;Zugriff, hidden;;1, starttime, endtime'),
	),

Nun müssen alle Formlar Felder für den TCA konfiguriert werden. Dies geschieht in der ‚columns‘ Sektion. Jedes Feld wird als Arary mit Feldnamen als Array Key eingefügt. Der Array selbst ist auch wieder in fest vorgegebene Sektionen unterteilt. Hier das ganze am Beispiel des Band-Namens den wir das Datenbank Feld ‚titel‘ zugeordnet haben:

		'titel' => array(
			'exclude' => 1,
			'label' => Band Name',
			'config' => array(
				'type' => 'input',
				'size' => 30,
				'eval' => 'trim'
			),
		),

Der ‚exclude‘ Parameter sagt über das gestzte true aus, dass das Feld nur von Backend-Usern bearbeitet werden kann. ‚label‘ ist wie von HTML gewohnt der Label Tag des Input-Feldes, welches wir über ‚config‘ als input type text mit weiteren Eigenschaften definieren. Die verschiedenen Formular-Feld Konfigurationen kann man in der Typo3 Dokumentation nachlesen.

Nachdem kurzen Ausflug in den Aufbau nun unsere gesamte TCA-Konfiguration, die wir in der Datei Tut23Band.php speichern.

<?php
if (!defined ('TYPO3_MODE')) {
	die ('Access denied.');
}

$GLOBALS['TCA']['tx_tut23bandagenda_domain_model_tut23band'] = array(
	'ctrl' => $GLOBALS['TCA']['tx_tut23bandagenda_domain_model_tut23band']['ctrl'],
	'interface' => array(
		'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, titel, description, images, categories, sort_order',
	),
	'types' => array(
		'1' => array('showitem' => 'titel, description, images, --div--;Genres, categories, --div--;Lokalisierung, sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, --div--;Zugriff, hidden;;1, starttime, endtime'),
	),
	'palettes' => array(
		'1' => array('showitem' => ''),
	),
	'columns' => array(

		'sys_language_uid' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.language',
			'config' => array(
				'type' => 'select',
				'foreign_table' => 'sys_language',
				'foreign_table_where' => 'ORDER BY sys_language.title',
				'items' => array(
					array('LLL:EXT:lang/locallang_general.xlf:LGL.allLanguages', -1),
					array('LLL:EXT:lang/locallang_general.xlf:LGL.default_value', 0)
				),
			),
		),
		'l10n_parent' => array(
			'displayCond' => 'FIELD:sys_language_uid:>:0',
			'exclude' => 1,
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.l18n_parent',
			'config' => array(
				'type' => 'select',
				'items' => array(
					array('', 0),
				),
				'foreign_table' => 'tx_tut23bandagenda_domain_model_tut23band',
				'foreign_table_where' => 'AND tx_tut23bandagenda_domain_model_tut23band.pid=###CURRENT_PID### AND tx_tut23bandagenda_domain_model_tut23band.sys_language_uid IN (-1,0)',
			),
		),
		'l10n_diffsource' => array(
			'config' => array(
				'type' => 'passthrough',
			),
		),

		't3ver_label' => array(
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel',
			'config' => array(
				'type' => 'input',
				'size' => 30,
				'max' => 255,
			)
		),

		'hidden' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
			'config' => array(
				'type' => 'check',
			),
		),
		'starttime' => array(
			'exclude' => 1,
			'l10n_mode' => 'mergeIfNotBlank',
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime',
			'config' => array(
				'type' => 'input',
				'size' => 13,
				'max' => 20,
				'eval' => 'datetime',
				'checkbox' => 0,
				'default' => 0,
				'range' => array(
					'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
				),
			),
		),
		'endtime' => array(
			'exclude' => 1,
			'l10n_mode' => 'mergeIfNotBlank',
			'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime',
			'config' => array(
				'type' => 'input',
				'size' => 13,
				'max' => 20,
				'eval' => 'datetime',
				'checkbox' => 0,
				'default' => 0,
				'range' => array(
					'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
				),
			),
		),

		'titel' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:tut23bandagenda/Resources/Private/Language/locallang_db.xlf:tx_tut23bandagenda_domain_model_tut23band.titel',
			'config' => array(
				'type' => 'input',
				'size' => 30,
				'eval' => 'trim'
			),
		),
		'description' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:tut23bandagenda/Resources/Private/Language/locallang_db.xlf:tx_tut23bandagenda_domain_model_tut23band.description',
			'config' => array(
				'type' => 'text',
				'cols' => 40,
				'rows' => 15,
				'eval' => 'trim'
			)
		),
		'images' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:tut23bandagenda/Resources/Private/Language/locallang_db.xlf:tx_tut23bandagenda_domain_model_tut23band.images',
			'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
				'images',
				array('maxitems' => 1),
				$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
			),
		),
		'categories' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:tut23bandagenda/Resources/Private/Language/locallang_db.xlf:tx_tut23bandagenda_domain_model_tut23band.categories',
			'config' => array(
				'type' => 'input',
				'size' => 30,
				'eval' => 'trim'
			),
		),
		'sort_order' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:tut23bandagenda/Resources/Private/Language/locallang_db.xlf:tx_tut23bandagenda_domain_model_tut23band.sort_order',
			'config' => array(
				'type' => 'input',
				'size' => 4,
				'eval' => 'int'
			)
		),

	),
);

Es sei darauf hingewiesen, dass hier alle Labels, schon als Multi Lingual angelegt sind. Dafür wird eine .xlf Datei benötigt, auf die wir auf bekanntem Wege über LLL:EXT: und dem jeweiligen Pfad zur Datei referenzieren sowie dann den Identifier für die Übersetzung ansprechen.

Die komplette Referenz aller Elemente und des allgemeinen Aufbaus des TCA kann man in der Typo3 Dokumentation nachlesen.

Zum diesem Thema habe ich in diesem Bock auch ein kleines Tutorial geschrieben, das man hier findet. Der Vollständigkeit halber hier das Listing der Extension Sprachdatei locallang_db.xlf, die im Ordner Ressources/Private/Language liegt.

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
	<file source-language="en" datatype="plaintext" original="messages" date="2014-12-10T22:03:38Z" product-name="tut23bandagenda">
		<header/>
		<body>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band">
				<source>Band</source>
			</trans-unit>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band.titel">
				<source>Band Name</source>
			</trans-unit>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band.description">
				<source>History</source>
			</trans-unit>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band.images">
				<source>Images</source>
			</trans-unit>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band.categories">
				<source>Genres</source>
			</trans-unit>
			<trans-unit id="tx_tut23bandagenda_domain_model_tut23band.sort_order">
				<source>Sort Order</source>
			</trans-unit>
		</body>
	</file>
</xliff>