form_control: isFilled

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

form_control: isFilled

Beitrag von dave » 10.09.2011, 19:12:02

Ich hätte eine kleine Idee als Erweitung des form_control: eine Methode, die überprüft, ob ein Formular-Feld ausgefüllt wurde.

Und zwar folgendes: Ich habe ein Formular, das aus mehreren Eingabefeldern besteht. Manche sind wichtig und diese müssen ausgefüllt werden. Andere sind jedoch optional und diese werden auch nicht weiter validiert. Im Controller möchte ich jedoch trotzdem wissen, ob der Use rnun dieses Feld ausgefüllt hat, um darauf reagieren zu können (Zusatzpunkte ;)). Das habe ich bisher mit ewig langen if()-Verbindungen gemacht.

Diese lassen sich ja durch eine kleine Methode etwas verkürzen:

Code: Alles auswählen

   public function isFilled($formfield) {
       if($formfield->getAttribute('value', '') === null) {
           return false;
       }else{
           return true;
       }
   } 
Es muss dabei nur der Name des Folrmularfeldes übergeben werden, der Inhalt (value) wird durch die Methode geholt und überprüft.

Wollen wir das mit ins 1.15 aufnehmen oder gibts weitere Anregungen/Verbessungsvorschläge?

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

Re: form_control: isFilled

Beitrag von dr.e. » 10.09.2011, 20:00:47

Hallo dave,

warum nicht gleich in die Signatur von form_control übernehmen? Dann ist die Nutzung noch einfacher:

Code: Alles auswählen

$form = &$this->getForm('Foo');
$fieldOne = $form->getFormElementByName('bar');
echo $fieldOne->isFilled() ? 'yes' : 'no'; 
Die Frage ist nur, wie sich Radio-Box-Gruppen verhalten sollen...
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 10.09.2011, 20:52:21

Ähm, hups, das versteh ich jetzt nicht. Kannst du etwas weiter ausholen?

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

Re: form_control: isFilled

Beitrag von dr.e. » 11.09.2011, 13:01:28

Die Frage ist doch: warum sollte ich eine Methode an den Controller "kleben", wenn sie eigentlich eine Methode des Objektes "FormularFeld" ist. Dies ist nach OO-Prinzip grundsätzlich mit "Es gibt keinen Grund!" zu beantworten, da der Füllstatus tatsächlich eine Eigenschaft eines Formular-Feldes ist. Soweit klar?

Nun ist die Überlegung anzustellen, welche Werte eine isFilled()-Methode für die unterschiedlichen Feld-Typen zurückliefert. Für Text-Felder ist das nicht so schwer, für Select- und Radio-Felder vielleicht doch.

Die Erweiterung würde bedeuten, dass ich in der Klasse form_control noch eine weitere Methode isFilled() hinzufüge und in den einzelnen Elementen (z.B. form_taglib_text) entsprechend dem Anwendungsfall unterscheide. Beispiel:

Code: Alles auswählen

class form_control extends Document {
   ...
   public abstract function isFilled();
   ...
} 

class form_taglib_text extends form_control {
   ...
   public abstract function isFilled(){
      return $this->getAttribute('value') !== null;
   }
   ...
} 
Nun klar?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 16.09.2011, 18:06:42

Hi Christian:
dr.e. hat geschrieben:Die Frage ist doch: warum sollte ich eine Methode an den Controller "kleben", wenn sie eigentlich eine Methode des Objektes "FormularFeld" ist. Dies ist nach OO-Prinzip grundsätzlich mit "Es gibt keinen Grund!" zu beantworten, da der Füllstatus tatsächlich eine Eigenschaft eines Formular-Feldes ist. Soweit klar?
Jup, sehr gut erklärt.
dr.e. hat geschrieben:Nun ist die Überlegung anzustellen, welche Werte eine isFilled()-Methode für die unterschiedlichen Feld-Typen zurückliefert. Für Text-Felder ist das nicht so schwer, für Select- und Radio-Felder vielleicht doch.
Für Checkboxen und Raio-Felder gibts doch die Methode isChecked(). isFilled() würde ich nur auf diese Felden anwenden können, bei denen man etwas eingeben kann, also Text-Felder sowie Text-Areas.
Einzig für das Select-Feld müsste nochmal etwas geschaffen werden in der Art isSelected(). Denn das gibts ja auch noch nicht, richtig? ;)

dr.e. hat geschrieben:Die Erweiterung würde bedeuten, dass ich in der Klasse form_control noch eine weitere Methode isFilled() hinzufüge und in den einzelnen Elementen (z.B. form_taglib_text) entsprechend dem Anwendungsfall unterscheide. Beispiel:

Code: Alles auswählen

class form_control extends Document {
   ...
   public abstract function isFilled();
   ...
} 

class form_taglib_text extends form_control {
   ...
   public abstract function isFilled(){
      return $this->getAttribute('value') !== null;
   }
   ...
}  
Nun klar?
Jap, damit werde ich mal etwas herum probieren und ich melde mich bein Unklarheiten oder Ergebnissen wieder.

Sorry für manche Verständnisprobleme ... bin noch sehr frisch in der objektorientierten Programmierung, aber es macht wirklich Spass, gerade bei solch fantastischem Feedback!

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

Re: form_control: isFilled

Beitrag von dr.e. » 16.09.2011, 19:14:13

Hi,

gut, dass wir das für dich klären konnten. Mir ist es wichtig, dass du das Verständnis dafür entwickelst um effektiv voran zu kommen. Solltest du also weitere Fragen haben, immer her damit! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 16.09.2011, 19:53:21

Wow, vielen Dank :)

Also ich konnte schonmal ein für mich hervorragendes Ergebnis erzielen. Ich musste mich zwar erstmal ein wenig mit abstrakten Klassen befassen und ein wenig Lesen aber das macht eben einfach Spass!

Mittlerweile habe ich auch schon das isFilled für form_taglib_text und form_taglib_area umgesetzt. Und es funktioniert!

Einzig die anfänglichen fatalen Fehler haben mich verwirrt. Ich musste noch in diverse Taglibs die Definition der Funktion isFilled einfügen. Ich gehe davon aus, dass das in jede Taglib eingepflanzt werden muss, egal, ob ich dies benötige oder nicht. Ich habe im Moment nur einen kleinen Test mit einem Select, einem Feld und einer Area.
Dies würde mir immerhin die ganzen "leeren" Funktionen an vielen Stellen erklären ^^.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 19.09.2011, 19:52:50

Kurzer Zwischenstand:

Ich habe nun die Klasse form_control abstrakt gemacht:

Code: Alles auswählen

abstract class form_control extends Document { 
Dort habe ich anschliessend die Methode isFilled() als public abstract definiert:

Code: Alles auswählen

public abstract function isFilled(); 
Anschliessend habe ich in den abgeleiteten Klassen (Taglibs) wie form_taglib_text oder form_taglib_area die Methode isFilled() programmiert:

Code: Alles auswählen

public function isFilled() {
    if ($this->getContent() == null) {
        return false;
    } else {
        return true;
    }
} 
In Klassen, welche direkt vom form_control ableiten, eine isFilled()-Prüfung aber nicht benötigen, habe ich einfach eine leere Methode eingefügt, weil sonst ein fataler Fehler geworfen wurde:

Code: Alles auswählen

public function isFilled() {

} 

Ist das so richtig oder habe ich etwas falsch gemacht. Was mich einfach etwas verwundert ist die Tatsache, dass ich in jeder ebgeleiteten Klasse wieder die isFilled()-Methode neu programmieren musste. Aber mit der Methode onParseTime() verhält es sich ja ähnlich ... das versunsichert mich noch ein wenig :oops:

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

Re: form_control: isFilled

Beitrag von dr.e. » 19.09.2011, 22:27:28

Hi dave,

sofern du in einer Klasse eine abstrakte Methode definierst, musst du diese natürlich an irgend einer Stelle im Vererbungsbaum implementieren - zumindest, wenn du diese Klasse instanziieren möchtest. In deinem Fall würde ich einfach die Methode in form_control implementieren und dort überschreiben, wo es notwendig ist (z.B. form_taglib_area). Weiterhin muss die Methode überall dort definiert sein, wo eine Taglib als Formular-Taglib genutzt werden möchte (siehe z.B. form_taglib_captcha).

Hoffe, das hilft dir weiter.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 20.09.2011, 18:58:28

Hi,

genau das wollte ich mit meiner etwas längeren Erklärung auch ausdrücken. Die rechten Worte zu finden, ist manchmal echt schwer ;).

Ich habe bisher die folgenden Taglibs angepasst:

Code: Alles auswählen

html_taglib_form
form_taglib_listener 
form_control_observer 
form_taglib_success 
form_taglib_button 
form_taglib_reset 
form_taglib_date 
form_taglib_select 
select_taglib_option 
select_taglib_group 
form_taglib_placeholder 
form_taglib_hidden 
form_taglib_checkbox 
form_taglib_radio 
form_taglib_area
form_taglib_text
form_taglib_marker 
form_taglib_timecaptcha 
form_taglib_csrfhash 
form_taglib_time 
form_taglib_error  

form_taglib_captcha
Bei mir klappt alles weiterhin einwandfrei. Die Frage ist nun, ob wir das gleiche Spiel, wie vorgeschalgen, für Select-Felder auch machen wollen. Übernehmen wir die Anpassung dann auch ins 1.15? Sonst muss ich die Anpassung ja nicht weiter vornehmen ... ;) (Ne kurze Einführung die SVN-Geschichte wäre dann prkatisch ^^)

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

Re: form_control: isFilled

Beitrag von dr.e. » 20.09.2011, 21:01:28

Das scheinen mir auf den ersten Blick etwas viele Dateien zu sein, wenn du bereits eine Default-Implementierung in form_control eingebaut hast. form_taglib_text müsste dann beispielsweise nicht angepasst werden.

Hinsichtlich der Vorgehensweise schlage ich vor, dass du mir die angepassten Dateien schickst und ich diese ins SVN integriere (natürlich 1.15). Für's nächste Mal würde ich dir dann SVN-Zugriff auf sourceforge.net einrichten. Einverstanden?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 20.09.2011, 22:14:49

dr.e. hat geschrieben:Das scheinen mir auf den ersten Blick etwas viele Dateien zu sein, wenn du bereits eine Default-Implementierung in form_control eingebaut hast. form_taglib_text müsste dann beispielsweise nicht angepasst werden.
Ich kann im form_control nur die Methode isFilled() definieren. Das mache ich so:

Code: Alles auswählen

public abstract function isFilled(); 
Eine anschliessende Default-Implementierung geht bei einer abstrakten Methode nicht. Ich müsste dann die neue akstrakte Methode noch früher definieren, sodass diese bereits im form_control bekannt ist.
dr.e. hat geschrieben:Hinsichtlich der Vorgehensweise schlage ich vor, dass du mir die angepassten Dateien schickst und ich diese ins SVN integriere (natürlich 1.15). Für's nächste Mal würde ich dir dann SVN-Zugriff auf sourceforge.net einrichten. Einverstanden?
Jup, gerne! Ich glaube, ich habe da auch schonmal was von dir eingerichtet bekommen. Die Diskussion "damls" war über die Doku. Kann also sein, dass sich das nur auf die Doku beschränkt.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 22.09.2011, 13:49:20

Ich habe mich nun etwas ausgetobt ;). Das APF ist einfach toll!

Und zwar gibt es nun zwei neue Methoden, isFilled() und isSelected().

isFilled() kann dabei auf <form:text> und <form:area> angewendet werden. Es gibt mir einfach nur die Bestätigung, dass Text eingegeben wurde.

isSelected() kann auf <form:select> und <form:multiselect> angewendet werden. Es gibt mir einfahc nur eine Bestätigung, ob irgend eine Auswahl des Select einen Wert enthält. Wird aus dem Select etwas ausgewählt, welches als Value="" zurück gibt, ist das ein falsches Ergebnis und das Select wurde nicht selektiert.
Die Unterscheidung beim Select zwischen wirklicher Selektion und ob die Selektion Inhalt enthält, ist nicht so einfach. Da kann es sicher zu heissen Diskussionen kommen. Nur mich sollte ja eigentlich nur interessieren, ob etwas angewählt wurde, das aus einen Wert enthält. Denn Selektiert wird immer etwas, auch wenn es "leer" ist.

Das ganze nun noch gepaart mit isChecked() bietet ein grossartiges Werkzeug um nachträglich direkt im Controller bestimmte Dinge auszuführen :)

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

Re: form_control: isFilled

Beitrag von dr.e. » 22.09.2011, 21:44:36

Hi dave,

sorry für meine späte Antwort, hier war viel los heute. Wo hast du denn die neuen Methoden implementiert? Ich würde form_control vorschlagen, dort ist auch isChecked() etc. implementiert.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: form_control: isFilled

Beitrag von dave » 22.09.2011, 21:48:14

Null Problemo!

Ich melde mich morgen Abend dazu nochmal genauer :)

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast