[Extbase] Validierung von Formularfeldern

  • Sperber Sperber
    Padawan
    0 x
    41 Beiträge
    1 Hilfreiche Beiträge
    09. 07. 2010, 11:58

    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).

    1. Meine Funktion sieht wie folgt aus:
    2. /**
    3. * Speichert ein Objekt
    4. * @validate $irgendwas Tx_MyExtension_Domain_Validator_PrivacyValidator
    5. * @return void
    6. */
    7. function saveAction(Tx_MyExtension_Domain_Model_Irgendwas $irgendwas){ ... }

    Mein Validator wäre folgender:

    1. class Tx_MyExtension_Domain_Validator_PrivacyValidator extends Tx_Extbase_Validation_Validator_AbstractValidator{
    2. function isValid($isValid){
    3. /* So und wie greife ich jetzt hier auf Formulardaten zu, die nicht Teil des $irgendwas Objektes */
    4. ...
    5. }
    6. }

    Vielleicht hat jemand Ahnung und kann mir weiterhelfen.
    Sollte schließlich kein außergewöhnliches Problem sein.

    Viele Grüße
    Sascha


  • super-mario super-mar...
    Padawan
    0 x
    46 Beiträge
    0 Hilfreiche Beiträge
    12. 07. 2010, 09:29

    1. function isValid($isValid){
    2. /* So und wie greife ich jetzt hier auf Formulardaten zu, die nicht Teil des $irgendwas Objektes */
    3. if(!t3lib_div::_GP('form-field')){
    4. //->error
    5. }
    6. }

    so würde ichs versuchen

  • Sperber Sperber
    Padawan
    0 x
    41 Beiträge
    1 Hilfreiche Beiträge
    14. 07. 2010, 11:12

    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

  • fragile74 fragile74
    Jedi-Ritter
    0 x
    125 Beiträge
    0 Hilfreiche Beiträge
    05. 08. 2011, 11:51

    warum sind diese Felder kein Property im Model ? Damit machst du dir wie beschrieben unnötigen Mehraufwand bei der Fehlerauswertung...

  • jimmykimmy jimmykimm...
    Padawan
    0 x
    59 Beiträge
    0 Hilfreiche Beiträge
    08. 08. 2011, 12:21

    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

    1. public function isValid($value)
    2. {
    3. $this->errors = array();
    4. if( strlen($value) < 3 ) {
    5. $this->addError('Der Wert ist zu kurz (mind. 3 Zeichen)', 1806198601);
    6. return false;
    7. } elseif( strlen($value) > 10 ) {
    8. $this->addError('Der Wert ist zu kurz (max. 10 Zeichen)', 1806198602);
    9. return false;
    10. }
    11.  
    12. return true;
    13. }

    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?

  • georg.n georg.n
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    07. 10. 2011, 01:41

    [quote="jimmykimmy"]

    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?!

    [/quote]

    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

  • BFSven BFSven
    R2-D2
    0 x
    106 Beiträge
    1 Hilfreiche Beiträge
    19. 10. 2011, 09:57

    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:

    1. <f:form.errors for="formName.fieldName">
    2. <div class="error">
    3. {error.message}
    4. </div>
    5. </f:form.errors>

    Mein Validator enthält folgendes:

    1. if (strlen($value) < 3) {
    2. $this->addError(Tx_Extbase_Utility_Localization::translate('validator.valueTooShort', 'extensionName'), '1318842611');
    3. return false;
    4. }

    Und in meiner locallang steht:

    1. <label index="validator.valueTooShort">Bitte geben Sie mindestens 3 Zeichen ein.</label>

    Da ist, denke ich, jetzt alles dabei, bei mir funktionierts.

    Gruß, Sven

  • alisha alisha
    R2-D2
    0 x
    77 Beiträge
    0 Hilfreiche Beiträge
    07. 12. 2011, 16:07

    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ß

  • wagnerts wagnerts
    T3PO
    0 x
    14 Beiträge
    0 Hilfreiche Beiträge
    16. 12. 2011, 09:58

    @ 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

  • alisha alisha
    R2-D2
    0 x
    77 Beiträge
    0 Hilfreiche Beiträge
    16. 12. 2011, 12:14

    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:

    1. <f:form.errors for="newApplication" >
    2. <div class="error">
    3. <f:if condition="{error.propertyName}">
    4. <f:then>
    5. <f:for each="{error.errors}" as="errorDetail">
    6. <f:translate key="error.{error.propertyName}.{errorDetail.code}" default="{error.propertyName}{errorDetail.message} (#{errorDetail.code})"/> <br/>
    7. </f:for>
    8. </f:then>
    9. <f:else>
    10. {error.message}
    11. </f:else>
    12. </f:if>
    13. </div>
    14. </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

  • wagnerts wagnerts
    T3PO
    0 x
    14 Beiträge
    0 Hilfreiche Beiträge
    16. 12. 2011, 16:08

    Hallo,

    danke ich habe den Fehler mittlerweile selbst gelöst bekommen. Ich habe mir am Anfang alles über den Kickstarter erstellen lassen.

    <f:render partial="FormErrors" arguments="{formName: 'newPath'}"/>

    Dort hat das komplett arguments gefehlt, und so wurden mir wohl nur die Standardausgaben angezeigt.

    Habe nun auch die errorfields von sjr_offers übernommen und damit geht es prima. Danke für die Hilfe.