19.02.2008 | Alter: 7 Jahre

Backend: Default-Werte per TSConfig setzen

Von: Irene Höppner

Inzwischen ist es möglich, TCA-Einstellungen per TSconfig zu überschreiben. Diese Möglichkeit ist allerdings auf wenige Eigenschaften begrenzt. Durch Nutzung eines Hooks in der Klasse t3lib_tceforms lassen sich die Möglichkeiten erweitern.

Wie man diesen Hook nutzen kann, zeigen wir hier an einem Beispiel.

Es geht um eine Universitätswebseite. Dort haben z.B. die Professoren eigene Bereiche im Seitenbaum. Grundsätzlich soll in einem Professoren-Unterbaum der Professor als Autor jeder Seite eingetragen werden. Es soll aber für einzelne Seiten auch möglich sein, einen anderen Autor zu benennen. Daher wird das Feld "Autor" im Seitenheader verwendet (Feld author in der Tabelle pages).

Im TCA die Eigenschaft default zu setzen, ist also keine Option, da diese von der Position im Seitenbaum abhängt. Der nächste Gedanke ist, das TCA per TSconfig zu überschreiben - in den aktuellen TYPO3-Versionen ist das ja möglich. Ein Blick in die Doku [1] zeigt aber, dass für Felder vom Typ input nur die Eigenschaften size und max überschrieben werden können.

Also bleibt nichts anderes übrig, als in der Klasse selber nach zu schauen, ob es einen Hook gibt oder wir schlimmstenfalls eine XCLASS verwenden müssen. Interessant ist die Klasse t3lib_tceforms (zu finden in der Datei t3lib/class.t3lib_tceforms.php). In der Funktion getSingleField() werden wir fündig. Gleich zu Beginn gibt es einen Hook für ein preprocessing, der vielversprechend aussieht.

Wir schauen aber zunächst weiter in der Funktion, wo und vor allem wie der Wert für ein Feld gesetzt wird. Dabei finden wir folgende Code-Zeile:

$PA['itemFormElValue']=$row[$field];

Wir müssen also die Variable $row für unser Feld manipulieren. Zum Glück wird sie der Hookfunktion übergeben:

   // Hook: getSingleField_preProcess
foreach ($this->hookObjectsSingleField as $hookObj) {
   if (method_exists($hookObj,'getSingleField_preProcess')) {
    $hookObj->getSingleField_preProcess($table, $field, $row, $altName, $palette, $extra, $pal, $this);
   }
}

Also binden wir den Hook ein. Für Änderungen am Backend gibt es bereits eine projektspezifische Extension mit dem Extensionkey acad_ue_be. Im Extension-Verzeichnis legen wir nun die Datei für unseren Hook an:

hooks/class.tx_acaduebe_tceforms_preprocsf.php

Den Dateinamen und Ort können wir in der Extension frei wählen, der Dateiname sollte jedoch wie die Klasse lauten und diese sollte den Extensionkey enthalten, um sicher zu stellen, dass es keine Namensgleichheiten mit anderen Extensions oder dem Core gibt.

Die Datei füllen wir zunächst mit dem Rumpf für unseren Hook mit einem Debug-Aufruf:

class tx_acaduebe_tceforms_preprocsf {
 function getSingleField_preProcess($table, $field, &$row, $altName, $palette, $extra, $pal, $pObj) {
  debug('drin','_abz_',__LINE__, __FILE__,5);
 }
}

Den Klassennamen können wir selber wählen, Funktionsname und Parameter werden vom Aufruf des Hooks vorgegeben. Bei den Parametern wählen wir einfach die gleichen Namen wie beim Funktionsaufruf im Hook, lediglich den letzten Parameter ($this) müssen wir umbenennen (in $pObj für parent object), da wir sonst im Hook nicht auf das t3lib_tceforms-Objekt, sondern auf das Objekt unserer Klasse verweisen würde (was PHP ab Version 5 übrigens mit einem PHP-Error quittiert). Außerdem übergeben wir die Variable $row als Referenz, da wir diese ja in dem t3lib_tceforms-Objekt verändern wollen.

Nun müssen wir den Hook noch registrieren, damit er auch aufgerufen wird. Dazu schreiben wir die folgende Zeile in die Datei ext_localconf.php unserer Extension:

$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'][] = 'EXT:acad_ue_be/hooks/class.tx_acaduebe_tceforms_preprocsf.php:tx_acaduebe_tceforms_preprocsf';

Jetzt noch den configuration cache leeren und eine neue Seite im Backend anlegen. Der Debug-Output ist zu sehen, also können wir das debug-Statement durch den benötigten Quelltext ersetzen:

function getSingleField_preProcess($table, $field, &$row, $altName, $palette, $extra, $pal, $pObj) {
   // get TSconfig-settings for the field
  $fieldTSconfig = $pObj->setTSconfig($table,$row,$field);
  // set the default-value only, if some TSconfig is set and the field ist still empty
   // take care: this does NOT override the TCA. If there is a default-setting in the TCA, you have to remove that first.
  if($row[$field]==='' && $fieldTSconfig['config.']['default']) {
   $row[$field] = $fieldTSconfig['config.']['default'];
  }
}

Und natürlich eine entsprechende TSconfig-Einstellung vornehmen:

TCEFORM.pages.author.config.default = blubb flupp

Achtung: Auf diese Weise wird ein default-Wert, der per TCA gesetzt wurde, nicht überschrieben! Gibt es einen solchen, müssen Sie an dieser Stelle zunächst aus dem TCA entfernen.

Hooks sind in Abschnitt 5.9.3 des TYPO3 Profihandbuchs beschrieben. Informationen zu TSconfig finden Sie in den Abschnitten 3.2.4, 4.2 und 6.4.11.

Ein Versionshinweis: Dieser Artikel wurde auf Basis von TYPO3 4.2 Revision 3236 geschrieben.

[1] TSconfig-Doku TCEFORM: http://typo3.org/documentation/document-library/references/doc_core_tsconfig/4.1.0/view/1/3/#id3541144