Formulare: HTML 5?

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.
Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Well » 26.07.2011, 20:17:55

Automatisch funktioniert das nicht, denn das Anheften gehört zur konfigurativen Tätigkeit des Entwicklers.
Und da liegt in meinen Augen der Unterschied zu den "neuen" Validatore. Das jetzige Textfeld kann für alle mögliche Eingaben genutzt werden, da weiß natürlich nur der Entwickler, welcher Validator benötigt wird ... Aber beim date Feld hat der Benutzer ja gar nicht möglichkeit, etwas anderes "einzugeben" (bzw. im Kalender auszuwählen) als ein Datum. Wenn dort etwas anderes enthalten ist, hat der Benutzer das HTTP Request bearbeitet oder manuell abgesetzt.
Der Entwickler "konfiguriert" dann quasi, dass ein Feld, das nur ein Datum enthalten kann, nur ein Datum enthalten darf ... Ich persönlich halte das für Überflüssig. (Probleme hätte ich damit aber auch nicht.)

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

Re: Formulare: HTML 5?

Beitrag von dr.e. » 26.07.2011, 21:19:15

Warum? Vielleicht möchtest du den Input garnicht oder nach einem eigenen Schema validieren. Beispiel:
  • Das Feld muss ein Geburtsdatum beinhalten, da mindestens 18 Jahre zurück liegt.
  • Das Feld muss ein Datum beinhalten, das von einem anderen mindestens 10 Tage entfernt ist.
Das funktioniert mit deinem Konzept nicht!
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Formulare: HTML 5?

Beitrag von Megger » 26.07.2011, 21:24:55

Aber man hätte zumindestens schonmal validiert, dass es ein Datum ist, was es bei einem Date Field ja eh sein soll. Andere Validatoren kann man doch immernoch hinzufügen, oder?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Screeze » 26.07.2011, 21:47:01

Warum? Vielleicht möchtest du den Input garnicht oder nach einem eigenen Schema validieren. Beispiel:

Das Feld muss ein Geburtsdatum beinhalten, da mindestens 18 Jahre zurück liegt.
Das Feld muss ein Datum beinhalten, das von einem anderen mindestens 10 Tage entfernt ist.

Das funktioniert mit deinem Konzept nicht!
Warum nicht? Er kann ja ZUSÄTZLICH einen weiteren Validator einhängen (manuell).
denn das Anheften gehört zur konfigurativen Tätigkeit des Entwicklers.
Ich sehe bereits das Verwenden eines Formularelements, welches laut Spezifikation nur bestimmte Eingaben enthalten darf, als konfigurative Tätigkeit und Anheften eines Validators.
Dass man weitere Validatoren einhängen können muss bestreitet keiner. Aber wenn ich bereits im Formular definiere was ich will, wieso sollte ich es noch einmal für Validatoren tun?

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

Re: Formulare: HTML 5?

Beitrag von dr.e. » 26.07.2011, 22:15:14

Warum nicht? Er kann ja ZUSÄTZLICH einen weiteren Validator einhängen (manuell).
Und wie bildest du den Fall ab, dass NICHT validiert wird? Attribute an ein Form-Control zu heften hat sich hier schon in der Version 1.10 als zu unflexibel erwiesen.
Ich sehe bereits das Verwenden eines Formularelements, welches laut Spezifikation nur bestimmte Eingaben enthalten darf, als konfigurative Tätigkeit und Anheften eines Validators.
Dass man weitere Validatoren einhängen können muss bestreitet keiner. Aber wenn ich bereits im Formular definiere was ich will, wieso sollte ich es noch einmal für Validatoren tun?
Da du keinen schwarz-weiß-Anwendungsfall hast (siehe meine Beispiele). ;)
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Well » 26.07.2011, 22:28:07

Und wie bildest du den Fall ab, dass NICHT validiert wird?
In welchem Fall sollte man das wollen?

Wenn die Attribute min, max und step nicht gesetzt sind, werden sie vom Validator auch nicht beachtet (zumindest in meinen Vorstellungen), folglich kann jedes beliebige Datum ausgewählt werden. Da der Validator nach den gleichen Bedingungen wie der Browser prüft, ist folglich auch jedes Datum, das der Benutzer auswählen kann, gültig.

Schränkt man die Auswahl mithilfe der drei Attribute ein, gilt diese Einschränkung auch beim Browser, sprich, der Benutzer kann weiterhin nur die Daten auswählen, die der Validator auch für gültig empfinden wird.
Der Validator greift also nur, wenn die eingeschränkte Auswahl beim Browser umgangen wird (denn gerade beim date-Tag generiert den eigentlichen Wert der Browser (zumindest Opera tut das) und zeigt dem Benutzer nur einen Kalender, indem er das jeweilige Datum anklicken kann), indem das generierte HTTP Request bearbeitet oder manuell abgesetzt wird. Beides wird eine Webanwendungen vom Besucher sicher nie fordern.

(Oder verstehe ich dich falsch? :/)

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Screeze » 26.07.2011, 22:42:47

Ich verstehe auch nicht ganz was Christian meint.... Wüsste ich es nicht besser würde ich sagen er weiß nicht wie die html5 Validierung funktioniert, aber... nee ich glaub wir verstehen Ihn bloß falsch... :? :?

Ich stehe da auf Wells Seite, und liefere ein weiteres Beispiel:
Wenn ich dem Browser sage ich will nur email-Adressen in einem Feld, und er soll alles andere abweisen und das Formular nicht absenden lassen, wenn es keine email ist, wieso sollte ich auf einmal in der Prüfung auf dem Server meine Meinung ändern und auch einen anderen Wert annehmen - den der User im Normalfall gar nicht absenden kann, nur wenn er den Request manipuliert oder einen uraltbrowser verwendet....

Nochmal: Wir wollen das bisherige Prinzip nicht ersetzen, wir wollen lediglich einen Mechanismus hinzufügen, der soviel redundante Arbeit wie möglich abnimmt.

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

Re: Formulare: HTML 5?

Beitrag von dr.e. » 26.07.2011, 23:44:42

OK, andere Vorgehensweise: baut mal ein paar Zeilen Template-Code, wie ihr euch das vorstellt, dann kommen wir vielleicht einfacher zu einem Konsens. :)
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Well » 27.07.2011, 00:48:21

Okay, eins habe ich (wir) jetzt nicht bedacht: Was passiert wenn kein value Wert vorhanden ist? Zumindest in Opera ist das Feld bis zur ersten Auswahl leer, wobei man es nach einer Auswahl nicht merh "leeren" kann.

Davon abgesehen:

html5form::taglib

Code: Alles auswählen

<?php
    import('html5form::validator', 'Html5DateValidator');

    class html5form_taglib_date extends form_control {
        public function __construct() {
            $this->attributeWhiteList[] = 'value';
            $this->attributeWhiteList[] = 'name';
            $this->attributeWhiteList[] = 'min';
            $this->attributeWhiteList[] = 'max';
            $this->attributeWhiteList[] = 'step';
        }
        
        public function onParseTime() {
            parent::onParseTime();
            
            $buttons = $this->getParentObject()->getFormElementsByTagName('form:button');
            foreach($buttons as $offset => $DUMMY){
                $this->addValidator(new Html5DateValidator($this, $buttons[$offset]));
            }
        }
        
        public function transform() {
            return '<input type="date" '.$this->getSanitizedAttributesAsString($this->__Attributes).' />';
        }
    }
?>
html5form::validator

Code: Alles auswählen

<?php
    import('tools::form::validator', 'TextFieldValidator');
    
    class Html5DateValidator extends TextFieldValidator {
        public function validate($value) {
            $min = $this->__Control->getAttribute('min');
            $max = $this->__Control->getAttribute('max');
            $step = $this->__Control->getAttribute('step');
            
            if(!$this->isValidDate($value)) {
                return false; 
            }
            
            if($min !== null) {
                if(!$this->isValidDate($min) || strtotime($min) > strtotime($value)) {
                    return false;
                }
            }
            
            if($max !== null) {
                if(!$this->isValidDate($max) || strtotime($max) < strtotime($value)) {
                    return false;
                }
            }
                
            if($step !== null) {
                if(!$this->isValidStep($step) || /* gültigkeit von $value prüfen */ false) {
                    return false;
                }
            }
            
            return true;
        }
        
        protected function isValidStep($step) {
            if($step != 'any' || !is_int($step) || intval($step) <= 0) {
                return false;
            }            
            
            return true;
        }
        
        protected function isValidDate($date) {
            if(preg_match('#^[0-9]{4}-[0-9]{2}-[0-9]{2}$#', $date)) {
                list($year, $month, $day) = explode('-', $date);
                if(intval($year) && intval($month) && intval($day)) {
                    return true;
                }
            }
            
            return false;
        }    
    }
?>
html5form::templates

Code: Alles auswählen

<@controller namespace="html5form::documentcontroller" file="demo_controller" class="demo_controller" @>

<html>
	<head>
		<title>HTML5 FORM DEMO</title>
	</head>
	<body>
		<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
		
		<html:form name="html5-demo-form" method="GET">
			<form:success>Erfolgreich!</form:success>
			<form:error>Fehlerhaft!</form:error>
		
			<form:addtaglib namespace="html5form::taglib" prefix="html5form" class="date" />			
			<p>Datum: <html5form:date name="date" min="2011-07-25" max="2011-07-29" /></p>
			
			<form:button name="send" value="Senden" />
		</html:form>
	</body>
</html>
Bis auf "nichts" kann ich mit Opera kein Datum auswählen, das den Validator alarm schlägen lässt. Erst bei manueller Manipulation schlägt es fehl ...

Edit: Mit Chrome kann ich zwar auch ein falsches Datum eingeben, dann aber nicht absenden.

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

Re: Formulare: HTML 5?

Beitrag von dr.e. » 27.07.2011, 08:00:36

Hallo Well,

danke für dein Snippet. Der auffälligste Punkt ist, dass du den Validator für jeden Button registrierst. Das ist IMHO ungünstig bis problematisch, da du auf einem Formular u.U. mit mehreren Buttons unterschiedliche Aktionen ausführen möchtest (z.B. ja/nein-Buttons). Hierzu brauchst du das Wissen des Entwicklers, dass du zum Zeitpunkt des Schreibens der Taglib nicht haben kannst.

Den Rest schaue ich mir im Zug an.
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Screeze » 27.07.2011, 09:10:38

wie ist das denn mit html5 und den buttons? Da reagiert der validator doch auch auf jeden button, oder?

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Well » 27.07.2011, 12:08:38

Screeze hat geschrieben:wie ist das denn mit html5 und den buttons? Da reagiert der validator doch auch auf jeden button, oder?
Ja, aber ein leerer Wert wird eben auch durchgelassen. Wenn der Validator den nicht durchlassen soll, weil ein Datum unbedingt erforderlich ist, gäbe es bei Ja/Nein Buttons wohl echt Probleme. :|
Würde man das Feld immer automatisch mit dem aktuellen Datum vorbefüllen wäre das zwar gelöst, aber wie macht man dann ein solches Feld optional? grml

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Screeze » 27.07.2011, 12:12:03

gibts nicht mit HTML5 das "required" Attribut, welches eben bestimmt ob ein leerer Wert durchgelassen wird? Dann muss der Validator eben jenes beachten.

edit: Jap gibts: http://diveintohtml5.org/forms.html#required

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Formulare: HTML 5?

Beitrag von Megger » 27.07.2011, 12:15:42

Beachtet ein Validator das nicht schon? Weil ich hatte das Problem schonmal, dass ich optionale Felder validieren wollte und dies nicht möglich war, ich meine damals wurden die Validatoren angepasst
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Formulare: HTML 5?

Beitrag von Screeze » 27.07.2011, 12:17:38

Momentan wird glaube ich das "optional" Attribut beachtet. Das sollten wir vielleicht auf die html5 variante "required" umschalten, und per default andersrum machen, wie es auch in html5 üblich ist.

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast