FormCreator Class
Ik heb eindelijk mijn eerste (werkende!) class kunnen maken. Werd tijd :-P. Ben er dus ook super trots op, al stelt het voor de meesten van jullie natuurlijk weinig voor.
Ik wilde aan jullie vragen of jullie nog tips/verbeteringen/opmerkingen/aanmerkingen/commentaar/kritiekpuntjes hadden en of jullie zo vriendelijk willen zijn deze te melden. Al zal dat kritiek niet zo moeilijk zijn tegenwoordig, haha :-P.
(Geef overigens ook even je mening over de lay-out van mijn geweldige scriptlib, zelf via htaccess enzo gemaakt :-P.)
http://www.dzjemo.nl/phphulp/formcreator.php
Ik hoor het wel!
Jezpur
* Ik zie HTML code in de class. Niet zo zeer de option en de verschillende form elementen, maar de table om alles netjes te krijgen. Laat dat aan de designer over. Tegenwoordig worden vooral divs, spans, labels en misschien ook wel lists gebruikt om een formulier te stylen.
* Extra attributen zoals style e.d. kunnen niet toegevoegd worden aan een form element. Het doel die je voor ogen had als zijnde flexibel formulier maker is eigenlijk verdwenen. Je zit vast aan de standaarden van de class, en daar moet je het mee doen. Wat als je een custom JavaScript script hebt, en je wilt een element aanspreken met de attribute 'rel'? Dat kan nu niet.
Desalniettemin heeft deze class ook voordelen voor de gemiddelde programmeur/designer. In één oogopslag is het formulier te zien en in een luttele seconden kan je een formulier samenstellen.
Ik hoop dat je er wat mee kunt.
EDIT: Ik ben erg gecharmeerd van het Prado framework. Daar hebben ze ook custom HTML formulier classes. Een voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<com:TLabel
ForControl="Username"
Text="Username" /><br />
<com:TTextBox
ID="Username"
CssClass="text" /><br />
<!-- En nog een aantal ingebouwde validator dingen -->
<com:TLabel
ForControl="Password"
Text="Password" /><br />
<com:TTextBox
ID="Password"
TextMode="Password"
CssClass="text" />
<!-- En nog een aantal ingebouwde validator dingen -->
<com:TLabel
ForControl="Email"
Text="Email Address" /><br />
<com:TTextBox
ID="Email"
CssClass="text" />
<!-- En nog een aantal ingebouwde validator dingen -->
ForControl="Username"
Text="Username" /><br />
<com:TTextBox
ID="Username"
CssClass="text" /><br />
<!-- En nog een aantal ingebouwde validator dingen -->
<com:TLabel
ForControl="Password"
Text="Password" /><br />
<com:TTextBox
ID="Password"
TextMode="Password"
CssClass="text" />
<!-- En nog een aantal ingebouwde validator dingen -->
<com:TLabel
ForControl="Email"
Text="Email Address" /><br />
<com:TTextBox
ID="Email"
CssClass="text" />
<!-- En nog een aantal ingebouwde validator dingen -->
En dat wordt dan omgezet in valid (X)HTML, zodat de designer het af kan handelen met zoals je al een beetje ziet CSS styling.
Gewijzigd op 01/01/1970 01:00:00 door GaMer B
Ik zit misschien een beetje in de lucht te grijpen als je style attributen wil toevoegen, ik doelde meer op id="" enzo. Die style daar is meer een extra voorbeeldje. Je kunt net zo goed als extra iets met rel opgeven. Hoeft niet per se die id en style te zijn, dat was meer een voorbeeld.
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$formulier = new Formulier('test'); // name is dan test
$formulier->addElement('text', 'een value', $array(
'attribute' => 'waarde',
'attribute2' => 'waarde',
));[/code]
(Beetje afgekeken van Zend (dacht ik) :P
$formulier = new Formulier('test'); // name is dan test
$formulier->addElement('text', 'een value', $array(
'attribute' => 'waarde',
'attribute2' => 'waarde',
));[/code]
(Beetje afgekeken van Zend (dacht ik) :P
Gewijzigd op 01/01/1970 01:00:00 door GaMer B
Kijk anders eens naar Zend_Form, dat is een onderdeel van het Zend Framework waar ik wel gecharmeerd van ben.
Da's wel erg uitgebreid, hoor :-P. Zo ver was ik nou ook weer niet van plan te gaan, haha.
Alleen het probleem van stylen nog oplossen. Die table moet er uit.
Bijv.
Code (php)
'k Heb nu maar iets gedaan, werk nooit met labels dus weet niet of dat goed is :-P.
$username->addValidator('required');
$username->addValidator('regex', '[\w]{3,50}');
Jouw concept dingetje is niet echt geweldig overigens. Dan leg je weer teveel werk bij de programmeur en niet zozeer bij de designer.
Nog een ideetje: Wat nou als je de wrapper variabel maakt? Dat je zoiets kun instellen:
$form->setWrapper(array('<table>', '</table>'));
$form->setWrapperRow(array('<tr>', '</tr>'));
$form->setWrapperColumn(array('<td>', '</td>'));
Misschien een ideetje.
Klopt dat het eigenlijk niet echt geweldig is. Maar het gaat me meer om het OOP gedeelte en of de logica zo een beetje klopt. Ik vind OOP echt geweldig en als ik het zelf goed kan zou dat helemaal top zijn. Maar op dit moment ben ik alleen maar dingetjes aan het uitproberen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class Form
- addField(Field $field)
- draw()
abstract class Field
- setValue()
- setAttribute()
- draw() (wordt aangeroepen door Form::draw)
class TextField extends Field
- setPlaceholder($text)
- draw() (overschrijven, zodat je specifiek input[type=text] kan teruggeven)
$x = new Form;
$naam = new TextField('Voornaam');
$naam->setPlaceholder('Vul hier je voornaam in');
// dit kan je ook onderbrengen in de class zelf
if(isset($_POST['naam']))
$naam->setValue($_POST['naam']);
$x->addField($naam);
$x->draw();
?>
class Form
- addField(Field $field)
- draw()
abstract class Field
- setValue()
- setAttribute()
- draw() (wordt aangeroepen door Form::draw)
class TextField extends Field
- setPlaceholder($text)
- draw() (overschrijven, zodat je specifiek input[type=text] kan teruggeven)
$x = new Form;
$naam = new TextField('Voornaam');
$naam->setPlaceholder('Vul hier je voornaam in');
// dit kan je ook onderbrengen in de class zelf
if(isset($_POST['naam']))
$naam->setValue($_POST['naam']);
$x->addField($naam);
$x->draw();
?>
Hm.. Ja, Zend is me wat. Heb het hele zooitje op m'n pc staan omdat ik Zend_Db gebruik bij een van m'n websites, daar ondersteunde men nog geen PDO.... Nja, dat terzijde: ik zal eens de documentatie van Zend_Form door gaan nemen, misschien dat ik dat dan voortaan wel ga gebruiken om een formulier te maken :-).
Naja, je hoeft niet specifiek Zend_Form te bekijken, je kan ook kijken naar FormHandler of een ander "groot" form-hulpje-script-ding-achtig-iets. Ik denk dat ze allemaal wel op zo'n soort manier met meerdere classes, en classes specifiek voor bepaalde elementen zullen werken.
Dus je krijgt bijvoorbeeld een abstracte class met input o.i.d.
Die geef je bepaalde methodes en variablen mee, die voor iedere class verplicht zijn, en dan maak je dus allemaal overerfende classes voor een textfield enzo.
En dat je dan een class form heeft, waarmee je het hele form kan gaan bouwen.
(dus eigenlijk wat in Jelmer z'n voorbeeld code staat )
Ik mis het spannendste gedeelte namelijk het controleren van de gegevens en het wegschrijven naar DB of email
- haal de echo uit outputForm(). Return gewoon het resultaat.
- probeer de velden op te bouwen door middel van DOM. Hierdoor is het makkelijk om attributen / waardes toe te voegen. Bovendien verkleint dit de kans op fouten én is het XHTML valid.
Ikzelf heb (naast een soortgelijke implementatie als Jelmer geeft) nog methodes addValidator en addFilter, die je op de velden kan loslaten. Als elke validator succesvol valideert is het formulier correct.
Je zou eventueel een onComplete methode kunnen toevoegen, die een actie (callback) doet als het formulier correct is (zoals het wegschrijven naar een DB).
Daarnaast, als je het helemaal doorvoert (MVC-achtig), is het wellicht logisch om een View object te retourneren als je draw() aanroept. Ikzelf twijfel nog hoe ik dat in mijn eigen formulierklasse kan / ga implementeren.
Een goede formulierklasse is ingewikkelder dan je denkt, maar ook een mooie uitdaging! Leesvoer.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Ik probeer nu ook te zorgen dat ik events kan toevoegen (onClick, onChange, ...); dat, buiten de html van het formulier, ook een insert string wordt gebouwd met de juiste velden, met de $_POST ingewerkt; dat de juiste waarden in javascript worden gelezen en doorgegeven aan een functie die alles met Ajax opstuurt.
Het begint mooi te werken, maar er is nog een hoop werk aan.
als je het helemaal mooi wilt doen moet je de form kunnen bouwen aan de hand van de eigenschappen van de in een SQL statement gevraagde columns
Hm, ik denk dat ik hem nog wel ietsjes ga uitbouwen. In ieder geval een validatie er op :-).
Klaasjan Boven schreef op 30.04.2009 11:16:
als je het helemaal mooi wilt doen moet je de form kunnen bouwen aan de hand van de eigenschappen van de in een SQL statement gevraagde columns
Uhm, ik doe zo ongeveer het omgekeerde, maar je hebt wel een punt.
Met een sql dump, waar de CREATE TABLE op staat, moet dat wel lukken.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay