form:error

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

form:error

Beitrag von GeneralCrime » 12.01.2019, 11:51:47

Hallo,

ich habe mal im APF 3.0 etwas geändert:

TextFieldValidator:107

Code: Alles auswählen

/* @var $listeners ValidationListenerTag[] */
$listeners = $form->getFormElementsByTagName('form:listener');
zu

Code: Alles auswählen

$listeners = [];
      $formErrorList = $form->getFormElementsByTagName('form:error');
      foreach ($formErrorList as $formError) {
         $childrenList = $formError->getChildren();
         $a = new ValidationListenerTag();
         foreach ($childrenList as $child) {
            if ($child instanceof $a)
               $listeners[] = $child;
         }
      }

/* @var $listeners ValidationListenerTag[] */
$listeners = array_merge($listeners,$form->getFormElementsByTagName('form:listener'));
Grund hierfür ist das im form:alert nie die listener ausgeführt werden.
Dadurch ist form:error nur als normale error nachricht zu gebrauchen.
Komplexer Errors sind zwar möglich durch zb:

Code: Alles auswählen

<form:error>
<ul>
</form:error>
<form:listener ...><li>...</li></form:listener>
<form:error>
</ul>
</form:error>
aber das ist sehr unschön.
Ich weis auch nicht ob das in der kommenden version 4.0 schon behoben wurde (wann geht die denn live bzw stable) oder ob man es noch besser lösen kann. Vieleicht könnt Ihr das ja noch mit einbauen

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 12.01.2019, 13:53:52

Ok das Funktioniert nur nicht wenn der Alert in einem form:block ist dort muss man dann die CHilds von dem ebenso lesen.

Zudem werden validatoren in block elementen nicht richtig ausgewertet immer nur der erste.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: form:error

Beitrag von dr.e. » 13.01.2019, 22:29:47

Hi,

korrekt, bisher sind <form:error /> oder <form:success /> als reine "Nachrichten"-Elemente gedacht, die unter bestimmten Bedingungen dargestellt werden. Der Vorteil der beiden Tags: du brauchst keinen zusätzlichen Controller-Code. Sollen in diesen Tags auch <form:listener />-Tags ausgewertet werden, müsste eine Anpassung der Implementierung erfolgen (Evaluierung der Inhalte von <form:error /> oder <form:success /> und eine Änderung der Benchrichtigung von <form:listener />-Tags).
Ich weis auch nicht ob das in der kommenden version 4.0 schon behoben wurde (wann geht die denn live bzw stable) oder ob man es noch besser lösen kann. Vielleicht könnt Ihr das ja noch mit einbauen
Das Verhalten in 4.0 ist aktuell identisch. <form:listener />-Tags werden nicht in <form:error /> oder <form:success /> ausgewertet. Ich halte das aber grundsätzlich für sinnvoll, denn dann ist dein Beispiel deutlich einfacher zu implementieren. Magst du dafür einen Tracker-Eintrag erstellen? Ich kümmere mich dann um die Umsetzung.

Version 4.0 soll Ende Januar als stable released werden. Grundsätzlich ist der GIT-Zweig aber schon seit ca. 2 Monaten stabil. Vielleicht kannst du deinen Fall mal mit der Version 4.0 nachstellen.
Ok das Funktioniert nur nicht wenn der Alert in einem form:block ist dort muss man dann die CHilds von dem ebenso lesen.
Wie sieht dein Template-Code dazu aus?
Zudem werden validatoren in block elementen nicht richtig ausgewertet immer nur der erste.
Das ist interessant. :? An sich wird ein Block-Element ganz normal aufgebaut (siehe ReusableFormBlockTag.php:54) und sollte daher auch ausgewertet werden. Kannst du mal ein Beispiel zur Reproduktion posten? Danke!
Viele Grüße,
Christian

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 15.01.2019, 07:47:59

Tracker: https://adventure-php-framework.org/tra ... php?id=341
Das andere Beispiel werde ich am We Posten muss das selber nochmal reproduzieren da es da 2 verhalten gab und ich derzeit wieder alles in 1 Template gepackt habe.

Kleine Vorschau: https://www.cenaturio-seelenhunde.de/?c ... &petid=432 ... man muss mal die urls aufrumen. Dort "Selbstauskunft online ausfüllen" die einzelnen Tabs waren in einzelnen Blocke inklusive <form:addvalidator> je tab.

Da kam er einmal nicht klar das der Submit Button in einem block (addvalidator dann ins main Template) und dann halt die benachrichtigung.
Genaueres Poste ich aber am we mit nem kleinen Beispiel

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: form:error

Beitrag von dr.e. » 15.01.2019, 14:21:51

Hi,

danke für den Tracker-Eintrag, ich kümmere mich drum!

<form:addvalidator />-Tags brauchen die Referenz zu einem Button, insofern kann es sein, dass du zum Zeitpunkt der Verarbeitung des Tags det Button noch nicht im Objekt-Baum existiert hat. Das kann dir auch in einem "normalen" Template passieren, wenn du den Button nach den <form:addvalidator />-Tags definierst. Der Parser "läuft" linear durch das Template (siehe https://adventure-php-framework.org/Sei ... ufdiagramm) und damit ergeben sich in bestimmten Fällen zeitliche Abhängigkeiten. Vielleicht hilft das... :)

Schaue mir dein Beispiel gerne im Detail an.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: form:error

Beitrag von dr.e. » 18.01.2019, 19:24:38

Hi,

die Implementierung im master ist abgeschlossen. Du kannst mit einem composer update die aktuelle Version ziehen.
Viele Grüße,
Christian

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 19.01.2019, 15:23:09

Bin grad dabei das um zu stellen auf den aktuellen master.
Bin grad bei der Migration, wo ich grad hänge ist das er alle Formulare sofort triggert das sie gesendet wurden.

Nachtrag:
Grad ein Formular gefunden das dieses Verhalten nicht zeigt. mal prüfen wo der Unterschied liegt.
PS: das APF Kontakt Formular hat dieses verhalten auch.

Nachtrag 2:
Liegt am Form Error sobald das existiert wird das Formular sofort gesendet

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 19.01.2019, 18:13:49

So hab jetzt noch das verhalten der markAsInvaild() Funktion getestet.

Es ist wirklich so das wenn Felder im form:block sich befinden und alle mit einem validator verknüpft werden (TextLength),
dann wird lediglich das erste Feld markiert. Sobald die Felder auserhalb des blocks sind werden alle markiert.
Umgehen kann man das nicht, (es gab mal ne Zeit da funktionierte das indem man jedes Feld einzeln dem Validator hinzufügt ohne |.

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 19.01.2019, 22:35:17

So das mit der validierung von nur einem Element im Form block habe ich auch gefunden und gefixt pull request ist raus.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: form:error

Beitrag von dr.e. » 20.01.2019, 15:14:56

Hi,

danke! Allerdings sehe ich den Pull-Request unter https://github.com/AdventurePHP/code/pulls nicht...

Woran lag der Fehler mit der Validierung im <form:block/>? Kann/sollte hier im APF noch etwas verbessert werden?
Viele Grüße,
Christian

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 20.01.2019, 21:40:46

verdammt ich kapier das nicht werd gleich mal schauen.

Im FormGroup Tag ab Zeile 55 wird nach einem invalid sofort beendet nicht aber der rest geprüft:

Angepasste funktion:
public function isValid() {
$result = true;
foreach ($this->children as &$child) {
if ($child instanceof FormControl) {
$result = $child->isValid() && $result;
}
}

return $result;
}

ich prüf mal warum die pull request nicht erscheinen villeich über sehe ich da was (hasse englisch)

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 20.01.2019, 21:41:15

ps ja und die änderung ist echt wichtig es sei den man hat nur 1 feld im block element.

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 20.01.2019, 21:48:54

Spam:
So hatte das falsche menü hab mir irgendwie selbst die gesendet.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: form:error

Beitrag von dr.e. » 20.01.2019, 22:22:55

Hi!

Danke dir für die Pull-Requests, habe sie soeben in den "master" gemerged. Werde bei Gelegenheit noch einen Unit Test dafür schreiben, dann fällt bei einer Änderung auch in Zukunft direkt auf, wenn das Verhalten nicht korrekt ist (sprich nicht alle Validatoren ausgeführt werden). :)

Funktionieren bei dir damit jetzt alle Anwendungsfälle?
Viele Grüße,
Christian

GeneralCrime
Beiträge: 91
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: form:error

Beitrag von GeneralCrime » 21.01.2019, 10:26:43

Ja Funktioniert alles, das andere "Beispiel" was ich hatte konnte ich nicht reproduzieren. Scheint wohl ein übersehender validator gewesen zu sein im form:block element. Dann ist das ja richtig das er den Button ggf. noch nicht kennt.

Antworten