Zum Inhalt springen

Datum in Backend-Datensatzliste ausgeben

Erstellt am 17. Mai 2011 · 3 Antworten · letzte Antwort am 20. Mai 2011

Tags: TCA, PHP, Frage

Tosta ·

Hi,

ich habe eine eigene Extension, docarchive, mit einer Datenbank-Tabelle, die ein Datums-Feld enthält; das Datums-Feld heißt date. In der Datensatzliste im Backend möchte ich das Datum als Label ausgeben, zusammen mit einem Textfeld (title). Wenn ich das wie unten beschrieben tu, wird immer »01.01.1970« ausgegeben, das Datums-Feld scheint keinen gültigen Wert zu haben; es ist aber definitiv gesetzt (geprüft mit phpMyAdmin)!

In der ext_tables.php habe ich das Label definiert:

<?

...

include_once(t3lib_extMgm::extPath('docarchive') . 'class.tx_docarchive.php');

$TCA["tx_docarchive_entries"] = array (
	"ctrl" => array (
		'title'     				=> 'LLL:EXT:docarchive/locallang_db.xml:tx_docarchive_entries',		
		'label'     				=> 'title',	
		'label_userFunc'			=> 'tx_docarchive->getEntryLabel',
	...
);

...

>?

In der Klasse tx_docarchive ist die Funktion getEntryLabel definiert, die das Label aus Datum und Titel zusammenbauen soll – was leider nicht funktioniert:

<?

class tx_docarchive {

	function getEntryLabel($params, $parent) {
		$row = $params['row'];
		$label = date('d.m.Y', $row['date']) . ' ' . $row['title'];
		$params['title'] = $label;
	}
}

?>

Grundsätzlich ist diese Konstruktion korrekt: Der Titel-Wert, $row['title'], wird richtig im Backend ausgegeben. Davor jedoch steht der Default-Wert »01.01.1970«.

Ich habe auch Folgendes getestet:

$row['date'] ohne jede Formatierung liefert gar keinen Text.
strftime('%d.%m.%Y', $row['date']) liefert ebenfalls »01.01.1970«.
strftime('%d.%m.%Y', $row['crdate']) liefert ebenfalls »01.01.1970«.

Achtung: Im 3. Beispiel hab ich das Standard-Feld crdate ausgegeben.

Was mach ich falsch? (Ich muss einräumen, dass ich hier zum ersten Mal PHP programmiere.)

Danke für eure Hilfe!

Tosta

Tosta ·

Inzwischen hab ich festgestellt, dass das Datumsfeld, $row['date'], ganz leer ist. Muss ich irgendwo ausdrücklich angegeben, dass das Feld date gelesen werden soll?

aemka ·

Was liefert denn ein print_r oder debug auf $params und $parent in getEntryLabel?

Selbst wenn das Datum dort nicht vorhanden ist, würde es reichen, wenn du irgendwie die uid des Datensatzes hättest, dann könntest du einmal ein SELECT ... FROM ... WHERE uid = $row['uid'] machen und hättest, was immer du brauchst.

Tosta ·

Vielen Dank, aemka, das hat mir sehr gut weitergeholfen; ich hab Einiges über Debugging und Datenbankzugriff in TYPO3 / PHP gelernt. Vor allem ist mein Problem gelöst!

Zunächst stellte ich (per print_r) fest, dass keins der von mir definierten Felder – bis auf das Titel-Feld – im Array $params['row'] übertragen werden. Hier sind nur »Standardfelder« wie crdate und t3ver_tstamp zu finden. Das Title-Feld wurde möglicherweise nur wegen seines Namens, title, (auch son TYPO3-Standardname) mitgenommen. Es ist mir aber zu aufwändig, das jetzt auszuprobieren (überall das Feld umzubenennen und zu sehen, ob es dann auch fehlt).

Es ist denkbar, dass irgendwo eine Liste von Feldern konfiguriert werden kann, die in $params['row'] übertragen werden sollen. So was gibt es ja schon an anderen Stellen in TYPO3. Ich habe aber nichts dazu gefunden.

Jetzt hab ich es so gemacht, wir aemka es vorgeschlagen hat: Da auch die UID in $params['row'] übergeben wird, kann ich darüber den ganzen Datensatz lesen und verarbeiten. Den notwendigen Code fand ich durch Google »typo3 label_userfunc« (wie schon erwähnt, hab ich noch kein PHP, geschweige denn TYPO3-PHP programmiert). Ging aber easy:

<?

class tx_docarchive {

	function getEntryLabel($params, $parent) {
		$uid = $params['row']['uid'];
		//	Datensatz mit UID per Backend-Funktion aus der Datenbank lesen:
		$table = 'tx_docarchive_entries';
		$row = t3lib_BEfunc::getRecord($table, $uid);
		//	Label aus Datum und Titel zusammenbauen:
		$label = date('d.m.Y', $row['date']) . ' ' . $row['title'];
		//	Label per Referenz zurueckgeben:
		$params['title'] = $label;
	}
}

?>

Sehr zufrieden:

Tosta