CMS-Jack
Blog
Blog - Neues passiert
typo3javascriptjqueryimagecyclejfmulticontentlinuxcsssuexect3blogfastcgisexybookmarkspowermaildebianapacheimagecarouselt3jqueryfehlermac ostastaturcoin-slidernagioshtmlrtepagetypeimage cyclefirefoxsnippetanalysepatchjfcloudzoomxhtmltabscloudeffektcross-slideriossdkiphonexcodeirrejfimageflowbackenstylehooksbackendtyposcriptfadegrafikurljquery uithemerollerfollow mebildergalerieimageflow

Aug
20

Typo3 IRRE

Typo3
Gravatar: Jürgen Furrer

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...

Tags: typo3, irre, hooks
Views: 591

Zurück