Form creator
Ik wou een gemakkelijke manier om velden toe te voegen aan mijn script. Iets dat snel en efficient werkt.
Ik heb de volgende code, willen jullie deze voor mij beoordelen?
Groeten, Donny
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
function createForm($types){
$result = '';
$type = explode(',',$types);
$labelstart = '<label class="labelform">';
$labelend = '</label>';
$divstart = '<div class="inputholder">';
$divend = '</div>';
foreach($type AS $resultaat){
if ($resultaat == 1) $result .= $labelstart.'Username'.$labelend.$divstart.'<input type="text" name="username">'.$divend;
if ($resultaat == 2) $result .= $labelstart.'Password'.$labelend.$divstart.'<input type="text" name="password">'.$divend;
if ($resultaat == 3) $result .= $labelstart.'Pass repeat'.$labelend.$divstart.'<input type="text" name="passwordr">'.$divend;
if ($resultaat == 4) $result .= $labelstart.'Email'.$labelend.$divstart.'<input type="text" name="email">'.$divend;
if ($resultaat == 5) $result .= $labelstart.'Overige'.$labelend.$divstart.'<input type="text" name="overige">'.$divend;
}
return $result;
}
echo createForm('1,2,4,5');
?>
function createForm($types){
$result = '';
$type = explode(',',$types);
$labelstart = '<label class="labelform">';
$labelend = '</label>';
$divstart = '<div class="inputholder">';
$divend = '</div>';
foreach($type AS $resultaat){
if ($resultaat == 1) $result .= $labelstart.'Username'.$labelend.$divstart.'<input type="text" name="username">'.$divend;
if ($resultaat == 2) $result .= $labelstart.'Password'.$labelend.$divstart.'<input type="text" name="password">'.$divend;
if ($resultaat == 3) $result .= $labelstart.'Pass repeat'.$labelend.$divstart.'<input type="text" name="passwordr">'.$divend;
if ($resultaat == 4) $result .= $labelstart.'Email'.$labelend.$divstart.'<input type="text" name="email">'.$divend;
if ($resultaat == 5) $result .= $labelstart.'Overige'.$labelend.$divstart.'<input type="text" name="overige">'.$divend;
}
return $result;
}
echo createForm('1,2,4,5');
?>
Toevoeging op 18/10/2013 01:03:48:
Zo kan ik bijvoorbeeld voor een account aanmaken createForm('1,2') gebruiken, en voor registreren 1 t/m 5.
Verschillende account registraties zijn mogelijk dus kan het dan snel opvragen zonder al te veel code.
Toevoeging op 18/10/2013 01:31:41:
Ik heb ook een FormCreator in OOP gemaakt, ook daar hoor ik graag de meningen over. Het werkt wel veel makkelijker dan de eerste methode:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
class FormBuilder {
private $inputTpe;
private $inputName;
private $inputDescription;
private $finished;
private $all;
private $formMethod;
private $formAction;
private $formId;
private $labelPrefix;
private $labelSuffix;
public function __construct($id, $method, $url){
$this->formId = $id;
$this->formMethod = $method;
$this->formAction = $url;
}
public function startForm(){
return '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
}
public function append($omschrijving, $type, $name){
$this->inputType = $type;
$this->inputName = $name;
$this->inputDescription = $omschrijving;
$this->all[] = '<label for="'.$this->inputName.'">'.$this->inputDescription.'</label><input type="'.$this->inputType.'">';
}
public function allFields(){
foreach ($this->all AS $result){
echo $result;
}
}
}
$class = new FormBuilder('login-form', 'post', 'index.php');
echo $class->startForm();
echo $class->append('Uw gebruikersnaam', 'text', 'username');
echo $class->append('Uw wachtwoord', 'password', 'username');
echo $class->allFields();
?>
class FormBuilder {
private $inputTpe;
private $inputName;
private $inputDescription;
private $finished;
private $all;
private $formMethod;
private $formAction;
private $formId;
private $labelPrefix;
private $labelSuffix;
public function __construct($id, $method, $url){
$this->formId = $id;
$this->formMethod = $method;
$this->formAction = $url;
}
public function startForm(){
return '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
}
public function append($omschrijving, $type, $name){
$this->inputType = $type;
$this->inputName = $name;
$this->inputDescription = $omschrijving;
$this->all[] = '<label for="'.$this->inputName.'">'.$this->inputDescription.'</label><input type="'.$this->inputType.'">';
}
public function allFields(){
foreach ($this->all AS $result){
echo $result;
}
}
}
$class = new FormBuilder('login-form', 'post', 'index.php');
echo $class->startForm();
echo $class->append('Uw gebruikersnaam', 'text', 'username');
echo $class->append('Uw wachtwoord', 'password', 'username');
echo $class->allFields();
?>
Gewijzigd op 18/10/2013 02:52:23 door Donny Wie weet
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
public function __construct($id, $method, $url){
$this->formId = $id;
$this->formMethod = $method;
$this->formAction = $url;
if($method == "get" || $method == "post")
$this->all[] = '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
else
throw new Exception("Moet GET of POST zijn");
}
$this->formId = $id;
$this->formMethod = $method;
$this->formAction = $url;
if($method == "get" || $method == "post")
$this->all[] = '<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
else
throw new Exception("Moet GET of POST zijn");
}
Even controleren of de waarde wel echt een get of post is. Als je later een keer pot ipv post invoert dan hoe je niet uren bezig te zijn om uit te puzzelen waarom je form niet werkt ;) Ik heb
Code (php)
1
'<form action="'.$this->formAction.'" method="'.$this->formMethod.'" id="'.$this->formId.'">';
in de constructor gezet. Het komt als eerst in de array. Hierdoor wordt hij ook als eerst uitgeprint bij allFields(). Dan hoef je niet constant eerst ->startForm(); te gebruiken.
Als laatste zou je de eerste functie in je bericht kunnen verwerken in je class. Hiervoor moet append wel aangepast worden om dezelfde functionaliteit te hebben.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
public function append($omschrijving, $type, $name, $labelClass = "", $divClass = ""){
$this->inputType = $type;
$this->inputName = $name;
$this->inputDescription = $omschrijving;
$this->all[] = '<label '.$labelClass.' for="'.$this->inputName.'">'.$this->inputDescription.'</label><div '.$divClass.' ><input name="'.$this->inputName.'" type="'.$this->inputType.'"></input></div>';
}
$this->inputType = $type;
$this->inputName = $name;
$this->inputDescription = $omschrijving;
$this->all[] = '<label '.$labelClass.' for="'.$this->inputName.'">'.$this->inputDescription.'</label><div '.$divClass.' ><input name="'.$this->inputName.'" type="'.$this->inputType.'"></input></div>';
}
De append functie heeft dan nu twee optionele waardes. En de input heeft altijd een <div> om zich heen. De methode createStandard wordt dan dit
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
function createStandard($types, $labelClass, $divClass){
$type = explode(',',$types);
$labelstart = 'class="'.$labelClass.'"';
$divstart = 'class="'.$divClass.'"';
foreach($type AS $resultaat){
if ($resultaat == 1) $this->append("Username", "text", "username", $labelstart, $divstart);
if ($resultaat == 2) $this->append("Password", "text", "password", $labelstart, $divstart);
if ($resultaat == 3) $this->append("Pass repeat", "text", "passwordr", $labelstart, $divstart);
if ($resultaat == 4) $this->append("Email", "text", "email", $labelstart, $divstart);
if ($resultaat == 5) $this->append("Overige", "text", "overige", $labelstart, $divstart);
}
}
$type = explode(',',$types);
$labelstart = 'class="'.$labelClass.'"';
$divstart = 'class="'.$divClass.'"';
foreach($type AS $resultaat){
if ($resultaat == 1) $this->append("Username", "text", "username", $labelstart, $divstart);
if ($resultaat == 2) $this->append("Password", "text", "password", $labelstart, $divstart);
if ($resultaat == 3) $this->append("Pass repeat", "text", "passwordr", $labelstart, $divstart);
if ($resultaat == 4) $this->append("Email", "text", "email", $labelstart, $divstart);
if ($resultaat == 5) $this->append("Overige", "text", "overige", $labelstart, $divstart);
}
}
Gewijzigd op 18/10/2013 10:24:25 door Jeroen Kwakkel
@jeroen: voorbeeld 1 was structureel PHP. Aangezien mijn class bijna goed was, kan ik die dus eventueel gebruiken. En dat over de POST waarde: thanks for the tip!
@Dan moet je mijn eerste post toch echt even goed lezen want ik heb niks gezegd over "gebruiken" maar ik zei KIJK hoe een groot framework het doet om er van te leren. En als je ziet hoe een framework dingen oplost creeer je hierdoor een bepaalde logica voor jezelf wat nou doorgaans moet/kan met OOP en wat doorgaans de best practice is wanneer je een klasse schrijft.
In dit geval zal ik het heel mooi gaan maken en het form op splitten in 3 verschillende klassen:
- Form
- FormInputInterface (TextInput, DateInput, ...)
- FormBuilderInterface (HtmlFormBuilder, Html5FormBuilder, ...)
De Form klasse houdt alle inputs voor 1 form vast, de FormInput representateerd 1 input en de FormBuilder maakt vervolgens het form.
In de symfony form component, vaak aangeduid als de meest mooie form component (echt mooi zijn ze nog steeds niet), is die FormInputInterface weggehaald. Ipv daarvan hebben ze elk input ook een form gemaakt. Neem nou dit simpele formpje:
Die bestaat uit deze form elementen:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
+----------------+
|New Product:form|
+----------------+
+---------+ +----------+ +----------------+ +---------------+ +-------------+ +---------------------+
|Name:text| |Price:text| |Released on:date| |Category:choice| |Rating:number| |Discontinued:checkbox|
+---------+ +----------+ +----------------+ +---------------+ +-------------+ +---------------------+
|New Product:form|
+----------------+
+---------+ +----------+ +----------------+ +---------------+ +-------------+ +---------------------+
|Name:text| |Price:text| |Released on:date| |Category:choice| |Rating:number| |Discontinued:checkbox|
+---------+ +----------+ +----------------+ +---------------+ +-------------+ +---------------------+
Vervolgens bestaat het date form type weer uit wat elementen:
Als ik het goed begrijp is het dan:
class Form {
}
class InputField extend Form {
}
class Checkbox extend Form {
}
begrijp ik dat goed?
En dan heb je functies als add(Child) waardoor je fields aan je form kan toevoegen.
Nog een vraag:
class Form {
//Een public var voor het formulier
//Formulier maken: __construct
}
class InputField extends Form {
//een private var omdat je hier alleen maar de var in de inputfield class gebruikt.
}
class Checkbox extends Form {
}
class weergeefForm extends Form {
}
Is mijn indeling zo goed?
Toevoeging op 18/10/2013 16:06:43:
@reshad, sorry, begreep je verkeerd, en ik ga er zeker even naar kijken