Zum Inhalt springen

Problem mit DateTime

Erstellt am 8. Oktober 2010 · 4 Antworten · letzte Antwort am 18. Mai 2011

Tags: Frage

pgnonick ·

Morgen zusammen,
ich habe mich viel mit FLOW3 beschäftigt und nun möchte ich ein paar Extensions mit Extbase und Fluid für meine Homepage programmieren um meinen Horizont zu erweitern und um fit für TYPO3 5 zu sein. Leider bin ich auf 2 Probleme gestoßen. Eigentlich simpler Natur, aber das erste Problem ist wahrscheinlich Unwissenheit in Punkto TYPO3 Extension Entwicklung. Und ich habe ein Problem mit der Klasse DateTime, die durch Extbase zur Verfügung gestellt wird um ein Datum Objekt zu erzeugen und um es abzuspeichern.
Bei meiner Extension geht es ganz simpel um ein Newssystem. Als Autor einer News will ich den eingeloggten Backend User nutzen. Ich habe ein wenig recherchiert und folgendes programmiert.

Article.php

public function __construct() {
    $this->date = new DateTime();
    
    if(!is_object($GLOBALS['BE_USER']))  {
        $GLOBALS['BE_USER'] = t3lib_div::makeInstance('t3lib_beUserAuth');
        $GLOBALS['BE_USER']->start();
    }
    
    $be_userid = $GLOBALS['BE_USER']->user['userid'];
    $query = $GLOBALS['TYPO3_DB']->SELECTquery('*','be_users','uid='.$be_userid);
    $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, $query);
    
    while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
      $author = $row['realName'];
      $email = $row['email'];
    }
       
    $this->author = $author;
    $this->email = $email;
  }

Ganz oben wird ein DateTime Objekt erzeugt und der Model Instanzvariabel $date übergeben. Getter und Setter sind auch in dem Model vorhanden und in der ext_tables.sql steht im Create Table Bereich ein Eintrag date mit int(11). Wenn ich im TYPO3 über Liste in einen SysOrdner ein Article Objekt erzeuge, wird dies auch in der DB abgespeichert, aber leider ohne Timestamp, Autor und E-Mail. Headline, Content etc werden korrekt abgespeichert.
Anscheinend funktioniert new DateTime() nicht und die Abfrage nach dem eingeloggten Backend User ist wohl falsch 😉
Vielleicht kann mich jemand etwas schlauer machen 🙂

Gruß

Rene

HelBon ·

Hallo Rene,

versuch es auf diesem Weg:

Im Model deine Variable $date so deklarieren:

/**
* @var DateTime
**/
protected $date;

Dein Konstruktor dürfte fehlerfrei sein (Hier ist meiner zum Vergleich):

public function __construct(DateTime $date){
      $this->date = new DateTime();
}

Da ich nicht weiss, wie du deine Setter- bzw. Getter-Methoden definiert hast, poste ich sie einfach mal dazu:

/**
* Setter for date
*
* @param DateTime $date
* @return void
*/
	 
public function setDate(DateTime $date){
	$this->date = $date;	
}


/**
* Getter for date
*
* @return DateTime
*/
	 
public function getDate(){
	return $this->date;
}

In deiner Action (im View) solltest du mit Hilfe des View-Helpers <f:format.date>ObjektName.date</f:format.date> das Datum problemlos ausgeben können.
Eventuell das Format im View nach Bedarf anpassen (zusätzliche Parameter sind notwendig).

Grüße

layne ·

Ich hab zu dem Thema auch noch eine Frage.

Ich habe ein Formular im FE, wo der Besucher sich registrieren kann.
Eine der Eigenschaften ist sein Geburtsdatum.

In meinem Model gibt es dann die DateTime-Eigenschaft (das Geburtsdatum).
Diese soll zum einen eine optionale Eigenschaft sein, zum anderen hätte ich gerne eine Fehlermeldung, sobald das vom Benutzer eingegebene Datum ungültig ist.

Durch die Notation @DateTime, wird leider von Extbase nur überprüft ob die Eigenschaft vom Typ DateTime ist. Dies ist sie durch Extbase allerdings scheinbar immer automatisch.

Ich erhalte keine Meldung im Fehlerobjekt für diese Eigenschaft. Bei Fehlerhafter Eingabe wird diese im Formular vollkommen zerstört, oder es fehlt jegliche Ausgabe.

Kann mir da vielleicht jemand helfen?

Hier noch Auszüge aus meinem Model:

/**
 * The date of birth of the subscriber.
 * @var DateTime
 */
protected $dateOfBirth;
/**
 * Returns the date of birth.
 * @return mixed DateTime for PHP Version 5.3 and higher, the formated date as d.m.Y. for PHP Versions < 5.3.
 */
public function getDateOfBirth() {
    // Old way for PHP < 5.3
    if (substr(phpversion(),0 ,3) != '5.3') {
        if (is_null($this->dateOfBirth->getOffset())) {
            return '';
        }
        else {
            return $this->dateOfBirth->format('d.m.Y');
        }
    }
    // Nice way for PHP >= 5.3
    return $this->dateOfBirth;
}

/**
 * Set the date of birth.
 * @param DateTime $dateOfBirth 
 */
public function setDateOfBirth($dateOfBirth) {
    $this->dateOfBirth = $dateOfBirth;
}
daniz78 ·

Wie lässt sich denn jetzt ein Datumsfeld in einem Formular übergeben?

<f:form.textbox property="kundeGeburtsdatum" />

Bei Fehlern im Formular, bleibt das Feld leer...

Typo3Cuckoo ·

Hi,

ich stehe selber noch relativ am Anfang, was Extension Entwicklung mit Extbase&Fluid betrifft aber ein DateTime habe ich schon erfolgreich "verbaut". Ich hoffe, das hilft dir weiter. 🙂

In meinem Model hab ich zwei Variablen wie folgt definiert

/**
 * @var int
 */
protected $dateStart;

/**
 * @var int
 */
protected $dateEnd;

Getter und Setter (auch im Model, analog für $dateEnd):

public function setDateStart($dateStart) {
    $this->dateStart = $dateStart;
}

public function getDateStart() {
    return $this->dateStart;
}

SQL Definition in ext_tables.sql:

date_start int(11) unsigned DEFAULT '0' NOT NULL,
date_end int(11) unsigned DEFAULT '0' NOT NULL,

TCA Definition in ext_tables.php:

'date_start' => array(
	'exclude' => '1',
	'label' => 'Gültig von',
	'config' => array(
		'type' => 'input',
		'size' => '8',
		'checkbox' => '0',
		'eval' => 'date',
	)
),
'date_end' => array(
	'exclude' => '1',
	'label' => 'Gültig bis',
	'config' => array(
		'type' => 'input',
		'size' => '8',
		'checkbox' => '0',
		'eval' => 'date',
	)
),

Ausgabe in FLUID:

<f:format.date format="d.m.Y">{obj.dateStart}</f:format.date>
<f:format.date format="d.m.Y">{obj.dateEnd}</f:format.date>