Zum Inhalt springen

Powermail: Datum als Timestamp, powermail_frontend Datum

Erstellt am 4. März 2009 · 13 Antworten · letzte Antwort am 12. August 2010

Tags: Powermail, Tipp

einpraegsam.​net ·

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

Pio435 ·

OK, so weit so gut! Vielen Dank schon mal bis hier hin!

Zwei Fragen hab ich noch:

- wie kann ich jetzt den timestamp abfangen, damit ich diesen in eine andere Tabelle schreiben kann?

Ich denke ich muss ja hier den Teil nach dem "=" auf Zeile 6 ersetzen, oder? Zumindest schreibt powermail bei mir mit dieser Variante immer noch den String von uid2 (Bsp. 27-03-2009 anstatt 1238194800).

plugin.tx_powermail_pi1 {
    dbEntry {
.
.
        tx_kbeventboard_events.eventname = TEXT
        tx_kbeventboard_events.eventname.data = TSFE:fe_user|sesData|powermail_229|uid2
.
.
}}

- kann das php-script so erweitert werden, dass ein Timestamp auch nur für eine Zeitangabe (also Beginn 20.00) eingetragen werden kann?

Für Deine nochmalige Hilfe vielen Dank! Ich denke, andere Anfänger wie ich werden davon auch noch profitieren :-)

Gruss Pio435

einpraegsam.​net ·

Das was du willst, scheint etwas anderes zu sein. Das HOWTO oben bezieht sich nur auf die eigene Tabelle. Aber du kannst die userFunc auch dazu verwenden in andere Tabellen zu speichern.
Der timestamp besagt, dass eine Zeit gespeichert wurde - diese kann als Datum, als Uhrzeit oder als Datum mit Uhrzeit ausgegeben werden.

engler ·

Hallo,

umpf, das hab ich jetzt nicht ganz hingekriegt...

Ich würde gerne den Timestamp aus einem Powermail-Datumsfeld (Format tt-mm-jjjj) in eine cal-Tabelle (Format yyyymmtt) über dbentry schreiben.

Wie muss ich da mit Hilfe der userFunc oder mittels Typoscript vorgehen?

Input ist also z.B. 20-05-2009, Output und das was in die Tabelle soll wäre dann 20090520.

adamito ·

hallo einpraegsam-nett

könntest du bitte einen beispielcode posten wenn der timestamp nicht in die powermail eigene db geschrieben werden soll sondern in eine externe db.
(also das was wahrscheinlich auch Pio435 interessieren wird)

schaff es einfach nicht, sitz schon seit stunden und komme einfach nicht mehr voran :o

vielen dank
adamito

adamito ·

hallo nochmals,
heute ist es noch nicht so spät wie gestern, vielleicht klappts da ja besser.
bei der suche nach einer lösung meines problems bin ich auf diesen thread gestossen.
nach was habe ich gesucht?
nach der möglichkeit ein datum in powermail als timestamp abzuspeichern um später danach sortieren zu können.
wie ging es mir dabei?
anfänglich freude, es gibt eine handvoll threads die genau dieses thema behandeln. unter anderem http://www.typo3forum.net/forum/powermail/36102-powermail-datum-timestamp-powermail_frontend-datum.html. toll, dachte ich mir, problem gelöst.
das habe ich dann alles eingegeben und es funktionierte auch auf anhieb. uid84, in meinem fall, lag jetzt in den powermail piVars als timestamp vor.

dann habe ich versucht das ganze in eine externe datenbank zu schreiben, also genau das was mein vorposter auch schon versucht hat:

- wie kann ich jetzt den timestamp abfangen, damit ich diesen in eine andere Tabelle schreiben kann?

Ich denke ich muss ja hier den Teil nach dem "=" auf Zeile 6 ersetzen, oder? Zumindest schreibt powermail bei mir mit dieser Variante immer noch den String von uid2 (Bsp. 27-03-2009 anstatt 1238194800).

Typoscript: Zeilennummerierung: An / Aus

      plugin.tx_powermail_pi1 {
          dbEntry {
      .
      .
               tx_kbeventboard_events.eventname = TEXT
               tx_kbeventboard_events.eventname.data = TSFE:fe_user|sesData|powermail_229|uid2
      .
      .
      }}

daran bin ich gestern so wie auch heute kläglich gescheitert. ich habe bereits unzählige varianten ausprobiert aber es wurde entweder das datum im format %d.%m.%y oder nichts in die externe datenbank geschrieben.

das es prinzipiell funktioniert sagt ja einpraegsam.net

Das HOWTO oben bezieht sich nur auf die eigene Tabelle. Aber du kannst die userFunc auch dazu verwenden in andere Tabellen zu speichern.

und um genau das geht es!

ich will natürlich niemanden zu kostenlosen auftragsarbeiten nötigen, dachte auch nicht dass das für einen versierten programmierer arbeit ist. anscheinend fehlt mir aber das nötige grundwissen um den aufwand einschätzen zu können.

was bleiben mir jetzt also für möglichkeiten?

  • powermail als extension nicht benutzen da ich die sortierung unbedingt benötige (was natürlich sehr schade ist da es wohl eine der genialsten extensions ist).
    darauf hoffen die lösung selbst zu finden.
    darauf hoffen hilfe zu erfahren.
    weiterhin mit typo3 arbeiten, manuals, tuts und howtos lesen und darauf vertrauen irgendwann den wissensstand zu erreichen wo ich dann erleuchtet werde.

also falls jemand die lösung kennt, oder mir die richtung weisen kann und sei es auch nur ein hinweis auf die nötige literatur, wäre ich dafür sehr dankbar.

gruß
adamito

ps:
an alex: beim lesen in foren stößt man immer wieder auf menschen die anderen oft hilfe anbieten und von denen man oft threads liest. unweigerlich macht man sich von diesen menschen unterbewußt ein bild. nicht unbedingt so eines das man auch auf xing finden kann, eher eines von der wesensart. diese bilder bestätigen sich meist wenn man mit iesen menschen in kontakt tritt. diesmal war das nicht der fall. sollte ich dich mit meinem ersten post verärgert haben war das nicht meine absicht, gefühlsmäßig habe ich aber diesen eindruck.

adamito ·

hallo
danke für deine antwort.
genau um dise einbindung geht es.

ich beschreibe die fremdtabelle mit

plugin.tx_powermail_pi1 {
                dbEntry {
 	          tx_astklienten_klienten {
                 _enable = TEXT
                 _enable.value = 1
                .
                .

                begin = TEXT
                begin.data = TSFE:fe_user|sesData|powermail_14|uid84
            
                .
                .
                }}}

mein erster ansatz war:

begin = TEXT
     begin.data = USER
     begin.data.userfunc = user_powermailTimestamp->preflight
     begin.data.userFunc.field = TSFE:fe_user|sesData|powermail_14|uid84
     begin.data.userFunc.formuid = 14

was aber nicht funktioniert.
habe noch eine menge anderer varianten ausprobiert - ohne erfolg
habe auch keine ahnung wo ich nachlesen kann wie so was geht.
hab halt leider nur mit fortran, vhdl, spice erfahrung

einpraegsam.​net ·
...
begin = USER
begin.userfunc = user_powermailTimestamp->preflight
begin.userFunc.field = uid84
begin.userFunc.formuid = 14 
...

Irgendwie so...

adamito ·

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:

includeLibs.powermailTimestamp = fileadmin/user_powermailTimestamp.php

plugin.tx_powermail_pi1 {
  dbEntry {
    tx_astklienten_klienten {
      _enable = TEXT
      _enable.value = 1
         
      .
      .
      .
      begin = USER
      begin.userFunc = user_powermailTimestamp->preflight
      begin.userFunc.field = uid84
      begin.userFunc.formuid = 14 
      .
      .
      .
    }
  }
}

vielleicht hilft es ja jemandem

Gruß und nochmals Danke!
Adam

einpraegsam.​net ·

Hier eine valide Anmerkung von _Andreas_

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.