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.)
Juist als je OOP zo geweldig vindt is het leuk om eens de richting op te gaan van Zend_Form: Voor ieder element een eigen class. Op die manier kan je logica die specifiek voor select of input[type=radio] is in hun eigen class houden, en kan je nieuwe (of hergebruikte, maar opnieuw opgemaakte) form-elementen toevoegen zonder classes te hoeven veranderen. Iets a la:
<?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']);
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.
Maar is het niet de hele bedoeling van OOP dat al je gegevens die je opslaat, een soort object word.
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 )
Wat verbeterpunten van je class:
- 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.
Ik ben toevallig ook bezig aan een form class.
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.