fehler bei dem Beispiel mit dem Taschenrechner?

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Antworten
dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dingsda » 04.02.2014, 00:14:02

Hallo,
bin mir nicht sicher ob ich hier richtig bin und ob es sich nun um nen fehler in der Beispieldatei handelt oder ob ich was falsch gemacht hab...

Es geht um das calc-example im Downloadbereich.
ich versuche grad es zu verstehen um dadurch nen Einstieg in das Framework zu finden.

Jedenfalls sind da ja anscheinend an zwei Stellen im calc.html Fehlermeldungen vorgesehen:

Code: Alles auswählen

         <form:error>
            <p class="error">The input fields contain wrong content!</p>
         </form:error> 
und

Code: Alles auswählen

         <form:listener control="operand2" validator="ZeroDivisionValidator">
            <p class="error">Error: detected division by zero!</p>
         </form:listener>
Jedenfalls würde ich ja die erste Fehlermeldung erwarten, wenn ich für einen der zwei Operanden z.b. einen String angebe. Und das wohl deshalb auch in calc.html der NumberValidator zu finden ist.

Und die zweite Fehlermeldung erwarte ich, wenn ich ne Null bei einer Division als zweiten Operanden angebe. Das wird dann wohl über den ZeroDivisionValidator überprüft.

Mein Problem: Die Fehlermeldungen erscheinen nicht so wie ich sie erwarte. Wenn ich eine nicht-Nummer in eines der Felder eintrage wird dort einfach Null angenommen und damit gerechnet anstatt die Fehlermeldung auszugeben. Und wenn ich eine Division ausführen möchte und bei Operand 2 eine Null eintrage erscheint die erste Fehlermeldung und nicht die Zweite.

Es ist schwer aus einem Beispiel zu lernen wenn man sich nicht sicher ist, ob das Beispiel denn überhaupt richtig läuft.
Ich hab keine der Dateien geändert sondern den Inhalt des zip-Archivs so wie es ist in einen Ordner im htdocs-Verzeichnis von XAMPP entpackt. Da dürfte ja von meiner Seite nicht viel Fehlerpotential sein.

Also kurz nochmal meine Frage: Ist da ein Fehler eingebaut? Und wie müsste das Beispiel richtig aussehen?
Ich hoffe, die Frage gab es nicht schon. Suche hat zumindest nichts gefunden.

lg, Dingsda

Edit:
hab grad mal den code bei APF\tools\form\validator\NumberValidator.php ein bischen verändert.

Code: Alles auswählen

   public function validate($input) {
       if(is_numeric(trim($input)))
           echo "nummer  ";
       else 
           echo "nich nummer";
      return is_numeric(trim($input));
   }
egal ob ich nen Text oder ne Zahl für die Operanden eingebe, es wird immer "nummer" ausgegeben über echo. Wenn ich aber ein return false vor das eigentliche return einbaue kommt die erwartete Fehlermeldung "The input fields contain wrong content!". Also stimmt wohl was mit der Funktion is_numeric(trim($input)) nicht. Wobei ich nicht weiß was. Die sollte ja eigentlich an der Stelle schon richtig sein, wenn ich das php-Manual richtig lese.
edit 2:
Wahrscheinlicher ist wohl das die Variable $input schon verändert wird, bevor sie beim NumberValidator ankommt. z.B. durch einen Type Cast. Aber da steig ich noch nicht ganz durch wo das passiert sein könnte. Mit OOP tu ich mich noch schwer. Prozedural wäre der Fehler bestimmt leichter zu finden :D

edit 3:
fehler gefunden:
bevor der input beim NumberValidator ankommt geht er erst durch den FloatFilter bei APF\tools\form\filter\FloatFilter.php
und die Methode filter gibt dann

Code: Alles auswählen

floatval(str_replace(',', '.', str_replace(' ', '', $input)));
zurück. Also wird erst in ne Gleitkommazahl gecastet bevor überprüft wird, ob es denn überhaupt ne Nummer ist. Frage bleibt dann nur wie ich die Reihenfolge umstellen könnte.

Mal schauen, ob ich den Fehler für die fehlende Division-by-zero-fehlermeldung noch finde

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

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dr.e. » 04.02.2014, 15:37:01

Hallo dingsda,

herzlich willkommen im APF-Forum! :)
ich versuche grad es zu verstehen um dadurch nen Einstieg in das Framework zu finden.
Das freut mich. Zur Einarbeitung eignen sich v.a. die Seiten
Solltest du weitere Hilfe benötigen, sag gerne Bescheid. Die Komponenten des APF und deren Verwendung werden jeweils unter http://adventure-php-framework.org/Seit ... umentation beschrieben (z.B. http://adventure-php-framework.org/Seite/047-Templates).

Das Beispiel sollte an sich schon so funktionieren, wie du es erwartest - schließlich gibt es ja zwei verschiedene Fehlermeldungen. ;) Die Beispiele wurden vor einigen Releases mal erstellt - speziell dieses - und können natürlich Fehler enthalten.

Wenn du einen Fehler gefunden hast, eröffne gerne ein Issue unter http://tracker.adventure-php-framework.org, sofern du potentielle Fixes hast, immer gerne!
Viele Grüße,
Christian

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dingsda » 04.02.2014, 16:30:25

dr.e. hat geschrieben: Das freut mich. Zur Einarbeitung eignen sich v.a. die Seiten
hab ich alle schon gelesen. und auch sonst so einiges in der doku und den tutorials.
wenn ich alles komplett durchhab werd ich vielleicht wissen, wo es noch hackt damit ich fragen stelle. im moment geht das noch nicht so konkret.

außer eben hier bei dem taschenrechnerbeispiel.
Das Beispiel sollte an sich schon so funktionieren, wie du es erwartest - schließlich gibt es ja zwei verschiedene Fehlermeldungen. ;) Die Beispiele wurden vor einigen Releases mal erstellt - speziell dieses - und können natürlich Fehler enthalten.
wenns funktionieren würde hätte ich ja kein problem ;)
aber ich hab mir auch schon gedacht, dass es wahrscheinlich noch bei einer früheren version erstellt wurde und deshalb jetzt anders läuft als es eigentlich sollte.
dr.e. hat geschrieben: Wenn du einen Fehler gefunden hast, eröffne gerne ein Issue unter http://tracker.adventure-php-framework.org, sofern du potentielle Fixes hast, immer gerne!
ich werd da mal heute abend reinschauen und gucken, wie das dort genau läuft. zumindest für das erste problem hab ich ja wahrscheinlich zumindest nen ansatz für nen fix gefunden.
der floatfilter muss entweder umgeschrieben werden, das er nen string zurückgibt und keine gleitkommazahl oder dass man für das beispiel nen eigenen floatfilter schreibt und den vom apf unberührt lässt.
meine erste idee war ja, dass man validiert bevor gefiltert wird. ist das überhaupt möglich? ich hab es nicht hingekriegt, dass das passiert. es wird immer erst gefiltert, dann validiert. aber es würde hier in dem beispiel sowieso nicht helfen. denn wenn nicht vor dem validieren gefiltert wird gibt ja der numbervalidator bei 2,3 z.b. false zurück wegen dem komma.

bei dem divisionbyzeroproblem komm ich leider absolut nicht weiter. ich versteh nicht wieso da nicht die richtige fehlermeldung ausgespuckt wird. werde mir aber heute mal in ruhe nochmal das mit den listenern und validatoren anschauen. so richtig hab ich noch nicht verstanden wie die funktionieren.

eigentlich ist es ja blöd, wenn so ein beispiel, das dafür gedacht ist anfängern zu zeigen wie es aussehen soll, nicht richtig funktioniert. aber ich glaube die fehlersuche in diesem beispiel hilft mir grad wirklich mehr als wenn es einfach funktioniert hätte :D

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dingsda » 04.02.2014, 16:53:22

ein konkrete frage hab ich jetzt doch

und zwar hatte ich schon nachdem ich den floatfilter in verdacht hatte erstmal versucht das zu testen in dem ich da addfilter innerhalb des formultag auskommentiert habe. hab es mit <!-- --> wie für html und mit // für php versucht. das erste wurde einfach ignoriert. das zweite ergab ne fehlermeldung. gibt es ne möglichkeit wie ich bei nem formtag validatoren oder filter auskommentieren kann? oder muss man da gleich teile des codes löschen? fände das etwas blöd, weil ich meist was auskommentiere wenn ich irgendwo nen fehler vermute.

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dingsda » 04.02.2014, 18:03:22

dingsda hat geschrieben:bei dem divisionbyzeroproblem komm ich leider absolut nicht weiter. ich versteh nicht wieso da nicht die richtige fehlermeldung ausgespuckt wird. werde mir aber heute mal in ruhe nochmal das mit den listenern und validatoren anschauen. so richtig hab ich noch nicht verstanden wie die funktionieren.
fehler gefunden

Code: Alles auswählen

         
<form:listener control="operand2" validator="ZeroDivisionValidator">
    <p class="error">Error: detected division by zero!</p>
</form:listener>
der fehler liegt in der angabe des Validators

Code: Alles auswählen

        
<form:listener control="operand2" validator="APF\examples\calc\pres\validator\ZeroDivisionValidator">
    <p class="error">Error: detected division by zero!</p>
</form:listener>
so funktioniert der listener jetzt richtig und gibt die Fehlermeldung aus.

hach ist das nervig wenn die lösung am ende doch so einfach ist :D

edit: vor der arbeit schaff ich es wohl nicht mehr. aber wenn ich heute abend nach hause komme werd ich mal bei diesem bugtracker die gefixte version hinschicken

edit: habs bei dem tracker nun gemeldet mit fix-vorschlag ;)

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

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dr.e. » 04.02.2014, 22:52:03

Hallo dingsda,

ich versuche deine Beiträge chronologisch zu beantworten:
der floatfilter muss entweder umgeschrieben werden, das er nen string zurückgibt und keine gleitkommazahl oder dass man für das beispiel nen eigenen floatfilter schreibt und den vom apf unberührt lässt.
Der FloatFilter ist an sich schon richtig, da er den entsprechenden Datentypen zurück liefert. Zumindest war das die ursprüngliche Intention (siehe http://adventure-php-framework.org/Seit ... loatFilter). Ich schlage als Optimierung vor, für die Filter und Validatoren Unit Tests zu schreiben um darüber auch interpretierbare Details zu dokumentieren. Habe hierzu ein Issue angelegt: http://tracker.adventure-php-framework. ... php?id=138
meine erste idee war ja, dass man validiert bevor gefiltert wird. ist das überhaupt möglich? ich hab es nicht hingekriegt, dass das passiert. es wird immer erst gefiltert, dann validiert.
Nein, das ist nicht vorgesehen. Grund: der Filter verändert und der Validator prüft nur. Würde ich erst prüfen, dann filtern, so hat der Filter keinen Effekt, sprich eine (dann erst nachträglich) korrigierte Eingabe wird (trotz Filter) als falsch gewertet.
eigentlich ist es ja blöd, wenn so ein beispiel, das dafür gedacht ist anfängern zu zeigen wie es aussehen soll, nicht richtig funktioniert. aber ich glaube die fehlersuche in diesem beispiel hilft mir grad wirklich mehr als wenn es einfach funktioniert hätte :D
Da hast du Recht, das ist wirklich blöd! :? Da du den Fehler weiter oben (vor meinem Post) schon gefunden hast, hat das aber sicher etwas gebracht. :)
und zwar hatte ich schon nachdem ich den floatfilter in verdacht hatte erstmal versucht das zu testen in dem ich da addfilter innerhalb des formultag auskommentiert habe. hab es mit <!-- --> wie für html und mit // für php versucht. das erste wurde einfach ignoriert. das zweite ergab ne fehlermeldung. gibt es ne möglichkeit wie ich bei nem formtag validatoren oder filter auskommentieren kann? oder muss man da gleich teile des codes löschen? fände das etwas blöd, weil ich meist was auskommentiere wenn ich irgendwo nen fehler vermute.
"Echte" Kommentare für Tags gibt es nicht. Grund: der APF-Parser ist kein komplett implementierter XML-Parser, sondern interpretiert nur die bekannten Tags. Damit ist ein HTML- sowie PHP-Kommentar wirkungslos. Ein Workaround hierfür ist, den Tag mit zwei ":" auszustatten. Beispiel:

Code: Alles auswählen

<core::addtaglib .../>
Damt erkennt der Parser nicht mehr, dass das ein

Code: Alles auswählen

<core:addtaglib />
ist und damit kannst du den Tag auskommentieren.
Fehler gefunden

[..]

der fehler liegt in der angabe des Validators
Freut mich! Hintergrund zum Fehler: du kannst unter Angabe eines definierten Validators den Listener nur bei Anschlagen des speziellen Validators triggern lassen. Siehe Doku unter http://adventure-php-framework.org/Seit ... 8-Listener.
edit: habs bei dem tracker nun gemeldet mit fix-vorschlag ;)
Vielen Dank! Sehr mir gleich noch an und merge den Code nach 2.1 ins SVN.

Vielen Dank für deine Analyse & noch weiterhin viel Spass mit dem APF! Bei Fragen nicht scheuen - einfach fragen! ;)
Viele Grüße,
Christian

dingsda
Beiträge: 49
Registriert: 03.02.2014, 04:00:36

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dingsda » 05.02.2014, 01:56:03

dr.e. hat geschrieben:Nein, das ist nicht vorgesehen. Grund: der Filter verändert und der Validator prüft nur. Würde ich erst prüfen, dann filtern, so hat der Filter keinen Effekt, sprich eine (dann erst nachträglich) korrigierte Eingabe wird (trotz Filter) als falsch gewertet.
ergibt sinn. hab ich dann auch in dem beispiel selbst bemerkt.
Da hast du Recht, das ist wirklich blöd! :? Da du den Fehler weiter oben (vor meinem Post) schon gefunden hast, hat das aber sicher etwas gebracht. :)
und wie. als nächstes prüfe ich noch die anderen beispiele auf herz und nieren und dann bin ich soweit was eigenes anzufangen. :mrgreen:
dr.e. hat geschrieben:"Echte" Kommentare für Tags gibt es nicht. Grund: der APF-Parser ist kein komplett implementierter XML-Parser, sondern interpretiert nur die bekannten Tags. Damit ist ein HTML- sowie PHP-Kommentar wirkungslos. Ein Workaround hierfür ist, den Tag mit zwei ":" auszustatten. Beispiel:
keine optimale lösung aber kann ich mich bestimmt trotzdem mit anfreunden.
dr.e. hat geschrieben:Freut mich! Hintergrund zum Fehler: du kannst unter Angabe eines definierten Validators den Listener nur bei Anschlagen des speziellen Validators triggern lassen. Siehe Doku unter http://adventure-php-framework.org/Seit ... 8-Listener.
genau dort bin ich auf die lösung des problems gestoßen ;)
dr.e. hat geschrieben:Vielen Dank für deine Analyse & noch weiterhin viel Spass mit dem APF! Bei Fragen nicht scheuen - einfach fragen! ;)
da kannst du sicher sein. mir gefällt das framework bisher sehr gut (hab aber auch keinen vergleich :mrgreen: ) und ich denke das ich euch hier noch etwas länger erhalten bleibe.
dr.e. hat geschrieben:Der FloatFilter ist an sich schon richtig, da er den entsprechenden Datentypen zurück liefert. Zumindest war das die ursprüngliche Intention (siehe http://adventure-php-framework.org/Seit ... loatFilter). Ich schlage als Optimierung vor, für die Filter und Validatoren Unit Tests zu schreiben um darüber auch interpretierbare Details zu dokumentieren. Habe hierzu ein Issue angelegt: http://tracker.adventure-php-framework. ... php?id=138
da mein bug-track jetzt erledigt ist kann ich dort keine notiz mehr einfügen. und beim anderen bug-track geht es ja auch allgemein um alle validatoren und filter. bin mir nicht sicher, ob ich dahin schreiben soll. zumal ich "unit tests" erstmal googlen musste und noch nicht ganz sicher bin ob ichs richtig verstanden hab :oops:
aber an sich würde der FloatFilter genau den selben zweck mit und ohne das floatval() erfüllen. zumindest, wenn die usereingabe korrekt ist. also ein "3,4" würde zu "3.4" werden. für php ist der typ einer variable ja (leider oder auch zum glück) eh egal.
die nutzung von floatval erfüllt hier nicht wirklich einen zweck.
floatval ändert nur etwas am ergebnis von FloatFilter wenn die usereingabe auch nicht numerische zeichen enthält. aber dann auch nicht wirklich immer so wie man es vielleicht wünscht.
floatval("4.3 äpfel") ==> 3.4
floatval("ich habe 3.4 äpfel) ==> 0
im ersten fall würde der FloatFilter durch floatval tatsächlich einen gewinn haben. im zweiten fall ist es gar kein FloatFilter, obwohl man das vielleicht vom namen her fast erwarten könnte.
falls die intention des FloatFilter tatsächlich sein sollte einen float aus einem beliebigen text herauszufiltern kann man das bestimmt auch anders/besser lösen ohne eine falsche "0" zurückzugeben (z.b. mit prüfung und rückgabe von false [*]). aber ich glaube ja, dass die eigentliche intention doch einfach nur das ersetzen von kommas durch punkte war.
2) "ZeroDivisionValidator.php" habe ich ebenfalls übernommen. Ein String wird wird allerdings zu "0" gefiltert und damit ist natürlich eine "Division by zero"-Meldung korrekt.
nur wenn man auch das filtern von nem String zu "0" als korrekt empfindet.

[*] das würde zumindest den konflikt mit dem numberValidator lösen. aber glaub auch nicht dass das schön ist. wär ja quasi ne validierung in der filterung. passt das zu den oop-prinzipien? glaub nicht.

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

Re: fehler bei dem Beispiel mit dem Taschenrechner?

Beitrag von dr.e. » 05.02.2014, 23:36:14

Hi,
da kannst du sicher sein. mir gefällt das framework bisher sehr gut (hab aber auch keinen vergleich :mrgreen: ) und ich denke das ich euch hier noch etwas länger erhalten bleibe.
Freut mich! :)
da mein bug-track jetzt erledigt ist kann ich dort keine notiz mehr einfügen. und beim anderen bug-track geht es ja auch allgemein um alle validatoren und filter. bin mir nicht sicher, ob ich dahin schreiben soll. zumal ich "unit tests" erstmal googlen musste und noch nicht ganz sicher bin ob ichs richtig verstanden hab :oops:
Das ist etwas ungünstig mit der Sperre aber von Mantis so gewollt (Revisionssicherheit von erledigten Themen). Sofern du das Thema noch nicht als gelöst siehst, eröffnen wir es einfach wieder und dann ist eine Bearbeitung wieder möglich.

Deine Kommentare zur Detail-Funktion kannst du gerne in den dafür vorgesehenen weiteren Task schreiben. Hinsichtlich Unit Tests kannst du dir mal http://t3n.de/magazin/makelloser-code-e ... it-220740/ ansehen.
floatval ändert nur etwas am ergebnis von FloatFilter wenn die usereingabe auch nicht numerische zeichen enthält. aber dann auch nicht wirklich immer so wie man es vielleicht wünscht.
floatval("4.3 äpfel") ==> 3.4
floatval("ich habe 3.4 äpfel) ==> 0
Das ist genau der Input, der hinterher in einen Unit Test gegossen werden muss. Insofern ist der beim von mir geöffneten Issue genau richtig. Vielleicht magst du den da direkt posten.
nur wenn man auch das filtern von nem String zu "0" als korrekt empfindet.
Auch darüber können wir gerne noch diskutieren. :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast