Ich wurde jetzt schon das dritte Mal auf das Thema angesprochen (angeschrieben), daher werde ich ein kleines HOWTO posten.
Anforderungen
Über ein powermail Formular soll unter anderem ein Datum gespeichert werden (hier würde sich das Datum Feld gut eignen). Eine Ausgabe im Frontend über powermail_frontend ist eigentlich auch kein Problem. Oder vielleicht doch? Eine Sortierung nach Datum ist nicht mehr möglich, weil das Datum als String in der Datenbank vorliegt und nicht als timestamp.
Idee
Mit Hilfe einer kleinen userFunc kann man das Datum direkt als timestamp speichern. Mit einer Zeile mehr im Typoscript lässt sich der Timestamp wieder als Datum ausgeben und eine Sortierung nach Datum ist auch möglich.
Umsetzung
1. Speicherung des Datums als Timestamp
1.1 date2cal, powermail installieren (Start- und Stopzeiten für Felder und Fieldsets im Extension Manager bei powermail gleich deaktivieren)
1.2 Ein kleines Formular mit Datum Feld anlegen (z.B. uid59)
Bild: design-and-style.de/…/pm_date2.jpg
Bild: design-and-style.de/…/pm_date1.jpg
1.3 Um ein Datum in ein timestamp umwandeln zu können, bietet typoscript derzeit noch nichts an (so weit mir bekannt), daher eine neue Datei direkt in fileadmin anlegen (Name user_powermailTimestamp.php):
<?php
class user_powermailTimestamp {
// Function preflight() will be used from typoscript
function preflight($content='', $conf=array()) {
$value = $GLOBALS['TSFE']->fe_user->sesData['powermail_'.$conf['userFunc.']['formuid']][$conf['userFunc.']['field']];
return $this->getDate($value);
}
// Main getDate() changes a date in any format to an unix timestamp
function getDate($string, $default = 'now', $timestamp = 1) {
$error = 0; // no error at the beginning
$string = str_replace(array('-', '_', ':', '+', ',', ' '), '.', $string); // change 23-12-2009 -> 23.12.2009 AND "05:00 23.01.2009" -> 05.00.23.01.2009
if (method_exists('t3lib_div', 'trimExplode')) $dateParts = t3lib_div::trimExplode('.', $string, 1); else $dateParts = explode('.', $string); // split at .
if (count($dateParts) === 3) { // only if there are three parts like "23.12.2009"
if (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xx.xx.xx
$string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
}
elseif (strlen($dateParts[0]) == 4 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xxxx.xx.xx
$string = strtotime($dateParts[0].'-'.$dateParts[1].'-'.$dateParts[2]); // change to timestamp
}
elseif (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) == 4) { // xx.xx.xxxx
$string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
}
else { // error
$error = 1; // error
}
} elseif (count($dateParts) === 5) { // only if there are five parts like "05.00.23.01.2009"
$string = strtotime($dateParts[4].'-'.$dateParts[3].'-'.$dateParts[2].' '.$dateParts[0].':'.$dateParts[1].':00'); // change to timestamp
} else { // more than 3 parts - so error
$error = 1; // error
}
$string = date('Y-m-d', $string); // For default: change 1234567 -> 1.1.1979
if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -> 1234567
if ($error) $string = ($default == 'now' ? time() : $default); // show default value
return $string;
}
}
?>
1.4 Diese userFunc können wir nun mit stdWrap nutzen (am besten in ein Extension Template in der Seite mit dem Formular):
includeLibs.powermailTimestamp = fileadmin/user_powermailTimestamp.php
plugin.tx_powermail_pi1 {
mode {
dblog {
uid59 = USER
uid59.userFunc = user_powermailTimestamp->preflight
uid59.userFunc.field = uid59
uid59.userFunc.formuid = 32
}
}
}
Wichtig ist hier die Zahl 32 - hier müsst ihr die tt_content uid des Formulares eintragen (z.B. mit Maus über das content symbol in der Listenansicht)
1.5 Überprüfung - die Werte sollten jetzt bereits als timestamp und nicht mehr als string gespeichert werden:
Bild: design-and-style.de/…/pm_date3.jpg
2. Ausgabe wieder als Datum
2.1 powermail_frontend installieren
2.2 So einrichten, dass die Werte bereits im Frontend sichtbar sind (statt einem lesbaren Datum sieht man nur den timestamp)
2.3 Ein Extension Template in der Seite mit powermail_frontend hilft hier:
plugin.tx_powermailfrontend_pi1 {
list {
uid59 = TEXT
uid59.field = uid59
uid59.strftime = %d.%m.%Y
}
}
2.4 Überprüfen - jetzt sollte das Datum auch vernünftig ausgegeben werden:
Bild: design-and-style.de/…/pm_date4.jpg
Abschließendes blabla
Selbstverständlich kann man jetzt in powermail frontend schön nach dem Feld uid59 sortieren - einfach in den constants eintragen.
Es ist sogar möglich nur Datensätze anzeigen zu lassen, die in der Zukunft liegen - hier hilft eine Einstellung in den Flexform.
Und seit powermail_frontend Version 0.5.0 ist es auch möglich die Einträge von FE Usern ändern zu lassen...
Cheers, Alex