[Frage] Validator wird mehrmals aufgerufen [Gelöst]

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    21. 02. 2014, 11:33

    Langsam habe ich ein schlechtes Gewissen, dass ich das Forum so zuspamme, aber die Probleme / Fragen zu Extbase hören einfach nicht auf... Als Anfänger in Extbase ist es leider schwierig die Fehlerquellen immer genau zu erkennen, wenn nicht ganz klar ist, was das System im Hintergrund tut...

    Ich habe aktuell ein etwas "komplexeres" Suchformular, in dem von 4 Feldern mindestens eines ausgefüllt sein muss. Um das zu prüfen, nutze ich einen eigenen Validator. Dieser Validator wird bei der Übergabe des Suchformulars (ist ein eigenes Model / Objekt) an die Action aufgerufen mit
    @validate $searchrequest \Blubb\MyEctension\Domain\Validator\SearchrequestValidator
    Der Validator erstellt mit $this->addError(...) eine Fehlermeldung, wenn alle Felder leer sind und gibt false zurück - ansonsten true.

    Der Validator funktioniert auch einwandfrei. Er wird allerdings mehrmals aufgerufen (3x), weshalb dann natürlich 3x die selbe Fehlermeldung ausgegeben wird. Dass der Validator mehrfach aufgerufen wird, sehe ich zum Einen daran, dass eine Test-Ausgabe im Validator 3x erscheint und auch das request-Objekt enthält für die Suchanfrage im Array "errors" 3 Einträge mit der selben Fehlermeldung. Es liegt also nicht an dem Template, in dem die Fehler ausgegeben werden.

    Hat jemdand eine Idee, was diesen Fehler verursachen könnte?

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    01. 04. 2014, 15:51 - Lösung

    Hat sich erledigt, nach langem Debugging habe ich den Fehler gefunden...

    [b]Lösung:[/b]
    Nach meiner jetzigen Erkenntnis darf man eigene Validatoren nicht in der Form [Modelname]Validator benennen.

    [b]Erklärung (wen es interessiert)[/b]
    So wie ich das verstehe, führt Extbase immer, wenn ein Objekt als Parameter an eine Action übergeben wird, eine eigene Validierung durch, um zu prüfen, ob Extbase aus den Daten überhaupt ein Objekt erstellen kann. Dazu schaut Extbase erstmal im Order MyExt/Domain/Validator/ nach, ob eine Datei namens [Modelname]Validator.php vorhanden ist. Ist das nicht der Fall, prüft Extbase das Objekt nur mit seinem ObjectValidator entsprechend der Kommentare im betroffenen Model.

    Um eine eigene Validierung für mein Searchrequest-Objekt durchzuführen, hatte ich einen eigenen Validator namens SearchrequestValidator erstellt. Bei der Übergabe meines Searchrequest-Objektes an meine Action wird also mein eigener Validator ausgeführt und die Validierung von Extbase, um das Objekt überhaupt zu erstellen. Es wird folglich 2x der SearchrequestValidator aufgerufen.

    Warum kommt es nun, dass der Validator 3x ausgeführt wird? Ich vermute es liegt daran dass mein eigener Validator auch das Searchrequest-Objekt als Parameter benötigt, weshalb wiederum Extbase versucht hat, den Validator zur Objekterstellung aufzurufen. Dass das nicht in einer Endlosschleife endet, ist verwunderlich.

    Sollte ich mit meiner Erklärung falsch liegen, würde ich mich freuen, wenn es mir jemand korrekt erklärt :-)


  • 1
  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    28. 03. 2014, 09:48

    Ich hatte die Sache bis jetzt ruhen lassen, weil ich gehofft habe, dass sich das Problem mit der stable-Version von Typo3 6.2 selbst löst. Das ist aber leider nicht der Fall, weshalb ich das Thema nochmal hervorholen muss.

    Meine bisherige Erkenntnis ist, dass der Validator in der stable-Version von Typo3 6.2 immer noch 3x aufgerufen wird. Installiere ich die Erweiterung in Typo3 6.1, wird er "nur" 2x aufgerufen - immer noch ein Mal zu viel, aber immerhin...
    Dass der Validator 3x aufgerufen wird, passiert übrigens nicht nur mit dem Validator für mein Suchformular, sondern auch mit anderen eigenen Validatoren aus meiner eigenen Extension.
    Erstellt und aufgerufen habe ich die Validatoren ganz normal "nach Lehrbuch"...

    Kreative Vorschläge? :)

  • 0 x
    64 Beiträge
    4 Hilfreiche Beiträge
    01. 04. 2014, 15:51

    Hat sich erledigt, nach langem Debugging habe ich den Fehler gefunden...

    [b]Lösung:[/b]
    Nach meiner jetzigen Erkenntnis darf man eigene Validatoren nicht in der Form [Modelname]Validator benennen.

    [b]Erklärung (wen es interessiert)[/b]
    So wie ich das verstehe, führt Extbase immer, wenn ein Objekt als Parameter an eine Action übergeben wird, eine eigene Validierung durch, um zu prüfen, ob Extbase aus den Daten überhaupt ein Objekt erstellen kann. Dazu schaut Extbase erstmal im Order MyExt/Domain/Validator/ nach, ob eine Datei namens [Modelname]Validator.php vorhanden ist. Ist das nicht der Fall, prüft Extbase das Objekt nur mit seinem ObjectValidator entsprechend der Kommentare im betroffenen Model.

    Um eine eigene Validierung für mein Searchrequest-Objekt durchzuführen, hatte ich einen eigenen Validator namens SearchrequestValidator erstellt. Bei der Übergabe meines Searchrequest-Objektes an meine Action wird also mein eigener Validator ausgeführt und die Validierung von Extbase, um das Objekt überhaupt zu erstellen. Es wird folglich 2x der SearchrequestValidator aufgerufen.

    Warum kommt es nun, dass der Validator 3x ausgeführt wird? Ich vermute es liegt daran dass mein eigener Validator auch das Searchrequest-Objekt als Parameter benötigt, weshalb wiederum Extbase versucht hat, den Validator zur Objekterstellung aufzurufen. Dass das nicht in einer Endlosschleife endet, ist verwunderlich.

    Sollte ich mit meiner Erklärung falsch liegen, würde ich mich freuen, wenn es mir jemand korrekt erklärt :-)

  • InforMedic InforMedi...
    Jedi-Meister
    0 x
    394 Beiträge
    1 Hilfreiche Beiträge
    02. 07. 2015, 18:41

    Hi,

    danke für den Hinweis. Genau das war es bei mir auch.

    Über ein Slideout Panel, welches ext:form und ts:text enthält (per TS Object im Fluid eingebunden), habe ich auf allen Seiten ein Kontaktformular. Das beisst sich natürlich mit den dann doppelten ext:forms wie z.B. auf meiner Haupt Kontakt Seite oder Newsletter seite. Per TS Condition habe ich dann einfach dafür gesorgt, dass das slideout Kontaktformular auf den entsprechenden Seiten eleminiert wird und siehe da, es wird nur noch einmal der Validator aufgerufen.

    Muchas Gracias

  • 1