Hallo,
ich habe ein Problem.
Ich habe einen Validator für eine Model-Klasse geschrieben. Dieser funktioniert bis auf Kleinigkeiten zuverlässig.
Meine Model hat 3 Attribute:
/**
* startTime
*
* @var DateTime
*/
protected $startTime;
/**
* endTime
*
* @var DateTime
*/
protected $endTime;
/**
* length
*
* @var float
*/
protected $length;
Nachdem ich die Daten ins Formular eingetragen habe, und auf Abschicken drücke, wird die Validation angeworfen. Sind die Daten fehlerhaft, wird eine Fehlermeldung angezeigt. Nach meinem Verständnis wird in diesem Fall also nicht die CreateAction aufgerufen sondern erneut die newAction.
Mein Problem ist nun aber, dass in dem Formular nur noch das "length" Attribut eingetragen ist. Meine zuvor eingetragenen Felder in startDate und endDate wurden gelöscht, was ich als extrem schlecht in der Bedienung ansehe.
Vielleicht kann mir jemand helfen.
Das liegt daran dass die Eigenschaften DateTime Objekte sind. Habe das selbe Problem gerade auch. Ein Workaround ist statt DateTime Integer zu verwenden. Ist natürlich nicht sind und Zweck der Sache aber eine andere Lösung kenne ich auch nicht. Wenn jemand eine bessere Lösung kennt würde ich mich über eine Antwort freuen.
Außerdem gibt es Probleme bei DateTime Objekten wenn man diese wieder löschen will -> das geht nämlich nicht weil er dann gar kein DateTime Objekt übergibt wenn es leer ist.
Grüße
Alex
Hi,
danke für deine schnelle Antwort. Schade dass es keine direkte Lösung gibt, aber wenigstens ist somit die Fehlerquelle analysiert.
Was meinst du aber, dass das Löschen von DateTime Objekten nicht möglich ist? Normalerweise sind DateTime Objekte ja eine Property innerhalb meines Domänenobjekts, ich lösche aber ja nur das Domänenobjekts selbst, damit habe ich keine Probleme.
Noch eine kleine Frage zu den Workaround. Aktuelle konnte ich mit dem DateTime dann in Fluid Formatierungsoptionen (mit format.date) verwenden und habe auch durch JQuery-UI Datepicker etc. verwendet.
Ist dies nun weiterhin möglich? Wenn ja gibt es eine Idee wie man das am besten umsetzt.
Hi,
wagnerts schrieb
Was meinst du aber, dass das Löschen von DateTime Objekten nicht möglich ist? Normalerweise sind DateTime Objekte ja eine Property innerhalb meines Domänenobjekts, ich lösche aber ja nur das Domänenobjekts selbst, damit habe ich keine Probleme.
ich habe in meinem aktuellem Fall z.B. das Domänenobjekt "Film" welches ein Archivierungsdatum vom Typ DateTime hat. Wenn ich nun in der EditAction versuche eine bereits gesetzes Archivierungsdatum wieder rauszunehmen, so geht das nicht.
Lösungsvorschläge sind genre willkommen 😉
wagnerts schrieb
Ist dies nun weiterhin möglich? Wenn ja gibt es eine Idee wie man das am besten umsetzt.
Ja das geht weiterhin. Du musst nur im Fluid Template mittels If Viewhelper den Fall abfangen, dass der Int Wert 0 ist. Sonst schmeißt der DateFormat Viewhelper nen Fehler.
Ok jetzt verstehe ich dein Problem. Bei mir kann das zum Glück nicht passieren, DA das Datum ein Pflichtfeld ist.
Dennoch werde ich auf Int. umstellen müssen.
Noch eine kleine Frage zur Validierung. Kannst du mir sagen, wie ich nicht Domänenobjekte, die kein Property des Domänenobjekts sind validieren kann?
Beispiel:
Ich habe eine M:N Beziehung zwischen Person und Auto.
Eine Person kann unterschiedliche Autos als Fahrzeug angeben, also fahren. Gleichzeitig kann ein Auto von mehreren Fahrern gefahren werden.
Ich habe also z.B. eine Tabelle PersonAuto (meine m:n Tabelle).
Beim Anlegen einer Person stelle ich alle Autos als Checkboxen dar und verbinde diese über ein Array (autos[]). Bei der create Methode von Person rufe ich dann mit
createAction ($person, $autos[]) auf und kann so die m:n Tabelle befüllen.
Wie kann ich hier aber die $autos[] überprüfen und dann ggf. zur newAction zurückkehren? Es ist ja weder ein Domänenobjekt noch eine Property vom Domänenobjekt?
Danke für die Hilfe
Hallo,
als ich vor ca. nem Jahr mit meiner damaligen Firma auf Extbase umgestiegen bin, haben wir auch versucht DateTime-Objekte in unseren Models zu verwenden .. kurz: wir haben es aufgegeben. Wir benutzen stattdessen einen String. Das macht sich natürlich nicht so gut beim Berechnen, weil man immer erst umwandeln muss. Ich finde daher den Ansatz mit dem Int nicht schlecht. Wie speichere ich dann aber eine Formularfeld "tt.mm.yy" in das Property, wenn er doch gegen Int validiert?
Falls Du zum n:m-Validierungsproblem einen ordentlichen Ansatz gefunden hast, poste ihn bitte. Vielleicht als kleine Anregung: wenn ich im Extension-Builder eine Ext anlege und eine n:m-Beziehung einbaue, dann erhalte ich in dem einen Model eine Property von der anderen. In meinem Fall habe ich Orte, die sich in mehreren Regionen befinden können und eine Region hat logischerweise mehrere Orte. Lege ich die n:m-Beziehung an der Region an, erhalte ich dort folgendes Property:
/**
* city
*
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_City>
*/
protected $city;
Vielleicht kann mir jemand auf die Sprünge helfen, wofür dieses Property brauche, wenn ich doch noch eine n:m-Tabelle habe. Oder ist es am Ende genau für diese Fälle, vor deren Problem wagnerts steht, nämlich Validierung?
Beste Grüße,
Sven
Hallo,
ich habe jetzt die startTime von DateTime auf int umgestellt. Aber das Formatieren funktioniert nun doch nicht wie gesagt automatisch, sonder es wird:
"1324290180" could not be parsed by DateTime constructor.
Der Timestamp wird also übertragen aber
<f:format.date>{path.startTime}</f:format.date>
funktioniert irgendwie nicht.
Deine Variable {path.startTime} ist leer oder ungültig.
Der Format_Date Viewhelper sieht so aus:
public function render($date = NULL, $format = 'Y-m-d') {
if ($date === NULL) {
$date = $this->renderChildren();
if ($date === NULL) {
return '';
}
}
if (!$date instanceof DateTime) {
try {
$date = new DateTime($date);
} catch (Exception $exception) {
throw new Tx_Fluid_Core_ViewHelper_Exception('"' . $date . '" could not be parsed by DateTime constructor.', 1241722579);
}
}
return $date->format($format);
}
Wie man sieht wird einfach der Paramter $date (mixed) an den DateTime Construktor weitergereicht.
Wenn Du sicherstellst das $date ein gültiges Format (siehe DateTime Doku) hat, wird es also auch funktionieren.
Grüße
Alex
Da ich ach mit Int und einem eigenen Viewhelper das gleiche Problem hatte, also dass nach Validation alle Felder gelöscht wurden, denke ich, dass das Problem am ViewHelper selbst liegt.
Dieser bekommt beim darstellen das Datum überreicht und formatiert es korrekt.
Wird allerdings beim Validieren ein Fehler bemerkt, so wird dem ViewHelper nicht erneut das alte datum, bzw. der int timestamp übergeben, weshalb die Textfelder leer sind.
Ich habe nun die setter und getter von meinem objekt entsprechend umgeschrieben und benötige auf diese Weise keinen Viewhelper mehr.
So funktioniert dann auch die Validation.