[Extbase] Validierung von Formularfeldern
| Autor | Nachricht |
|---|---|
|
Verfasst am: 09. 07. 2010 [11:58]
|
|
|
Sperber
Themenersteller
Dabei seit: 12.10.2006
Beiträge: 41
|
Hallo zusammen, wahrscheinlich ganz einfach, aber ich weiss es leider nicht. Ich möchte Formularfelder validieren, die kein Property im Model sind, also z.B. ob die Datenschutzrichtlinien gelesen worden sind oder Ähnliches (aktive Checkbox). PHP Meine Funktion sieht wie folgt aus:
/**
* Speichert ein Objekt
* @validate $irgendwas Tx_MyExtension_Domain_Validator_PrivacyValidator
* @return void
*/
function saveAction(Tx_MyExtension_Domain_Model_Irgendwas $irgendwas){ ... }Mein Validator wäre folgender: PHP class Tx_MyExtension_Domain_Validator_PrivacyValidator extends Tx_Extbase_Validation_Validator_AbstractValidator{
function isValid($isValid){
/* So und wie greife ich jetzt hier auf Formulardaten zu, die nicht Teil des $irgendwas Objektes */
...
}
}Vielleicht hat jemand Ahnung und kann mir weiterhelfen. Sollte schließlich kein außergewöhnliches Problem sein. Viele Grüße Sascha |
|
Verfasst am: 12. 07. 2010 [09:29]
|
|
|
super-mario
Dabei seit: 26.02.2007
Beiträge: 46
|
PHP function isValid($isValid){
/* So und wie greife ich jetzt hier auf Formulardaten zu, die nicht Teil des $irgendwas Objektes */
if(!t3lib_div::_GP('form-field')){
//->error
}
}so würde ichs versuchen |
|
Verfasst am: 14. 07. 2010 [11:12]
|
|
|
Sperber
Themenersteller
Dabei seit: 12.10.2006
Beiträge: 41
|
Wie banal! Aber ja, so geht es. Das Error-Handling ist dann zwar wieder knifflig, aber hinten durch die Brust habe ich das dann auch hinbekommen. Vielen Dank Sascha |
|
Verfasst am: 05. 08. 2011 [11:51]
|
|
|
fragile74
Dabei seit: 24.07.2006
Beiträge: 126
|
warum sind diese Felder kein Property im Model ? Damit machst du dir wie beschrieben unnötigen Mehraufwand bei der Fehlerauswertung... |
|
Verfasst am: 08. 08. 2011 [12:21]
|
|
|
jimmykimmy
Dabei seit: 28.07.2011
Beiträge: 58
|
Ich habe auch ein Problem mit der Validierung. Ich habe eine eigene Validierung geschrieben und diese per Annotation direkt ins Model über meine zu validierende Variable geschrieben. Das klappt auch alles super. Ich wollte nun die Fehlermeldungen übersetzen und in XML Dokument schreiben, dazu muss ich ja auf den Error-Code verweisen (den ich auch selber setz) Meine isValid()-Funktion PHP public function isValid($value)
{
$this->errors = array();
if( strlen($value) < 3 ) {
$this->addError('Der Wert ist zu kurz (mind. 3 Zeichen)', 1806198601);
return false;
} elseif( strlen($value) > 10 ) {
$this->addError('Der Wert ist zu kurz (max. 10 Zeichen)', 1806198602);
return false;
}
return true;
}Bei fehlerhaften Eingaben erhalte ich zwar auch einen Fehler, aber leider folgenden: Validation errors for property "name" (1242859509) Woher kommt der Error-Code "1242859509"? Ich habe oben doch einen anderen angegeben. habe nachgeschaut, wo der obenstehende Code herkommt. Dieser ist fest im Typo3 Code verankert, sollte aber meines Erachtens durch meinen Aufruf ($this->addError("....",18061986001)) überschrieben worden sein?! Quelle: http://doxygen.frozenkiwi.com/typo3/html/d7/d43/PropertyError_8php_source.html#l00047 (Zeile 47) Kann mir jemand weiterhelfen? |
|
Verfasst am: 07. 10. 2011 [01:41]
|
|
|
georg.n
Dabei seit: 05.10.2011
Beiträge: 2
|
jimmykimmy schrieb: Validation errors for property "name" (1242859509) Woher kommt der Error-Code "1242859509"? Ich habe oben doch einen anderen angegeben. habe nachgeschaut, wo der obenstehende Code herkommt. Dieser ist fest im Typo3 Code verankert, sollte aber meines Erachtens durch meinen Aufruf ($this->addError("....",18061986001)) überschrieben worden sein?! Der Error-Code soll eindeutig sein und wird vom Entwickler festgelegt. Es hat sich da eingebürgert dern aktuellen Timestamp zu nehmen. Grüße Georg |
|
Verfasst am: 19. 10. 2011 [09:57]
|
|
|
BFSven
Dabei seit: 19.10.2011
Beiträge: 106
|
Na das war ja nun mal absolut nicht hilfreich, Georg. Falls es Dir noch hilft, Jimmy, ist zwar ein Lösungsansatz in Extbase, aber wird ja ähnlich, wenn nicht gleich sein. Auf den Fehler greife ich in Fluid folgendermaßen zu: HTML <f:form.errors for="formName.fieldName"> <div class="error"> {error.message} </div> </f:form.errors> Mein Validator enthält folgendes: PHP if (strlen($value) < 3) {
$this->addError(Tx_Extbase_Utility_Localization::translate('validator.valueTooShort', 'extensionName'), '1318842611');
return false;
}Und in meiner locallang steht: HTML <label index="validator.valueTooShort">Bitte geben Sie mindestens 3 Zeichen ein.</label> Da ist, denke ich, jetzt alles dabei, bei mir funktionierts. Gruß, Sven |
|
Verfasst am: 07. 12. 2011 [16:07]
|
|
|
alisha
Dabei seit: 04.12.2006
Beiträge: 59
|
Hallo, ich schieb das mal hoch, weil ich dazu eine Frage habe zur Fehlermeldung / Ausgabe in Fluid: Wenn ich wie oben beschrieben (im Beitrag von BFSven) umsetze <f:form.errors for="formName.fieldName"> <div class="error"> {error.message} </div> </f:form.errors> wird mir der Fehler nicht ausgegeben. Nur wenn ich auf das "for="" verzichte. Dann wird aber auch nicht die übersetze Fehlermeldung ausgegeben, sondern eine neutrale.. Die Standard-Validierung dagegen wird bei form.errors for="formName" richtig ausgegeben, auch mit Übersetzung. Müsste die Erros von der Validatorklasse nicht in das gleiche Error-Array geschrieben werden wie bei der Standard-Validierung? Danke und Gruß |
|
Verfasst am: 16. 12. 2011 [09:58]
|
|
|
wagnerts
Dabei seit: 02.11.2011
Beiträge: 14
|
@ alisha $ Jimmikimmy habt ihr mittlerweile eine Lösung gefunden? Hallo ich habe genau das gleiche Problem. Ich würde gerne für die einzelnen Properties meines Models eigene Validatoren implementieren, damit ich eigene Fehlermeldungen ausgeben kann. Ich habe alle Ratschläge umgesetzt, bekomme aber immer die Standardausgabe: Validation errors for property "startTime" newPath 1242859509 Folgendes ist mir aufgefallen, da ja verschiedene Varianten der Validation existieren: 1. Standardvalidatoren benutzten für Properties -> Standard-Error-Msg + Felder werden Rot Markiert 2. Eigene Validatoren für Properties -> Standard-Error-Msg + Felder werden Rot Markiert HIER WILL ICH MEINE EIGENEN MSGs 3. Validator für Model-Klasse -> Kompelexere überprüfen auf der gesamten Klasse. Hier funktionieren meine eigenen Fehlercodes, aber die Felder des Formulars werden nichtmehr markiert, ist ja auch klar, da nicht bekannt ist wo der Fehler auftritt. Ich würde also gerne simple Validations für 2. Schreiben, damit ich die Felder rot markieren kann, und bei komplexeren Fehlern 3. verwenden (und auf das rot markieren verzichten). Wäre über hilfe dankbar [Dieser Beitrag wurde 1mal bearbeitet, zuletzt am 16.12.2011 um 10:12.] |
|
Verfasst am: 16. 12. 2011 [12:14]
|
|
|
alisha
Dabei seit: 04.12.2006
Beiträge: 59
|
Hi, ich habe auch eine Validatorklasse gemacht, die Fehlermeldungen ausgeben soll und habe nun nach einigem rumprobieren und debuggen folgende Lösung gefunden: im html-Template: HTML <f:form.errors for="newApplication" > <div class="error"> <f:if condition="{error.propertyName}"> <f:then> <f:for each="{error.errors}" as="errorDetail"> <f:translate key="error.{error.propertyName}.{errorDetail.code}" default="{error.propertyName}{errorDetail.message} (#{errorDetail.code})"/> <br/> </f:for> </f:then> <f:else> {error.message} </f:else> </f:if> </div> </f:form.errors> Dadurch werden oben zunächst die normalen property-Fehlermeldungen ausgegeben mit rot markierten Feldern und anschließend noch die aus Validatorklasse. In der Validatorklasse füge ich den Error wie oft dokumentiert bei: $this->addError ("fehlerbla", 1234567891); bzw. halt mit Übersetzung... vielleicht hilft dir das ja... viele Grüße Alisha |



