Powermail: Datum als Timestamp, powermail_frontend Datum

  • einpraegsam.net einpraegs...
    MacGyver
    0 x
    9340 Beiträge
    80 Hilfreiche Beiträge
    04. 03. 2009, 21:08

    Ich wurde jetzt schon das dritte Mal auf das Thema angesprochen (angeschrieben), daher werde ich ein kleines HOWTO posten.

    [b]Anforderungen[/b]
    Ü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.

    [b]Idee[/b]
    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.

    [b]Umsetzung[/b]
    [b]1. Speicherung des Datums als Timestamp[/b]

    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)
    [img]http://www.design-and-style.de/temp/typo3/pm_date2.jpg[/img]
    [img]http://www.design-and-style.de/temp/typo3/pm_date1.jpg[/img]

    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):

    1. <?php
    2.  
    3. class user_powermailTimestamp {
    4.  
    5.  
    6. // Function preflight() will be used from typoscript
    7. function preflight($content='', $conf=array()) {
    8. $value = $GLOBALS['TSFE']->fe_user->sesData['powermail_'.$conf['userFunc.']['formuid']][$conf['userFunc.']['field']];
    9. return $this->getDate($value);
    10. }
    11.  
    12.  
    13. // Main getDate() changes a date in any format to an unix timestamp
    14. function getDate($string, $default = 'now', $timestamp = 1) {
    15. $error = 0; // no error at the beginning
    16. $string = str_replace(array('-', '_', ':', '+', ',', ' '), '.', $string); // change 23-12-2009 -> 23.12.2009 AND "05:00 23.01.2009" -> 05.00.23.01.2009
    17. if (method_exists('t3lib_div', 'trimExplode')) $dateParts = t3lib_div::trimExplode('.', $string, 1); else $dateParts = explode('.', $string); // split at .
    18.  
    19. if (count($dateParts) === 3) { // only if there are three parts like "23.12.2009"
    20. if (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xx.xx.xx
    21. $string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
    22. }
    23. elseif (strlen($dateParts[0]) == 4 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) <= 2) { // xxxx.xx.xx
    24. $string = strtotime($dateParts[0].'-'.$dateParts[1].'-'.$dateParts[2]); // change to timestamp
    25. }
    26. elseif (strlen($dateParts[0]) <= 2 && strlen($dateParts[1]) <= 2 && strlen($dateParts[2]) == 4) { // xx.xx.xxxx
    27. $string = strtotime($dateParts[2].'-'.$dateParts[1].'-'.$dateParts[0]); // change to timestamp
    28. }
    29. else { // error
    30. $error = 1; // error
    31. }
    32. } elseif (count($dateParts) === 5) { // only if there are five parts like "05.00.23.01.2009"
    33. $string = strtotime($dateParts[4].'-'.$dateParts[3].'-'.$dateParts[2].' '.$dateParts[0].':'.$dateParts[1].':00'); // change to timestamp
    34. } else { // more than 3 parts - so error
    35. $error = 1; // error
    36. }
    37. $string = date('Y-m-d', $string); // For default: change 1234567 -> 1.1.1979
    38. if ($timestamp) $string = strtotime($string); // Change back 1.1.1979 -> 1234567
    39. if ($error) $string = ($default == 'now' ? time() : $default); // show default value
    40.  
    41. return $string;
    42. }
    43. }
    44.  
    45. ?>

    1.4 Diese userFunc können wir nun mit stdWrap nutzen (am besten in ein Extension Template in der Seite mit dem Formular):
    [TS]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
    }
    }
    }
    [/TS]
    [b]Wichtig[/b] 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:
    [img]http://www.design-and-style.de/temp/typo3/pm_date3.jpg[/img]

    [b]2. Ausgabe wieder als Datum[/b]

    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:
    [TS]plugin.tx_powermailfrontend_pi1 {
    list {
    uid59 = TEXT
    uid59.field = uid59
    uid59.strftime = %d.%m.%Y
    }
    }
    [/TS]

    2.4 Überprüfen - jetzt sollte das Datum auch vernünftig ausgegeben werden:
    [img]http://www.design-and-style.de/temp/typo3/pm_date4.jpg[/img]

    [b]Abschließendes blabla[/b]
    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

    in2code.de - Wir leben TYPO3
    - Möchtest du TYPO3 komplett verstehen? Eigene Erweiterungen erstellen? Bei uns gibt es auch Schulungen https://www.in2code.de/produkte/typo3-schulungen/
    - Die Arbeit mit TYPO3 macht dir Spaß? Du stehst auf Berge? Komm zu uns! https://www.in2code.de/agentur/karriere/


  • adamito adamito
    TYPO3-Anwärter
    0 x
    5 Beiträge
    0 Hilfreiche Beiträge
    23. 05. 2009, 00:55

    DANKE!!

    dachte zuerst das hatte ich schon, hatte ich aber nicht!
    wollte immer auf .data schreiben!

    der vollständigkeit halber nochmals die lösung zum verwenden der user_powermailTimestamp.php für fremde tabellen / externe db:

    1. includeLibs.powermailTimestamp = fileadmin/user_powermailTimestamp.php
    2.  
    3. plugin.tx_powermail_pi1 {
    4. dbEntry {
    5. tx_astklienten_klienten {
    6. _enable = TEXT
    7. _enable.value = 1
    8.  
    9. .
    10. .
    11. .
    12. begin = USER
    13. begin.userFunc = user_powermailTimestamp->preflight
    14. begin.userFunc.field = uid84
    15. begin.userFunc.formuid = 14
    16. .
    17. .
    18. .
    19. }
    20. }
    21. }

    vielleicht hilft es ja jemandem

    Gruß und nochmals Danke!
    Adam

  • einpraegsam.net einpraegs...
    MacGyver
    0 x
    9340 Beiträge
    80 Hilfreiche Beiträge
    23. 05. 2009, 11:14

    Ich schließe den Thread mal bevor er noch unübersichtlicher wird. Bei ähnlichen Fragen, neuen Post aufmachen.

    Grüße, Alex

    in2code.de - Wir leben TYPO3
    - Möchtest du TYPO3 komplett verstehen? Eigene Erweiterungen erstellen? Bei uns gibt es auch Schulungen https://www.in2code.de/produkte/typo3-schulungen/
    - Die Arbeit mit TYPO3 macht dir Spaß? Du stehst auf Berge? Komm zu uns! https://www.in2code.de/agentur/karriere/

  • einpraegsam.net einpraegs...
    MacGyver
    0 x
    9340 Beiträge
    80 Hilfreiche Beiträge
    12. 08. 2010, 09:24

    [b]Hier eine valide Anmerkung von _Andreas_[/b]

    Ich hatte heute das Problem, dass aus einen String, wie "15:30 15-09-2010" schlussendlich ein Timestamp für "00:00 15-09-2010" wird. Der Split funktionierte, dann ging er korrekt in den Zweig mit 5 Parts und erstellte den richtigen Timestamp. Danach machst Du aber ein "$string = date('Y-m-d', $string);", was natürlich die Uhrzeit rauslöscht. D.h. die Funktion getDate erzeugt also immer einen Timestamp um 00:00 Uhr zum gegebenen Datum. War das Absicht? Dann macht die Raussucherei der Uhrzeit eigentlich keinen Sinn.
    Ich hab's für mich so gelöst, dass ich in dem besagten elseif-Zweig ein "if ($timestamp) return $string;" eingefügt habe.

    in2code.de - Wir leben TYPO3
    - Möchtest du TYPO3 komplett verstehen? Eigene Erweiterungen erstellen? Bei uns gibt es auch Schulungen https://www.in2code.de/produkte/typo3-schulungen/
    - Die Arbeit mit TYPO3 macht dir Spaß? Du stehst auf Berge? Komm zu uns! https://www.in2code.de/agentur/karriere/