IRRE...
...bedeutet nicht, dass jemand in einer Gummizelle steht und mit Medikamenten vollgestopft wird, nein das ist die geniale Einrichtung in Typo3 seine 1:n Verbindungen inline zu verwalten (Inline Relational Record Editing)
Um das aber zu realisieren gibt es einiges zu beachten, der Anfang ist wie so oft bei Typo3 einfach, aber der Schluss, jeder der Typo3 macht, weiss was ich meine.
ext_tables.sql
Klar, wir wollen ja was in die DB schreiben, also fügen wir unser Feld da hinzu:
CREATE TABLE tt_content (
tx_myext_irre text,
tx_myext_irre_parentid int(11) DEFAULT '0' NOT NULL,
tx_myext_irre_parenttable tinytext NOT NULL,
KEY myext (tx_myext_irre_parentid,sorting)
);
ext_tables.php
Im Backend muss das "Feld" eingebunden werden, das macht man wie immer im ext_tables.php, einfach das Feld im TCA definieren:
$tempColumns = array(
'tx_myext_irre' => Array (
'exclude' => 1,
'label' => 'LLL:EXT:myext/locallang_db.xml:tt_content.tx_myext.irre',
'config' => array (
'type' => 'inline',
'foreign_table' => 'tt_content',
'foreign_field' => 'tx_myext_irre_parentid',
'foreign_table_field' => 'tx_myext_irre_parenttable',
'maxitems' => 1000,
'appearance' => array(
'showSynchronizationLink' => FALSE,
'showAllLocalizationLink' => FALSE,
'showPossibleLocalizationRecords' => FALSE,
'showRemovedLocalizationRecords' => FALSE,
'expandSingle' => TRUE,
'newRecordLinkAddTitle' => TRUE,
'useSortable' => TRUE,
),
'behaviour' => array(
),
)
),
);
t3lib_div::loadTCA('tt_content');
t3lib_extMgm::addTCAcolumns('tt_content', $tempColumns, 1);
$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1'] = 'tx_myext_irre';
Die möglichen Einstellungen in config.appearance können im IRRE-Tutorial nachgeslesen werden.
Aber jetzt...
...kommts, wir verwenden im tt_content eine Relation zu tt_content!
Wenn ich nun einen IRRE-Datensatz erstelle, dann wird dieser Content auf der Seite abgespeichert, auf der auch mein Parent liegt, das führt natürlich zu doppelter Anzeige, denn die Page wird automatisch alle tt_content's rendern.
Was tun?
Typo3 währe nicht Typo3, wenn es keine HOOKS geben würde, und genau das ist der Ansatz für die Manipulation die wir jetzt machen, wir werden alle IRRE-Datensätze von unserer Erweiterung abfangen und umleiten.
ext_localconf.php
Wir registrieren zuerst den HOOK in der ext_localconf.php:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][$_EXTKEY] = 'EXT:'.$_EXTKEY.'/lib/class.tx_myext_tcemain.php:&tx_myext_tcemain';
lib/class.tx_myext_tcemain.php
Damit alles funktioniert benötigen wir auch die Datei die den Ensprechenden HOOK beinhaltet:
<?php
class tx_myext_tcemain
{
public function processDatamap_preProcessFieldArray(array &$incomingFieldArray, $table, $id, t3lib_TCEmain &$pObj) {
if ($incomingFieldArray['list_type'] != 'myext_pi1') {
if (is_array($pObj->datamap['tt_content'])) {
foreach ($pObj->datamap['tt_content'] as $key => $val) {
if ($val['list_type'] == 'myext_pi1') {
// Change the colPos of the IRRE tt_content values
$incomingFieldArray['colPos'] = 93;
// Workaround for templavoila
if (t3lib_extMgm::isLoaded('templavoila')) {
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tx_templavoila_tcemain']['doNotInsertElementRefsToPage'] = TRUE;
}
}
}
}
}
}
}
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/myext/lib/class.tx_myext_tcemain.php']) {
include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/myext/lib/class.tx_myext_tcemain.php']);
}
?>
Hier wird nun vor dem Speichern des Datensatzes (IRRE oder Parent) überprüft, ob es sich um einen tt_content im IRRE meiner EXT handelt. In diesem Fall wird der Wert im Feld colPos auf "93" angepasst.
WICHTIG ist, dass man sich vor Augen hällt, dass dieser HOOK JEDESMAL beim Speichern eines Datensatzes durchgelaufen wird, bei jedem Datentyp in Typo3!
Unschön dabei ist, ...
...dass die neue Spalte nicht bekannt ist, und so beim Editieren der Einträge in den Columns die Information steht "[ INVALID VALUE ("93") ]" das kann man aber umgehen in dem man die Spalte 93 registriert und das macht man wo?
Genau in der
ext_tables.php
if (TYPO3_MODE == 'BE') {
if (! isset($TCA['tt_content']['columns']['colPos']['config']['items'][93])) {
// Add the new colPos to the array, only if the ID does not exist...
$TCA['tt_content']['columns']['colPos']['config']['items'][93] = array ($_EXTKEY.'||'.$_EXTKEY.'||||||||', 93);
}
}
Und schon heisst die colPos 93 "myext"
Was fehlt?
Das be_layout macht uns durch den Workaround einen Strich, leider habe ich bis jetzt nicht herausgefunden wie ich bei Konfiguriertem be_layout den "[ INVALID VALUE ("93") ]" ersetzen kann, das einzige mir bekannte ist, dass man die colPos 93 im be_layout ebenfalls konfiguriert.
Vielleicht weiss auch jemand da draussen in den Weiten des Internets, wie man das Feld colPos selektiv im IRRE deaktivieren kann, dann schreibt mir einen Kommentar mit der Lösung, Bitte!
Die Lösung ist eigentlich ganz einfach:
Man muss dem Backendlayout sagen, dass lediglich zwei Zeilen vorhanden sind, konfigurieren tut man dann aber drei Zeilen:
backend_layout {
colCount = 4
rowCount = 2
rows {
1 {
columns {
1 {
name = Left
colPos = 1
}
2 {
name = Main
colspan = 3
colPos = 0
}
}
}
2 {
columns {
1 {
name = Footer
colspan = 4
colPos = 3
}
}
}
3 {
columns {
1 {
name = myext
colspan = 4
colPos = 93
}
}
}
}
}
Man beachte backend_layout.rowCount = 2 und backend_layout.rows.3
So ist zwar die Spalte "myext" im Dropdown vorhanden wird aber in den Columns nicht angezeigt, der Nachteil dabei ist, dass man diese "Versteckte" Spalte im Editor des BackendLayouts nicht sieht und wenn man das BackendLayout im Editor speichert geht diese Zeile verlohren...

