View Issue Details

IDProjectCategoryView StatusLast Update
0000347Adventure PHP FrameworkNeues Feature // New Featurepublic2019-03-22 19:33
ReporterGeneral CrimeAssigned ToChristianAchatz 
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status resolvedResolutionfixed 
Product Version 
Target Version4.1Fixed in Version4.1 
Summary0000347: 1 Listener viele Formularfelder
DescriptionIch bin mir grad nicht sicher ob ich nur grad nicht drauf kommen aber ich hab nun folgendes Problem.

1. Einen Listener für die Text länge.
2. unbestimmte anzahl an Input Feldern.

Wenn bei der Eingabe eins davon zuwenig Zeichen hat wird dieses auch wunderbar markiert.
Der Listener jedoch nicht da dieser entweder das Attribute control mit dem Namen des Feldes haben muss oder wenn der Listener special ist. sowohl den namen des Feldes im Control als auch den Validator namen in Validator.

Da ich aber nur diesen 1 Listener habe der nur auf TextLenght Validator hören soll egal welches control, stehe ich vor meinem Problem.

Mir fällt nun nur ein, je Feld 1 Listener zu generieren. (In meinem Fall extrem uncool)

Darum dachte ich an ein weiteren Wert für das Attribute type: single
Dieser Wert ruft als controlName NULL auf und beim validator wie das special den Klassennamen des Validators und prüft das.
Dadurch wird ein listener

<form:listener validator="APF\tools\form\validator\TextLengthValidator">
  • Der Name muss zwischen 3 und 16 Zeichen lang sein!

  • </form:listener>
    benachrichtigt und alle weitere mit dem selben validator + control attribute jedoch nicht.
    Der Wert "single" dachte ich ist dadurch einleuchtend ggf "singlelistener"
    Steps To Reproduce<form:error>

      <form:listener validator="APF\tools\form\validator\TextLengthValidator">
    • Der Name muss zwischen 3 und 16 Zeichen lang sein!

    • </form:listener>
      [andere listener die mit namen angesprochen werden.]

    </form:error>
    in php generierter TextLengthValidator(...) für alle <form:text .../> felder
    Additional InformationIch habe bereits dementsprechend was erstellt warte nur auf ggf. kommentare bevor ich einen pull request anlege.
    TagsNo tags attached.
    Codereferenz: ([Datei]:[Zeile])
    Namespacetools

    Activities

    ChristianAchatz

    2019-03-17 20:37

    administrator   ~0000920

    Hi!

    Schaue ich mir in dieser Woche an!

    General Crime

    2019-03-18 08:33

    developer   ~0000921

    Ich habe meine Idee mal als Pull Request hinterlegt: https://github.com/AdventurePHP/code/pull/32

    ChristianAchatz

    2019-03-19 23:05

    administrator   ~0000924

    Habe mir deinen Anwendungsfall und die zugehörigen Änderungen angesehen. Finde die Erweiterung absolut sinnvoll, da du dir so unglaublich viel Markup und Redundanzen im Template sparst. Hast meine volle Unterstützung für das Feature! :)

    Was die Implementierung angeht, würde ich gerne nochmal überlegen, ob ein Attribut "single" oder kein Attribut oder auch z.B. ein neues Attribut "multiple=true" (o.ä.) den Listener speziell markieren sollte. Die Lösung über den "null"-Wert für das Control funktioniert technisch, nur finde ich es nicht ganz so sauber.

    Intuitiv würde ich im Template so etwas erwarten wie

    <form:listener validator="..." listen-on-all-form-controls="true"> ... </form:listener>

    Mal sehen, ob mir noch ein besserer Name für das Attribut einfällt. Ideen?

    General Crime

    2019-03-20 17:17

    developer   ~0000925

    Also sozusagen das ich nur die Bedingung manipuliere ohne andere daten zu verlangen!?

    listen-on-all-form-controls passt finde ich nicht listen-on-all-form-fields hingegen besser auch wenn das wieder nicht 100% das besagt was es macht.

    ChristianAchatz

    2019-03-20 23:40

    administrator   ~0000926

    Hi!

    Ich habe nochmal drüber nachgedacht und deine Implementierung gefällt mir am Ende doch am besten! :) Ich habe lokal einige Schreibweisen ausprobiert und schlage folgende Notation vor:

    <html:form ...>
    <form:error>
       <form:listener validator="APF\tools\form\validator\TextLengthValidator">
          Fields must be filled with 3 to 16 characters!
       </form:listener>
    </form:error>
    <form:text name="first-name" />
    <form:text name="last-name" />
    <form:text name="e-mail" />
    <form:button name="submit" value="submit"/>
    <form:addvalidator class="APF\tools\form\validator\TextLengthValidator" button="submit" control="first-name|last-name|e-mail" type="generic"/>
    </html:form>

    Der Validator ist für mehrere Felder "zuständig", damit gefällt mir "generic" für die Deklaration des Validators sehr gut. In deiner Implementierung wäre also nur

    $SINGLE_VALIDATOR_INDICATOR

    durch

    $GENERIC_VALIDATOR_INDICATOR

    zu tauschen und schon passt das!

    Wenn du einverstanden bist, merge ich deinen Pull-Request, passe die Benennung an und schreibe noch einen weiteren Unit-Test, da die Listener keine wirklich gute Abdeckung haben.

    General Crime

    2019-03-21 09:07

    developer   ~0000927

    Last edited: 2019-03-21 09:09

    View 2 revisions

    Ja kannst du gerne machen.

    PS: glaube kleine anpassungen müssen dann noch gemacht werden, weil dasAttribute bei mir im listener steckt und bei dir im validator.

    ChristianAchatz

    2019-03-22 12:49

    administrator   ~0000928

    Pull-Request ist integriert und die vorgeschlagenen Änderungen habe ich auch eingecheckt (siehe https://github.com/AdventurePHP/code/commit/689cad49c585f8c32fd639f3a87e81c7c9f947e4).

    Ich nehme mir jetzt noch die Zeit und schreibe ein paar Unit-Tests zu den Listenern allgemein, natürlich mit diesem Fall eingeschlossen.

    Was das "type"-Attribut angeht: deine Änderungen haben vorgesehen, dasd das Atribut im Validator geprüft wird. Insofern ist es am <form:addvalidator /> Tag schon richtig. Das Attribut "type" wird von diesem Tag dann in den Konstruktor eines FormValidator injiziert. Sollte mir beim Tests schreiben noch etwas auffallen, dann fixe ich das natürlich gleich. :)

    ChristianAchatz

    2019-03-22 12:50

    administrator   ~0000929

    Ganz vergessen: wenn du magst, dann teste gerne mal mit dem master bei dir lokal.

    ChristianAchatz

    2019-03-22 19:32

    administrator   ~0000931

    Habe mit dem Commit https://github.com/AdventurePHP/code/commit/4d068c9f7b403258d3c044e4ba7007e69a5bb726 Unit Tests für die Listener-Funktionalität hinzugefügt und auch die Dokumentation aktualisiert (siehe https://github.com/AdventurePHP/docs/commit/d6b38684c30de02ac20e12ebc973893424f9ccb9). Aus meiner Sicht ist das Issue nun erledigt.

    Freue mich auf dein Feedback!

    Issue History

    Date Modified Username Field Change
    2019-03-17 16:20 General Crime New Issue
    2019-03-17 16:20 General Crime Status new => assigned
    2019-03-17 16:20 General Crime Assigned To => General Crime
    2019-03-17 20:37 ChristianAchatz Note Added: 0000920
    2019-03-18 08:33 General Crime Note Added: 0000921
    2019-03-19 23:05 ChristianAchatz Note Added: 0000924
    2019-03-20 17:17 General Crime Note Added: 0000925
    2019-03-20 23:40 ChristianAchatz Note Added: 0000926
    2019-03-21 09:07 General Crime Note Added: 0000927
    2019-03-21 09:09 General Crime Note Edited: 0000927 View Revisions
    2019-03-22 12:49 ChristianAchatz Note Added: 0000928
    2019-03-22 12:50 ChristianAchatz Note Added: 0000929
    2019-03-22 19:32 ChristianAchatz Note Added: 0000931
    2019-03-22 19:33 ChristianAchatz Assigned To General Crime => ChristianAchatz
    2019-03-22 19:33 ChristianAchatz Status assigned => resolved
    2019-03-22 19:33 ChristianAchatz Resolution open => fixed
    2019-03-22 19:33 ChristianAchatz Fixed in Version => 4.1