TYPO3 verwendet für das Rendern von Formularelemente im BE die Klasse t3lib_TCEforms. Diese kann dir grundsätzlich auch in deinen eigenen Modulen diese Felder zur Verfügung stellen. Leider ist die Bedienung der Klasse nicht ganz einfach, weil es ne Menge externe Abhängigkeiten gibt. #paralyzed#
So erstellst du eine Instanz:
$form = t3lib_div::makeInstance('t3lib_TCEforms');
$form->initDefaultBEmode();
$form->backPath = $BACK_PATH;
Dann muss etwas JS-Code in den Content:
$content .= $form->printNeededJSFunctions_top();
Jetzt wird es tricky. Der Datensatz, den du darstellen willst, muss aus der DB geladen und richtig vorbereitet werden. Die Vorbereitung ist z.B. für Selectboxen mit MM-Relationen notwendig. Da steht ja im Record selbst nur die Anzahl der Relationen drin. Für die Auswahlbox braucht es aber die aufgelösten Relationen. Aber TYPO3 hat auch dafür was vorbereitet, man muss es nur wissen. 🙂 Am besten verwendest du diese Methode:
function getTCEFormArray($table,$theUid, $isNew = false) {
$trData = t3lib_div::makeInstance('t3lib_transferData');
$trData->addRawData = TRUE;
$trData->fetchRecord($table,$theUid,$isNew?'new':''); // 'new'
reset($trData->regTableItems_data);
return $trData->regTableItems_data;
}
Damit ausgestattet, kannst du so den Record vorbereiten:
$dataArr = $this->getTCEFormArray($table, $uid);
$table ist ein String mit dem Tabellennamen und $uid natürlich die UID des Records.
Und jetzt können wir schon das Feld generieren lassen:
$field = $form->getSoloField($table,$dataArr[$table.'_'.$uid],$fieldname);
Der Key im $dataArr wird also aus Tabellennamen und UID zusammengesetzt. Und bei $fieldname setzt du einfach das gewünscht Feld rein. Die tceForms schaut jetzt automatisch in der TCA nach der Konfiguration für das Feld und liefert den fertigen HTML-Code.
Jetzt sind wir fast fertig. Es fehlt nur noch etwas Javascript:
$content .= $form->printNeededJSFunctions();
Wenn ich nichts vergessen habe, dann sollten sich damit alle Felder, die in der TCA beschrieben sind, rendern lassen. 🙂
Falls JS-Fehler kommen, weil irgendwelche JS-Bibliotheken fehlen, dann sollten diese über die template-Instanz geladen werden:
$this->doc->loadJavascriptLib('contrib/prototype/prototype.js');
Ab TYPO3 4.2 muss man übrigens immer die Template-Instanz aus der globalen Variable $GLOBALS['TBE_TEMPLATE'] verwenden. Wenn man sie selbst anlegt, streikt die t3lib_TCEforms. Dort darf auch folgender Aufruf am Ende des Moduls nicht fehlen:
$content = $this->doc->insertStylesAndJS($content);
Leider macht es einem TYPO3 nicht gerade einfach "systemkonform" im BE zu programmieren. Wer schön, wenn das mal in einem Buch beschrieben würde, ich hab da aber so meine Zweifel. 😉