HtmlFormTag erwartet Interface FormControl von allen Kindern

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

HtmlFormTag erwartet Interface FormControl von allen Kindern

Beitrag von jwlighting » 16.03.2013, 22:35:04

Hallo zusammen,

ich habe gerade folgendes Template:

Code: Alles auswählen

...

<core:addtaglib namespace="tools::form::taglib" class="HtmlFormTag" prefix="html" name="form" />
<html:form class="umgt-fe-login" name="login" method="post">
   <form:placeholder name="login-error" />
   <fieldset>
      <form:addtaglib namespace="extensions::apfelsms::pres::taglibs" prefix="sms" name="pageTitle" class="SMSPageTitleTag" />
      <legend>
         <sms:pageTitle />
      </legend>

...
Und bekomme folgenden Fehler:
Fatal error: Call to undefined method SMSPageTitleTag::isSent() in /srv/www/htdocs/.../apps/tools/form/taglib/HtmlFormTag.php on line 177
Das liegt daran, dass das HtmlFormTag auf allen Kindern isSent() aufruft (Teil des Interfaces FormControl):

Code: Alles auswählen

/**
    * @public
    *
    * Indicates, whether the form has been sent or not. Retrieves the status
    * directly from the form controls. Overwrites the parent's method.
    *
    * @return boolean True, in case the form is sent, false otherwise.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1, 27.09.2009<br />
    */
   public function isSent() {

      foreach ($this->children as $objectId => $DUMMY) {
         if ($this->children[$objectId]->isSent() === true) {
            return true;
         }
      }

      return false;
   }
 

Ich bin mir nicht ganz sicher, ob ihr das auch als Bug anseht, möchte aber folgenden Fix vorschlagen:

Code: Alles auswählen

/**
    * @public
    *
    * Indicates, whether the form has been sent or not. Retrieves the status
    * directly from the form controls. Overwrites the parent's method.
    *
    * @return boolean True, in case the form is sent, false otherwise.
    *
    * @author Christian Achatz
    * @version
    * Version 0.1, 27.09.2009<br />
    * Version 0.2, 16.03.2013, Jan Wiese Added check for FormControl interface on children<br />
    */
   public function isSent() {

      foreach ($this->children as $objectId => $DUMMY) {
         if($this->children[$objectId] instanceof FormControl) {
            if ($this->children[$objectId]->isSent() === true) {
               return true;
            }
         }
      }

      return false;
   }
 
Damit ließen sich übrigens auch für Klassen wie FormAddTaglibTag die Standard-Taglibs (hier AddTaglibTag) verwenden, uns somit Klassen sparen.

Analog natürlich das Gleiche für isValid().

LG :)
Jan

PS: Vielleicht schaffen wir es ja noch in das 1.17er Release ;)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 17.03.2013, 14:42:00

Hallo Jan,

das ist kein Bug, sondern ein Feature. Um sicherzustellen, dass sich ein Formular-Element immer gleich verhält braucht das HtmlFormTag dieses Interface. In deinem Fall musst du die entsprechenden Tags auf die Nutzung innerhalb eines Formulars vorbereiten, in dem du das FormControl-Interface implementierst. Sofern das der Fall ist, kannst du den Tag natürlich auch ausserhalb verwenden.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 17.03.2013, 18:53:35

das ist kein Bug, sondern ein Feature. Um sicherzustellen, dass sich ein Formular-Element immer gleich verhält braucht das HtmlFormTag dieses Interface.
Klar. Damit habe ich ja auch kein Problem ;) Dann sollte man aber auch Prüfen, dass das Interface auch implementiert wurde - es sich also überhaupt um ein Formular-Element handelt.
In deinem Fall musst du die entsprechenden Tags auf die Nutzung innerhalb eines Formulars vorbereiten, in dem du das FormControl-Interface implementierst.
Stop mal. :? Wieso machen wir uns den Aufwand und Overhead (-> Performance !?) und erstellen Klassen, nur um diesem Interface konform zu werden? Und warum schränken wir die Nutzung von Taglibs innerhalb einen Formulars unnötig ein?
Dann muss ich ja entweder für jede Taglib von vornherein dieses Interface berücksichtigen (was ziemlicher Blödsinn ist) oder jedes mal eine neue Taglib-Variante implementieren, nur um keinen Fehler zu bekommen.
Beides ist in meinen Augen irgendwie absurd. Für alle Taglibs, die von der Semantik her "FormControl" zugeordnet werden können macht das ja Sinn. Die SMSPageTitleTag(lib) hat aber ja gar keine "FormControl"-Funktion. Wieso sollte sie also das Interface implementieren?

Da finde ich es schon sinniger, zu überprüfen ob ein Tag "FormControl"-Funktion hat und sie sonst einfach nicht zu berücksichtigen. Das ist uns dank des Interfaces und instanceof ja recht einfach möglich.


Sorry, aber mir erschliesst sich der Sinn dahinter einfach nicht :)

LG ;)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 21.03.2013, 22:01:37

Hallo Jan,
Stop mal. :? Wieso machen wir uns den Aufwand und Overhead (-> Performance !?) und erstellen Klassen, nur um diesem Interface konform zu werden? Und warum schränken wir die Nutzung von Taglibs innerhalb einen Formulars unnötig ein?
Der Aufwand ist notwendig, da sich das Formular sonst nicht darauf verlassen kann, dass die Elemente auch wie Formular-Elemente agieren. Sofern ich hier also kein Interface anbiete, kann sich der HtmlFormTag nicht sicher sein, welche Kinder er hat und wie er z.B. das Absenden behandeln soll.
Dann muss ich ja entweder für jede Taglib von vornherein dieses Interface berücksichtigen (was ziemlicher Blödsinn ist) oder jedes mal eine neue Taglib-Variante implementieren, nur um keinen Fehler zu bekommen.
Das ist korrekt, du müsstest die Nutzung zuvor berücksichtigen.
Die SMSPageTitleTag(lib) hat aber ja gar keine "FormControl"-Funktion. Wieso sollte sie also das Interface implementieren?
Sofern du diesen Tag nicht innerhalb eines Formulars nutzt, musst du das Interface auch nicht implementieren.
Da finde ich es schon sinniger, zu überprüfen ob ein Tag "FormControl"-Funktion hat und sie sonst einfach nicht zu berücksichtigen. Das ist uns dank des Interfaces und instanceof ja recht einfach möglich.
Ich denke nochmal drüber nach, welche Konsequenzen das hätte. Einverstanden?
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 21.03.2013, 22:30:08

Hallo Christian,
Der Aufwand ist notwendig, da sich das Formular sonst nicht darauf verlassen kann, dass die Elemente auch wie Formular-Elemente agieren. Sofern ich hier also kein Interface anbiete, kann sich der HtmlFormTag nicht sicher sein, welche Kinder er hat und wie er z.B. das Absenden behandeln soll.
Das du ein Interface anbietest ist absolut sinnig. Das dies von Formularelementen implementiert werden muss, auch.
Ebenfalls kann ich dir folgen, dass der HtmlFormTag sich sonst nicht sicher sein kann, wie er das Absenden behandeln soll.

Meine Überlegung geht in eine andere Richtung:
Sind Placeholder, Getstring oder Addtaglib Formular-Elemente? Das gleiche für fremde Taglibs wie SMSPageTitle oder beliebige andere.
Denn diese nehmen ja keinen Einfluss auf das Verhalten beim Absenden oder auf die Gültigkeit des Formulars, und nehmen auch keine Formulardaten auf.
Daher möchte ich vorschlagen, die Kindelemente einfach auf das Interface FormControl zu prüfen (instanceof, siehe erster Beitrag).
Damit nehmen dann alle Formular-Elemente, die FormControl implementieren, Einfluss auf das Verhalten des Formulars, und für alles andere müssen keine Dummy-Methoden und abgeleitete Klassen mehr erstellt werden.

Ich kenne die Formular-Tools nicht bis in den Kern. Vielleicht habe ich da irgendwo einen Denkfehler drin. Dann korrigiere mich bitte. ;)
Oder wir haben bisher aneinander vorbei geredet. :|
Ich denke nochmal drüber nach, welche Konsequenzen das hätte. Einverstanden?
Einverstanden! :)

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 21.03.2013, 22:51:29

Hi Jan,
Oder wir haben bisher aneinander vorbei geredet. :|
Nein, nein! :) Ich verstehe deine Erwartungshaltung schon. Werde mich nochmal im Detail mit dem Thema beschäftigen und hier Feedback geben.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 21.03.2013, 23:08:24

Ich verstehe deine Erwartungshaltung schon. Werde mich nochmal im Detail mit dem Thema beschäftigen und hier Feedback geben.
Erwartungshaltung würde ich es jetzt nicht nennen. ;) Ich habe einfach ein wenig den Eindruck, dass du meinen Denkansatz noch nicht ganz verstanden hast - oder ich die Formulartools zu schlecht kenne und mein Ansatz deswegen nicht passt.

Wie gesagt: Das Interface ist super und HtmlFormTag muss sich natürlich drauf verlassen können. Dazu sollte es aber einfach auf das Interface prüfen, statt blind drauf zu vertrauen und einen PHP-Fehler zu riskieren, den man nicht einmal mehr abfangen könnte.

Bei mir funktioniert mein Patch mit der Prüfung mittels instanceof bevor ein HtmlFormTag-Kind (!= Formularelement ;)) nach Sendestatus bzw. Gültigkeit abgefragt wird jedenfalls super. 8-)

Schau dir den Thread und die Implementierung nochmal in Ruhe an, dann passt das schon :)

LG und Dankeschön :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 21.03.2013, 23:33:05

Schau dir den Thread und die Implementierung nochmal in Ruhe an, dann passt das schon :)
Das habe ich auch vor! :) Sitze grade am ClassLoader, daher meine etwas kurzen Antworten.
Viele Grüße,
Christian

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 30.03.2013, 18:15:43

Hallo Jan,

ich habe das nochmal in Ruhe durchdacht und dein Ansatz ist sehr gut! Damit ersparst du dir - wie schon bemerkt - einiges an Coding und kannst die Tags trotzdem im Formular verwenden. Ich habe diese Änderung daher in 1.17 integriert.

Danke nochmal für deine Hartnäckigkeit, das Feature gefällt mir! ;)
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 30.03.2013, 20:46:56

Danke nochmal für deine Hartnäckigkeit, das Feature gefällt mir!
Gerne :)
Ich hatte mir schon gedacht, dass das eigentlich auch in deinem Sinne sein müsste - ich empfand es einfach als "seltsames" Softwaredesign. Da bin ich dann auch hartnäckig, um dich zu überzeugen :geek:
Ich habe diese Änderung daher in 1.17 integriert.
Super, dann freue ich mich schon drauf! Danke!

LG :)
Jan

PS: Bin aus dem Urlaub zurück ;)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 02.04.2013, 19:22:44

Hallo Christian :)
Ich habe diese Änderung daher in 1.17 integriert.
Eingecheckt hast du die Änderungen noch nicht, oder?
Damit ersparst du dir - wie schon bemerkt - einiges an Coding und kannst die Tags trotzdem im Formular verwenden.
Damit müssten auch ein paar Klassen, z.B. FormAddTaglibTag, FormLanguageLabelTag oder FormPlaceholderTag, entfallen können.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 03.04.2013, 08:13:52

Hi Jan,

an sich dachte ich, dass ich das schon eingecheckt habe. :roll: Checke das später mal... :?
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 03.04.2013, 18:11:47

Ja, jetzt ist es drin. Sorry, vielleicht hat sich das einfach überschnitten, da ich den Post erst einiges nachdem ich reingeguckt hatte geschrieben hab.
Also alles klar!

Die nun überflüssigen Klassen (siehe meinen vorherigen Post) hast du aber immer noch in Verwendung.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

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

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von dr.e. » 04.04.2013, 00:27:20

Korrekt, diese muss ich noch entfernen. Update folgt.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: HtmlFormTag erwartet Interface FormControl von allen Kin

Beitrag von jwlighting » 17.04.2013, 18:07:04

Korrekt, diese muss ich noch entfernen. Update folgt.
Noch nicht passiert, oder? Soll ich das übernehmen? Dann könnte ich mich gleich nochmal mit dem einchecken im SVN versuchen ;)

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast