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?
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
}
hat hier wirklich keiner der Typo3-Gurus eine Lösung für mich?
😢 keiner eine Idee??
Ich bräuchte da ganz dringend eine Lösung....
crossl schrieb
😢 keiner eine Idee??
Ich bräuchte da ganz dringend eine Lösung....
Habe das gleiche Problem. Hast Du eine Lösung gefunden?
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....
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
...und wo baut man das in sr_feuserregister ein?
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
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 ...
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!
So de le...ich habe die Klasse von adodb ein bissl angepasst, so dass ihr die Datei mit Hilfe von USER oder USER_INT in Euer TypoScript einpflegen könnt.
Ein kleines Tut findet ihr hier:
http://typo3.sfroemken.de/blog/datum/2009/05/05/fce-geburtstag-berechnen-und-anzeigen.html
froemken