Datensätze über TYPO3 Backend-Modul anlegen

Wenn man über ein Backend-Modul Datensätze anlegt oder ändert, sollte man nicht einfach selber eine INSERT-Query schreiben, sondern die Funktionalität von TYPO3 nutzen. Nach langer Einarbeitung in den TYPO3 Code und vielen Versuchen bin ich auf die recht simple Lösung gekommen:

class.lib_handleRecords.php

/**
 * Functions to handle records in BE modules
 *
 * @author Sven Burkert (sventb@googlemail.com)
 */
class lib_handleRecords {
	/**
	 * Insert new record
	 *
	 * @param string $table: table of new record
	 * @param array $fieldValues: values to insert, key is column of value
	 */
	public function lib_record_insert($table, array $fieldValues) {
		$datamap = array($table => array(uniqid('NEW') => $fieldValues));
		$this->lib_record_process($datamap);
	}
 
	/**
	 * Update existing record
	 *
	 * @param string $table: table of update record
         * @param integer $uid: uid of update record
         * @param array $fieldValues: values to update, key is column of value
	 */
	public function lib_record_update($table, $uid, array $fieldValues) {
		$datamap = array($table => array($uid => $fieldValues));
		$this->lib_record_process($datamap);
	}
 
	/**
	 * Delete a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of delete record
	 */
	public function lib_record_delete($table, $uid) {
		$this->lib_record_process(array(), array($table => array($uid => array('delete' => true))));
	}
 
	/**
	 * Undelete a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to restore
	 */
	public function lib_record_undelete($table, $uid) {
		$this->lib_record_process(array(), array($table => array($uid => array('undelete' => true))));
	}
 
	/**
	 * Move a record (to another page)
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to move
	 * @param integer $pid: new (parent) page id for record (column "pid"). Prefix it with minus (-) to move it after this record.
	 */
	public function lib_record_move($table, $uid, $pid) {
		$this->lib_record_process(array(), array($table => array($uid => array('move' => $pid))));
	}
 
	/**
	 * Copy a record (to another page)
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record to copy
	 * @param integer $pid: new (parent) page id for record (column "pid"). Prefix it with minus (-) to move it after this record.
	 */
	public function lib_record_copy($table, $uid, $pid) {
		$this->lib_record_process(array(), array($table => array($uid => array('copy' => $pid))));
	}
 
	/**
	 * Localize a record
	 *
	 * @param string $table: table of record
	 * @param integer $uid: uid of record (default language) to localize
	 * @param integer $languageId: id of new language
	 */
	public function lib_record_localize($table, $uid, $languageId) {
		$this->lib_record_process(array(), array($table => array($uid => array('localize' => $languageId))));
	}
 
	/**
	* Process input
	*
	* @see t3lib_tcemain->process_datamap()
	* @param array $datamap: Data to be modified or inserted in the database
	*/
	private function lib_record_process(array $datamap, array $cmd = array()) {
		$t3lib_tcemain = t3lib_div::makeInstance('t3lib_tcemain');
		$t3lib_tcemain->start($datamap, $cmd);
		$t3lib_tcemain->process_datamap();
		$t3lib_tcemain->process_cmdmap();
	}
}

Diese Klasse kann man nun zum Anlegen neuer Datensätze,…

require_once(t3lib_extMgm::extPath('myExt', 'class.lib_handleRecords.php'));
$lib_handleRecords = new lib_handleRecords();
$lib_handleRecords->lib_record_insert(
	'myTableName',
	array(
		'pid' => $myPid,
		'title' => 'bla',
		'myField' => 'blubb'
	)
);

… zum Aktualisieren bestehender Datensätze und…

require_once(t3lib_extMgm::extPath('myExt', 'class.lib_handleRecords.php'));
$lib_handleRecords = new lib_handleRecords();
$lib_handleRecords->lib_record_update(
	'myTableName',
        $myUid,
        array(
		'pid' => $myPid,
		'title' => 'bla',
		'myField' => 'blubb'
	)
);

…zum Löschen von Datensätzen und…

require_once(t3lib_extMgm::extPath('myExt', 'class.lib_handleRecords.php'));
$lib_handleRecords = new lib_handleRecords();
$lib_handleRecords->lib_record_delete(
	'myTableName',
	$myUid
);

…zum Verschieben von Datensätzen usw. nutzen:

require_once(t3lib_extMgm::extPath('myExt', 'class.lib_handleRecords.php'));
$lib_handleRecords = new lib_handleRecords();
$lib_handleRecords->lib_record_move(
	'myTableName',
	$myUid,
	$newPid
);

Damit werden die Datensätze korrekt in die Tabelle eingefügt bzw. aktualisiert, d.h. mit den Timestamps, korrekten Wert für Feld „sorting“ und korrektem Handling des Workspaces bzw. Versionierung (betrifft die Felder „t3ver_*“). Vor allem die Handhabung der Datensätze im Entwurfs-Workspace und anderen Workspaces wird damit erleichtert.
Beachten sollte man, dass man nun jedes Feld im TCA definieren muss, denn sonst werden die Werte für dieses Feld verworfen. Felder, die man nicht über das Backend abändern darf, kann man als „nur lesen“ anlegen, z.B. so:

'config' => array(
	'type' => 'input',
	'readOnly' => 1
)

oder so:

'config' => array(
	'type' => 'select',
	'foreign_table' => 'myTable',
	'size' => 1,
	'readOnly' => 1
)

Achtung: Die Felder „uid“, „tstamp“, „crdate“, „cruser_id“ und „sorting“ werden von TYPO3 überschrieben, sie können also nicht selbst bestimmt werden.

EDIT 09.03.2010: Habe eben den Artikel auf http://blog.tolleiv.de/2010/03/handling-data-in-typo3-with-tcemain/ entdeckt und die weiteren Funktionen (Datensatz verschieben, kopieren und übersetzen) nachgereicht.

2 Kommentare

  1. 1

    Danke!

  2. 2

    Die Theorie ist gut und sinnvoll. Man sollte jedoch beachten, dass TYPO3 keinerlei Feedback über Erfolg/Misserfolg der Verarbeitung gibt.
    (Zumindest stand T3BOARD11, evtl. werden inzwischen Exceptions geworfen, die wenigstens abfangbar wären).
    Daher sollte man sich stets überlegen, ob man diese Info braucht, oder nicht, und ggf. doch lieber „händisch“ die Daten ändern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.