Zum Inhalt springen

@validate DateTime NUR Time

Erstellt am 11. April 2013 · 5 Antworten · letzte Antwort am 8. März 2017

Tags: Frage

iconomie ·

Hallo zusammen,

ich stehe gerade vor dem Problem, dass ich in einer Extbase Extension eine Uhrzeit eingeben möchte.
Wenn ich das Formular abschicke, erhalte ich die Fehlermeldung:
The date "10:00" was not recognized (for format 'Y-m-d\TH:i:sP').

Was muss ich tun, damit Extbase hier die Eingabe "H:i" zu lässt? Stehe gerade komplett auf dem Schlauch...

Property ist im Model wie folgt eingetragen:

/**
* Session start time
*
* @var \DateTime
* @validate NotEmpty
*/
protected $startTime;

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

Schon mal vielen Dank im voraus für einen kleinen Hinweis.

iconomie ·

Ok, habe es gerade durch einen Kommentar in der DateTimeConverter.php von Extbase gefunden.
Falls jemand ein ähnliches Problem hat, hier die Lösung.

Um aus der Benutzereingabe ein korrektes DateTime Objekt zu erzeugen, muss man dem Converter vorher per Konstante das Format für jedes Property mitgeben, bzw. den Default-Wert überschreiben, der vom Standard abweicht (Bei mir H:i).
Das geht mehr oder weniger elegant über eine initialize Action für createAction und updateAction:

public function createAction( <DEIN_OBJEKT> ){...}

/**
* action initializeCreate
* reset default date format
* @return void
*/
public function initializeCreateAction() {
  $this->arguments['<DEIN_OBJEKT>']
    ->getPropertyMappingConfiguration()
    ->forProperty('<DEIN_PROPERTY>') // this line can be skipped in order to specify the format for all properties
    ->setTypeConverterOption('TYPO3\\CMS\\Extbase\\Property\\TypeConverter\\DateTimeConverter', \TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::CONFIGURATION_DATE_FORMAT, '<DEIN_FORMAT>');

Ich hoffe das hilft jemandem weiter...

harald1972 ·

Schön, daß du schon selber auf eine Lösung gekommen bist.
Allerdings sehe ich, daß du die Zeitformatierungen im Controller machst.
Mein PHP-Code formatiert die Zeit niemals. Dafür ist die jeweilge View zuständig.
Die Views zeigen ja nicht nur Daten sondern bieten auch die Inputfelder an.

Als Beispiel hab ich hier ein Codefragment. Darin sind 2 verschiedene Formatierungen (einmal mit Uhrzeit, einmal ohne). Die Variable dateNow wird der View selbstverständlich übergeben.

 <f:if condition="{project.start}">
  <f:then><f:form.textfield property="start" value="{project.start->f:format.date(format:'d.m.Y H:i')}" /></f:then>
  <f:else><f:form.textfield property="start" value="{dateNow->f:format.date(format:'d.m.Y')}" /></f:else></f:if>
iconomie ·

Ich glaube, da hast Du mich falsch verstanden.
Mir geht es nicht um die Datenausgabe im Template, sondern um die Dateneingabe durch den Benutzer.

In der initializeAction setze ich auch kein Datumsformat, das an eine View gegeben wird. Hier setze ich das Format, das der DateTimeConverter verwendet, um aus der User-Eingabe ein DateTime-Objekt zu erzeugen. Per default erwartet der Converter "Y-m-d H:i". Der User muss bei mir aber "H:i" eingeben. Ohne die Konstante vom Parser zu überschreiben, wird dieser inkl. "@validate DateTime" fehlschlagen.

Mit dem oberen Code, wird mir ein sauberes Objekt erzeugt, das ich dann wie gewohnt an die View geben und mit Fluid formatieren kann.

pmeier99 ·

Vielen Dank, das hat mir geholfen.

Kleiner Nachtrag: Zumindest in Version 6.1.3 kann der Call zu "forPropert()" nicht weggelassen werden, sondern muss mit einer Wildcard versehen werden, wenn alle Properties angesprochen werden sollen:

public function initializeCreateAction() {
  $this->arguments['<DEIN_OBJEKT>']
    ->getPropertyMappingConfiguration()
    ->forProperty('*')
    ->setTypeConverterOption('TYPO3\\CMS\\Extbase\\Property\\TypeConverter\\DateTimeConverter', \TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::CONFIGURATION_DATE_FORMAT, '<DEIN_FORMAT>');
getit ·

Bei mir funktioniert das aber leider trotzdem nicht #angry#

Im Controller:

public function initializeAddAction() {
  $this->arguments['blog']
    ->getPropertyMappingConfiguration()
    ->forProperty('date')
    ->setTypeConverterOption(\TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::class, \TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::CONFIGURATION_DATE_FORMAT, 'd.m.Y H:i');
}

und

/**
 * @param Blog|null $blog
 */
public function addFormAction(Blog $blog = null) {
  $this->view->assign('blog', $blog);
}
/**
 * @param Blog $blog
 */
public function addAction(Blog $blog) {
  $this->blogRepository->add($blog);
  $this->redirect('list');
}

und im Form, als Test nur:

f:form action="add" object="{blog}" name="blog" additionalAttributes="{role:'form'}">
<div class="form-group">
  <label>Date</label>
  <f:form.textfield property="date" class="form-control" type="datetime-local" />
</div>

Beim Absenden des Formulars erhalte ich die Fehlermeldung: The date "2017-02-01T01:01" was not recognized (for format "d.m.Y H:i" ). | 1307719788 | Arguments: 2017-02-01T01:01