php.de

Zurück   php.de > php.de Intern > Wiki Diskussionsforum > Tutorials

Tutorials Hier findest Du Tutorials, welche nach und nach ein fertiges Script ergeben. Sehen, lernen & verstehen!

Thema geschlossen
 
LinkBack (7) Themen-Optionen Thema bewerten
Alt 29.11.2007, 19:27  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard PHP: Formular Generator

Hallo,
ich würde euch ganz gerne meinen Formular-Generator zeigen. Es war ein Haufen Arbeit, einige Entwürfe hat es gebraucht, bis er jetzt das tut was ich möchte.

Wie gewohnt möchte ich euch zunächst zeigen wie er aussieht - mit dem "default"-Template:
http://www.antiphpfriend.de/form/test.php

Für den Anwender (Code von test.php):
PHP-Code:
<?php
/**
 * LICENCE
 * 
 * This is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 * 
 * It is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * @license  LGPL - [url]http://www.gnu.org/licenses/lgpl.html[/url]
 * @author   Christian Reinecke <christian.reinecke@web.de>
 * @version  1.0
 */

Timer::start();
$memory memory_get_usage();

$debug intval(@$_GET["debug"]);
$templateFile $debug "debug" "default";
$templateBase implode(DIRECTORY_SEPARATOR, array(dirname(__FILE__), "classes""Form""View""templates"$templateFile)); 

$options = array(
    
"de-de" => "Deutsch (Deutschland)",
    
"de-ch" => "Deutsch (Schweiz)",
    
"de-at" => "Deutsch (Österreich)");

$form = new Form("user_register""request");
$form->addHidden("id"15);
$form->addRadio("gender")->addOption("male""Herr")->addOption("female""Frau")->setLabel("Geschlecht")->setMessage("%label% benötigt eine gültige Auswahl: %labels%");
$form->add("title")->setLabel("Titel")->isOptional()->hasMinLength(4)->setMessage("%label% ist optional, erwartet bei einer Eingabe jedoch mindestens %min-length% Zeichen.");
$form->add("firstname")->setLabel("Vorname")->setMessage("%label% erwartet mindestens %min-length% Zeichen.");
$form->add("lastname")->setLabel("Nachname")->setMessage("%message:firstname%");
$form->add("street")->setLabel("Straße")->setMessage("%message:firstname%");
$form->add("housenumber")->setLabel("Hausnummer")->hasMinLength(1)->setMessage("%message:firstname%")->dockOn("street");
$form->add("postcode")->isNumeric()->hasLengthBetween(4,5)->setLabel("<acronym>PLZ</acronym>")->setMessage("%label% erwartet abhängig von %label:country% zwischen %min-length% und %max-length% Zahlen.");
$form->add("city")->setLabel("Ort")->setMessage("%message:firstname%")->dockOn("postcode");
$form->addSelect("country")->setLabel("Herkunft")->addOptions($options)->setHeader()->setMessage("%label% benötigt eine gültige Auswahl: %texts%");
$form->add("phone")->isPhoneNumber()->setLabel("Telefon")->setMessage("%label% erwartet die Eingabe gültiger Zeichen.");
$form->add("email")->isEmail()->setLabel("E-Mail")->setMessage("%label% erwartet eine gültig aufgebaute E-Mail-Adresse, z.B. %example%");
$form->addCheckbox("terms")->setLabel("AGB akzeptieren")->isRequired()->setMessage("Ohne die Akzeptanz unserer AGBs ist eine Anmeldung nicht möglich.");
$form->addCheckbox("newsletter")->setLabel("Newsletter abonnieren?");
$form->addTextarea("test")->checkExample()->setLabel("Nennen Sie ein Label, eine Ihrer Eingabe und ein Datum (DD.MM.YYYY).")->setMessage("Unkomplett.");
$form->addReset("zurücksetzen");
$form->addSubmit("speichern");


if (
$form->isComplete()) {
    
Debug::stop($form->getData());
}

header("Content-type: text/html; charset=utf-8");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title></title>
        
<?=$form->getView()->asCss($templateBase)?>
    </head>
    <body>
<?=$form->getView()->asXhtml($templateBase)?>

        <div class="timer"><?=Timer::stop()?></div>
        <div class="memory"><?=memory_get_usage()-$memory?></div>
    </body>
</html>
(die Lizenz soll weder einen auf wichtig tun noch abschrecken, will es mir jetzt allerdings angewöhnen)

Wie zu sehen ist wird sehr viel call chaining benutzt. Ich habe wirklich großen Gefallen daran gefunden.

Beispiel:
PHP-Code:
<?php
class MyClass
{
    public function 
say() { echo "say "; return $this; }
    public function 
hello() { echo "hello "; return $this; }
}
$myObject = new MyClass();
$myObject->say()->hello();
echo 
" or ";
$myObject->hello()->say();
?>
Vereinfacht den Code doch sehr finde ich.


Zurück zum Formular:
Die Idee war eine Dreiteilung zwecks Caching (daraus wurde leider doch (noch?) nicht):
- Form_Controller, der die Struktur und Validierung übernimmt (kein Controller im herkömmlichen Sinne also)
- Form_Model, das vom Controller die Struktur empfängt (Feldnamen), aus $_POST, $_GET was auch immer die Daten extrahiert und zurück an den Controller liefert.
- Form_View, das die Ausgabe erzeugt, in dem sie den Zustand des Formulars (Validierung, Werte, eigentlich alles) vom Controller erhält.

Die Form-Klasse wird darüber-gestülpt, damit sich der Anwender nicht um die Kommunikation dieser drei Komponenten kümmern muss.


Zur Formular-Validierung habe ich mich für 3 "Operatoren" entschieden, so richtig glücklich bin ich damit nicht - trotzdem funktioniert es

- Filter:
Sie werden zuerst ausgeführt: Mit ihnen sind Operationen wie "trim" oder Datums-Transformationen möglich (deutsch -> Unixtimestamp o.ä.)
Sie verändern die Eingabe.

- Validator:
Sie validieren Eingaben, z.B. auf eine E-Mail-Adresse, auf einen numerischen Wert, sie werden nach den Filtern ausgeführt und verändern die Eingabe nicht.

- Konsistenzprüfer (Conditionals):
Sie sollen die Konsistenz des Formulars sicherstellen. Das heißt es könnten alle Eingaben valide sein und trotzdem ist das Formular nicht konsistent.
Das könnte der Fall sein, wenn eine fünfstellige Postleitzahl angegeben ist, jedoch in der Länderauswahl die Schweiz gewählt wurde (die nur 4-stellige PLZ kennt).
Conditionals sind Allmächtig, da sie Zugriff auf den Form_Controller haben, der wiederum alle Elemente verwaltet.

IsOptional() ist so ein Konsistenzprüfer. Ist die Eingabe valide, gibt er auch TRUE zurück, ist sie es nicht, wird geprüft ob die Eingabe gleich dem Default-Wert ist, wenn ja ist die Eingabe konsistent (da ja optional).

Dem Anwender der Form-Klasse stehen also isSent(), isValid(), isConsistent() und isComplete() zur Verfügung. Letztere Methode prüft isSent() && isConsistent(), so dass das Formular auch im Default mit konsistenten Daten gefüllt werden können, z.B. für die Bearbeitung existierender Daten.


Der Form_View erzeugt beliebige Ausgaben, für CSS oder XHTML, eine JavaScript-Validierung (1:1 serverseitig-clientseitig) ist in Planung und in einer früheren Version bereits erfolgreich gestetet. Das heißt das Formular würde erst von JavaScript validiert um Serverlast zu schonen. Wenn es als konsistent erachtet würde, würde PHP noch einmal den Test serverseitig durchführen und dann (hoffentlich) das Formular als "completed" erachten. Aber das ist noch die Planung.

Der Form_View hat noch eine gewisse Intelligenz um die Templates sinnvoll zu füllen. Es ist allerdings nur eines von vielen Beispielen. Mit Hinsicht auf die kommende JavaScript-Validierung wird das HTML nur minimal verändert, der Großteil der Darstellung soll von CSS übernommen werden. Dazu wurden im HTML CSS-Klassen für <div> Container erzeugt, die die komplette Kontrolle über die Ansicht garantieren sollen.

Beispiel:
Code:
    div.form.not-sent div.not-consistent div.message {
        color : silver;
    }
    div.form.sent div.not-consistent div.message {
        color : red;
    }
    div.form div.consistent div.message {
        display : none;
    }
Es sollte bereits selbsterklärend sein, dass die Fehlernachrichten in verschiedenen Farben dargestellt werden (wenn überhaupt):
Eine Fehlermeldung eines nicht konsistentes Element eines nicht verschickten Formulars, wird eingegraut, wurde das Formular bereits verschickt aber ist das Element immernoch nicht konsistent, wird es rot dargestellt. Wenn es konsistent ist, wird die Nachricht garnicht mehr angezeigt.

Das aktuelle "default" Template ist momentan nur mit dem Firefox sinnvoll zu betrachten (die verwendeten "display"-Eigenschaften sind offenbar Neuland für den IE). Aber das Template, CSS wie HTML können ja angepasst werden (dafür ist es da).

Für die Fehlernachrichten können massig Variablen benutzt werden, einfach mal eine falsche eingeben, dann sollte eine Exception geworfen werden, die die verfügbaren Variablen anzeigt.


Zu guter letzt kann mit dem Template "debug" noch gesehen werden, welcher "Zustand" an den Form_View gesendet wird, auf welche Variablen dieser also überhaupt Zugriff hat. Dazu einfach per GET den Parameter debug=1 eingeben.

Zur Quellcode-Einsicht:
http://www.antiphpfriend.de/form.zip


Über Feedback, gut wie schlecht, würde ich mich wirklich freuen!


PS: Buggy ist noch das Default-Loading, es ging mal, woran das liegt ist grad ne gute Frage
Zergling-new ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.11.2007, 19:46  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

http://www.antiphp.de/form/form.zip

Geändert von nikosch (06.07.2010 um 14:53 Uhr).
nikosch ist offline  
Alt 29.11.2007, 20:06  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hehe danke Hast du eine spontane Meinung dazu?
Zergling-new ist offline  
Alt 29.11.2007, 20:57  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Zergling,

die Implementierung sieht garnicht nicht schlecht aus. Ich werde mir das am Wochenende genauer ansehen und dir Feedback geben.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 29.11.2007, 21:30  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Das würde mich wirklich freuen - die Methoden sind noch ziemlich durcheinander, mal public, mal protected, das wird noch sortiert und kommentiert am Wochenende. Die Version poste ich dann nochmal, falls Interesse besteht.
Zergling-new ist offline  
Alt 29.11.2007, 22:16  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
das wird noch sortiert und kommentiert am Wochenende. Die Version poste ich dann nochmal, falls Interesse besteht.
Ich guck mir das auch am Wochenende mal genauer an. Wäre schön wenn du bis dahin Schönheitsfehler ausgemerzt hast .
phpdummi ist offline  
Alt 14.12.2007, 01:25  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

hi,

ohne abwertung deines scripts zerg, aber ich habe mir eigentlich immer sowas vorgestellt>

PHP-Code:
$form=new form;
$form->add(new input('text','vorname',FALSE,'Sie müssen einen Vornamen angeben',validate::HTML_CHARS);
$form->add(new input_multiple('radio','gender',FALSE,'Sie müssen angeben ob Sie %1s oder %2s sind!',validate::HTML_CHARS,'Mann','Frau')); 
dann noch mit __toString() usw.

naja, wenn ichs irgendwann mal umsetze, was ich nicht glaube weil ich doch lieber templates benutze, lass ichs euch wissen...

gruß
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline  
Alt 14.12.2007, 12:58  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Die variable Parameter-Verarbeitung ist viel komplexer, du brauchst viel mehr Weichen als wenn du call-chaining verwendest. Abgesehen davon instanzierst du bereits vor der Parameter-Übergabe. Die Instanzierung solltest du erst ganz ganz am Schluss machen. Sind so Kleinigkeiten, dessen Schwierigkeiten du erst beim Coden merkst.

__toString() ja, gute Idee, aber was unterscheidet dann deinen Entwurf von meinem? Letztlich musst du die gesamte Zeile ausgeben, sonst wäre die Label- ("vorname") und Fehlermeldungs-Information überflüssig. Wenn du etwas zeilenweise ausgibst, musst du aber auch das große ganze im Auge haben, schließlich willst du die Elemente bündig haben. Und dann kannst du das Formular gleich wie ich als Ganzes ausgeben.

Du wirst bemerken, ganz so einfach ist ein Formular-Generator nicht und du musst Kompromisse in der API machen. Vielleicht ist das auch der Grund dafür, warum es kaum einen weitverbreiteten Formular-Generator gibt: Jeder hat seine eigenen Vorstellungen von Bedienbarkeit und am Ende muss das Ding flexibel sein und einem Arbeit ersparen. Aber ein Formular ist nunmal ziemlich schnell hingedonnert, die Zeit kann man kaum unterbieten. Darum macht der Einsatz eines Formular-Generators ja nur Sinn, wenn du massig Formulare hast, die am besten alle gleich aussehen sollen.

Und genau dafür hab ich meine Klassen ja auch geschrieben.
Zergling-new ist offline  
Alt 14.12.2007, 13:10  
¯\_(ツ)_/¯
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.814
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Also dass ein Formular schnell hingedonnert ist ist ja klar. Aber die Validierung dauert dafür ewig! Deswegen ist eine Klasse die ein Formular generiert und validiert schon ne super Sache. Ich hab mir auch selber eine Klasse geschrieben. Bin zwar noch nicht ganz so zufrieden aber es nimmt mir sehr viel Arbeit ab. Bei mir ist es allerdings so dass ich die Werte für die einzelnen Felder bzw. die Fehlermeldungen als Variable speicher und explizit im Template angeben kann. Also kann ich das Formular immer noch flexibel Designen muss aber nicht mehr auf die Validierung achten.
__________________
▇█▓▒░◕‿‿◕░▒▓█▇
Flor1an ist offline  
Alt 14.12.2007, 19:05  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von RaZoR
Bei mir ist es allerdings so dass ich die Werte für die einzelnen Felder bzw. die Fehlermeldungen als Variable speicher und explizit im Template angeben kann.
So ist es bei mir ja auch. Letztlich bekommt die ominöse View-Schicht nur den Export des Controllers. Siehe Form_Controller->exportState(). Was der View damit anstellt ist seine Sache.

Ich denke wir bewegen uns alle in ähnlichen Sphären, ob jetzt dem einen Parameter, dem anderen Funktionsaufrufe lieber sind. Tja geschmackssache. Hier über ein objektives Richtig oder Falsch zu diskutieren macht sicherlich keinen Sinn.
Zergling-new ist offline  
Thema geschlossen


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

LinkBacks (?)
LinkBack to this Thread: http://www.php.de/tutorials/45163-php-formular-generator.html
Erstellt von For Type Datum
Metacrawler - Die Metasuchmaschine. This thread Refback 30.03.2011 19:15
Suche PHP Formular mit leich erweiterbaren Feldern - PSD-Tutorials.de This thread Refback 19.01.2011 13:56
www.webmail.de - Ihr kostenloser und vielseitiger Mailanbieter This thread Refback 25.10.2010 19:53
Formulare mit Ausgabewert auf Homepage erstellen - Forum - CHIP Online This thread Refback 16.05.2010 19:34
Metacrawler - Die Metasuchmaschine. This thread Refback 01.02.2010 19:05
Suche PHP Formular mit leich erweiterbaren Feldern - PSD-Tutorials.de - Forum This thread Refback 11.04.2009 18:32
Suche: PHP Formular Validierungs Bibliothek - FoN.phoenix This thread Refback 19.02.2009 18:30

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Formular - Generator - dh1sbg Trash 1 01.06.2008 11:56
Smiley Generator Jay0815 PHP Tipps 2008 3 28.12.2007 16:22
Wert aus Textfeld in neues Formular übernehmen (kein Submit) PsychoEagle HTML, Usability und Barrierefreiheit 9 02.01.2007 14:51
formular includen samspa5 PHP Tipps 2006 13 18.03.2006 11:37
Datenbank auslesen, in Formular darstellen und �ndern PHP Tipps 2006 8 22.02.2006 17:51
[Erledigt] Formular in Formular HTML, Usability und Barrierefreiheit 4 19.10.2005 12:18
leeres Formular PHP Tipps 2005-2 15 05.10.2005 16:49
[Erledigt] Formular testen .... HTML, Usability und Barrierefreiheit 7 19.09.2005 14:03
[Erledigt] PHP Formular ~~wichtig~~ PHP Tipps 2005 27 29.05.2005 19:38
Formular --> Ergebnis auf anderer Seite anzeigen Jojo1 PHP Tipps 2005 58 01.02.2005 17:13
[Erledigt] Im Formular user abfragen? Datenbanken 3 06.01.2005 10:51
[Erledigt] PHP Formular - Daten an nächsten Schritt weiter geben - Wie? PHP Tipps 2005 14 02.01.2005 20:05
Formular nach UPDATE anzeigen PHP Tipps 2004-2 5 22.12.2004 02:06
[Erledigt] Daten in einem Formular ausgeben und ändern PHP Tipps 2004-2 7 07.12.2004 17:22
[Erledigt] Daten in neuem Formular anzeigen PHP Tipps 2004 6 21.07.2004 10:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php formular generator, php form generator, formular generator php, formulargenerator php, php formular klasse, php formulargenerator, form generator php, formulargenerator, php formular, formular generator, php form builder, php generator, php formular class, formular generator kostenlos, formular php generator, php formular template, ajax formular generator, php form klasse, php klasse formular, php formgenerator

Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.