Zum Inhalt springen

sr_feuser Datum parsen

Erstellt am 5. Dezember 2007 · 11 Antworten · letzte Antwort am 6. Mai 2009

Tags: Frage

crossl ·

Ich möchte in einem der Bestätigungs e-Mails, die der User nach der Anmeldung erhält, das eingebene Geburtsdatum ausgeben.

In feuserregisterTemplate.html gibts dazu den entsprechenden Marker:
<!-- ###SUB_INCLUDED_FIELD_date_of_birth### -->###LABEL_DATE_OF_BIRTH### ###FIELD_date_of_birth###<!-- ###SUB_INCLUDED_FIELD_date_of_birth### -->

Nur gibt mir der den Unix Timestamp aus, und folgender PHP Versuch im Template scheitert:

<?php $dbirth= date( 'Y-m-d', ###FIELD_date_of_birth###); echo $dbirth;  ?>

Wie kann ich das Problem lösen?

crossl ·

vielleicht liegt der Fehler in setup.txt:

	parseValues {
		username = nospace,trim
		email = lower,nospace,trim
		password = trim,nospace
		name = trim
		first_name = trim
		last_name = trim
		date_of_birth = date
	}

	parseFromDBValues {
		date_of_birth = adodb_date
	}
	parseToDBValues {
		date_of_birth = adodb_date
	}
Morgenthau ·
crossl schrieb

😢 keiner eine Idee??
Ich bräuchte da ganz dringend eine Lösung....

Habe das gleiche Problem. Hast Du eine Lösung gefunden?

crossl ·

meine Lösung:
in der Datenbank ein neues Textfeld anlegen, dann einen Trigger in der Datenbank anlegen, der automatisch das Datum als Text dort einträgt, und dieses Feld dann im Template auslesen.

So klappts auf Umwegen....

froemken ·

Habe mir gerade mal ein Mini-Backendmodul gebastelt, weil ich ähnliche Probleme habe.
Die Extension srfeuserregister arbeitet mit einer eigenen Funktion, um Datumswerte in einen Timestamp umzurechnen. Vielen Dank dazu an die zitierte setup.txt. An Hand der Funktion konnte ich erkennen, dass man selbst entscheiden kann, ob ein Datumswert (Geburtstag) als date-Wert oder wie vorgegeben als adodb_date-Wert abgespeichert werden soll.
Die Problematik bei date ist klar: Alle Datumswerte über den 01.01.1970 hinaus werden zu Minus-Timestamps, während die adodbs IMHO bei 1901 anfangen.

Heißt: Um diese adodb-Werte wieder in das Originalformat umzuwandeln muss man in seiner Extension nur ein Objekt der AdoDB laden und die gewünschte Funktion aufrufen:

if ( !is_object( $adodbTime ) ) {
include_once( PATH_BE_srfeuserregister.'pi1/class.tx_srfeuserregister_pi1_adodb_time.php' );
// prepare for handling dates before 1970
$adodbTime = &t3lib_div::getUserObj( '&tx_srfeuserregister_pi1_adodb_time' );
}
//$content .= $adodbTime->adodb_mktime( 0, 0, 0, $dateArray['m'], $dateArray['d'], $dateArray['y'] );
$content .= $adodbTime->adodb_mktime( 0, 0, 0, 1, 17, 1979 ).'<br />';
$content .= $adodbTime->adodb_date( 'Y-m-d', '285375600' );

Das sollte die Lösung gewesen sein.

Stefan

froemken ·

Du hast doch oben im ersten Eintrag eine Idee geschildert und ein php-Beispiel gebracht, dass sogar funktioniert. Nur statt dem Einzeiler machst jetzt nen Mehrzeiler aus meinem Beispiel Zeile 1-5 und Zeile 8

crossl ·

die PHP Zeile von oben bringt aber überhaupt keine Ausgabe ....

Eigentlich schaut der Abschnitt im Template so aus:

<dd>
		<!-- ###SUB_ERROR_FIELD_date_of_birth### -->
		<p class="tx-srfeuserregister-pi1-error">###EVAL_ERROR_FIELD_date_of_birth###</p>
		<!-- ###SUB_ERROR_FIELD_date_of_birth### -->
		<!-- ###SUB_REQUIRED_FIELD_date_of_birth### -->
		<p class="tx-srfeuserregister-pi1-error">###MISSING_DATE_OF_BIRTH###</p>
		<!-- ###SUB_REQUIRED_FIELD_date_of_birth### -->
		<input id="tx-srfeuserregister-pi1-date_of_birth" type="text" class="tx-srfeuserregister-pi1-text" size="10" maxlength="10" title="###TOOLTIP_DATE_OF_BIRTH###" name="FE[fe_users][date_of_birth]" />
	</dd>

...ich bin da etwas ratlos ...

crossl ·

ich habe jetzt in class.tx_srfeuserregister_pi1.php folgenden Code gefunden, der scheint für die Konvertierung zuständig zu sein:

/**
* Transforms incoming timestamps into dates
*
* @return parsedArray
*/
function parseIncomingData($origArr = array()) {
	global $TYPO3_DB, $TCA;
	
	$parsedArr = array();
	$parsedArr = $origArr;
	if (is_array($this->conf['parseFromDBValues.'])) {
		reset($this->conf['parseFromDBValues.']);
		while (list($theField, $theValue) = each($this->conf['parseFromDBValues.'])) {
			$listOfCommands = t3lib_div::trimExplode(',', $theValue, 1);
			while (list(, $cmd) = each($listOfCommands)) {
				$cmdParts = split("\[|\]", $cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array.
				$theCmd = trim($cmdParts[0]);
				switch($theCmd) {
					case 'date':
					if($origArr[$theField]) {
						$parsedArr[$theField] = date( 'Y-m-d', $origArr[$theField]);
					}
					if (!$parsedArr[$theField]) {
						unset($parsedArr[$theField]);
					}
					break;
					case 'adodb_date':
					if($origArr[$theField]) {
						$parsedArr[$theField] = $this->adodbTime->adodb_date( 'Y-m-d', $origArr[$theField]);
					}
					if (!$parsedArr[$theField]) {
						unset($parsedArr[$theField]);
					}
					break;
				}
			}
		}
	}

	$fieldsList = array_keys($parsedArr);
	foreach ($this->TCA['columns'] as $colName => $colSettings) {
		if (in_array($colName, $fieldsList) && $colSettings['config']['type'] == 'select' && $colSettings['config']['MM']) {
			if (!$parsedArr[$colName]) {
				$parsedArr[$colName] = '';
			} else {
				$valuesArray = array();
				$res = $TYPO3_DB->exec_SELECTquery(
					'uid_local,uid_foreign,sorting',
					$colSettings['config']['MM'],
					'uid_local='.intval($parsedArr['uid']),
					'',
					'sorting');
				while ($row = $TYPO3_DB->sql_fetch_assoc($res)) {
					$valuesArray[] = $row['uid_foreign'];
				}
				$parsedArr[$colName] = implode(',', $valuesArray);
			}
		}
	}
	
	return $parsedArr;
}

...hier scheint aber alles richtig zu sein, oder ?

Es wird jetzt zwar das Datum ausgegeben, allerdings mit einem Fehler bei einem Datum nach 1970 - ein Tag zuviel!