Form class
Ik heb een form class. Als een formulier wordt verzonden wordt meestal de method setValue of setValueArray aangeroepen.
setValue heeft de parameter field en value.
setValueArray heeft een parameter die een array is (field => value, field => value, etc.)
Maar in plaats van voor elk veld in een formulier de method setValue aan te roepen, of om eerst een array met alle field names en values te maken, kan ik dan niet beter gewoon de $_POST variabele meegeven aan die class?
Dan doe je in 1 method alle $_POST data doorgeven, en kan de class zelf met een loop een array ervan maken enzovoort.
Dat zou een hele hoop werk kunnen besparen. Is dit een goed idee?
Ik heb dit al geprobeerd, maar moet nog even de juiste manier vinden. De class weet namelijk niet de indexes van de $_POST array, (dus de veldnamen) is er dus een functie die de indexes van een array kan ophalen?
Ik vond array_slice() op php.net, maar die werkte niet in mijn code, ik gebruikte hem misschien verkeerd?
Gewijzigd op 29/08/2013 15:32:00 door Mark Hogeveen
Je bent trouwens niet alleen; drupal heeft dit ook.
Zie bv. hier: https://drupal.org/node/751826
Het $form object kan zo zowel het formulier genereren, de POST opvangen en zelfs een database tabel genereren (in sommige gevallen).
Die key's?
Simpelweg zo:
Kijk ook naar deze functie: http://php.net/manual/en/function.array-keys.php
Gewijzigd op 29/08/2013 17:25:11 door Kris Peeters
Het probleem is namelijk dat je geen return kunt doen in de empty() functie. Daar kwam ik nu pas achter.
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?PHP
// register.php
include "config.php";
include "form.class.php";
include "validator.class.php";
// uses: form.class.php, validator.class.php, config.php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['register'])) {
$Form = new Form;
$Form->setAllPostValues($_POST);
$Validator = new Validator;
if(empty($Form->getValue("username"))) {
$Form->setErrorByField("username", "Vul een gebruikersnaam in");
} else {
if(!$Validator->checkUsername($Form->getValue("username"))) {
$Form->setErrorByField("username", "Een gebruikersnaam mag alleen letters, hoofdletters, cijfers en de tekens . _ bevatten");
}
}
if(empty($Form->getValue("email"))) {
$Form->setErrorByField("email", "Vul een emailadres in");
} else {
if(!$Validator->checkEmail($Form->getValue("email"))) {
$Form->setErrorByField("email", "Dit emailadres in ongeldig");
}
}
if(empty($Form->getValue("password"))) {
$Form->setErrorByField("password", "Vul een wachtwoord in");
}
if(empty($Form->getValue("password_check"))) {
$Form->setErrorByField("password_check", "Vul je wachtwoord nogmaals in");
}
if(!empty($Form->getValue("password")) && !empty($Form->getValue("password_check"))) {
if($Form->getValue("password") == $Form->getValue("password_check"))) {
if(strlen($Form->getValue("password")) >= MIN_PWD_LENGTH) {
if(strlen($Form->getValue("password") <= MAX_PWD_LENGTH)) {
if(!$Validator->checkPasswordSyntax($Form->getValue("password"))) {
$Form->setErrorByField("password", "Het wachtwoord moet minimaal 1 hoofdletter en 1 cijfer bevatten");
}
} else {
$Form->setErrorByField("password", "Het wachtwoord is te lang");
}
} else {
$Form->setErrorByField("password", "Het wachtwoord is te kort");
}
} else {
$Form->setErrorByField("password", "De ingevulde wachtwoorden zijn niet hetzelfde");
}
}
if(empty($Form->getValue("captcha"))) {
$Form->setErrorByField("captcha", "Vul de code in");
} else {
if(!$Form->getValue("captcha") == $_SESSION['captcha']) {
$Form->setErrorByField("De code was niet juist");
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Registreren</title>
</head>
<body>
<form method="post" action="">
<div class="row">
<label>
Gebruikersnaam:<input type="text" name="username" value="<? echo $Form->getSafeValue("username"); ?>" />
<? echo $Form->getError("username"); ?>
</label>
</div>
<div class="row">
<label>
Emailadres:<input type="text" name="email" value="<? echo $Form->getSafeValue("email"); ?>" />
<? echo $Form->getError("email"); ?>
</label>
</div>
<div class="row">
<label>
Wachtwoord:<input type="password" name="password" value="<? echo $Form->getSafeValue("password"); ?>" />
<? echo $Form->getError("password"); ?>
</label>
</div>
<div class="row">
<label>
Wachtwoord herhalen:<input type="password" name="password_check" value="<? echo $Form->getSafeValue("password_check"); ?>" />
<? echo $Form->getError("password_check"); ?>
</label>
</div>
<div class="row">
<label for="captcha">
<img src="captcha.php" />
</label>
</div>
<div class="row">
<label>
Typ bovenstaande code over:<input type="text" id="captcha" name="captcha" />
<? $Form->getError("captcha"); ?>
</label>
</div>
<div class="row submitrow">
<input type="submit" name="register" value="Registreren" />
</div>
</form>
</body>
</html>
// register.php
include "config.php";
include "form.class.php";
include "validator.class.php";
// uses: form.class.php, validator.class.php, config.php
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['register'])) {
$Form = new Form;
$Form->setAllPostValues($_POST);
$Validator = new Validator;
if(empty($Form->getValue("username"))) {
$Form->setErrorByField("username", "Vul een gebruikersnaam in");
} else {
if(!$Validator->checkUsername($Form->getValue("username"))) {
$Form->setErrorByField("username", "Een gebruikersnaam mag alleen letters, hoofdletters, cijfers en de tekens . _ bevatten");
}
}
if(empty($Form->getValue("email"))) {
$Form->setErrorByField("email", "Vul een emailadres in");
} else {
if(!$Validator->checkEmail($Form->getValue("email"))) {
$Form->setErrorByField("email", "Dit emailadres in ongeldig");
}
}
if(empty($Form->getValue("password"))) {
$Form->setErrorByField("password", "Vul een wachtwoord in");
}
if(empty($Form->getValue("password_check"))) {
$Form->setErrorByField("password_check", "Vul je wachtwoord nogmaals in");
}
if(!empty($Form->getValue("password")) && !empty($Form->getValue("password_check"))) {
if($Form->getValue("password") == $Form->getValue("password_check"))) {
if(strlen($Form->getValue("password")) >= MIN_PWD_LENGTH) {
if(strlen($Form->getValue("password") <= MAX_PWD_LENGTH)) {
if(!$Validator->checkPasswordSyntax($Form->getValue("password"))) {
$Form->setErrorByField("password", "Het wachtwoord moet minimaal 1 hoofdletter en 1 cijfer bevatten");
}
} else {
$Form->setErrorByField("password", "Het wachtwoord is te lang");
}
} else {
$Form->setErrorByField("password", "Het wachtwoord is te kort");
}
} else {
$Form->setErrorByField("password", "De ingevulde wachtwoorden zijn niet hetzelfde");
}
}
if(empty($Form->getValue("captcha"))) {
$Form->setErrorByField("captcha", "Vul de code in");
} else {
if(!$Form->getValue("captcha") == $_SESSION['captcha']) {
$Form->setErrorByField("De code was niet juist");
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Registreren</title>
</head>
<body>
<form method="post" action="">
<div class="row">
<label>
Gebruikersnaam:<input type="text" name="username" value="<? echo $Form->getSafeValue("username"); ?>" />
<? echo $Form->getError("username"); ?>
</label>
</div>
<div class="row">
<label>
Emailadres:<input type="text" name="email" value="<? echo $Form->getSafeValue("email"); ?>" />
<? echo $Form->getError("email"); ?>
</label>
</div>
<div class="row">
<label>
Wachtwoord:<input type="password" name="password" value="<? echo $Form->getSafeValue("password"); ?>" />
<? echo $Form->getError("password"); ?>
</label>
</div>
<div class="row">
<label>
Wachtwoord herhalen:<input type="password" name="password_check" value="<? echo $Form->getSafeValue("password_check"); ?>" />
<? echo $Form->getError("password_check"); ?>
</label>
</div>
<div class="row">
<label for="captcha">
<img src="captcha.php" />
</label>
</div>
<div class="row">
<label>
Typ bovenstaande code over:<input type="text" id="captcha" name="captcha" />
<? $Form->getError("captcha"); ?>
</label>
</div>
<div class="row submitrow">
<input type="submit" name="register" value="Registreren" />
</div>
</form>
</body>
</html>
En ik vind het zo jammer dat ik steeds bij elke controle helemaal $Form->getvalue(...) moet typen.
Het is wel meer OO dan gewoon de $_POST variabele te typen, maar ook weer langer.
Kan dit nog efficiënter?
Meer niet.
En die array laten aflopen met foreach. Zowel in klas als html.
Een method die alle verplichte velden doorloopt en controleert of ze gevuld zijn. Bij een leeg veld setErrorByField() aanroepen van Form class.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// register.php
include "config.php";
include "form.class.php";
include "validator.class.php";
$velden = array("username"=>"text", "email"=>"email", "password"=>"password", "password_check"=>"password", "captcha"=>"text", "gekozen_datum"=>"date");
foreach($velden as $veld=>$type)
{
echo ' <div class="row">
<label for="'.$veld.'">Vul hier uw '.$veld.' in:</label>
<input type="'.$type.'" id="'.$veld.'" name="'.$veld.'">
'.$Form->getError($veld).'
</div>';
}
?>
// register.php
include "config.php";
include "form.class.php";
include "validator.class.php";
$velden = array("username"=>"text", "email"=>"email", "password"=>"password", "password_check"=>"password", "captcha"=>"text", "gekozen_datum"=>"date");
foreach($velden as $veld=>$type)
{
echo ' <div class="row">
<label for="'.$veld.'">Vul hier uw '.$veld.' in:</label>
<input type="'.$type.'" id="'.$veld.'" name="'.$veld.'">
'.$Form->getError($veld).'
</div>';
}
?>
Daarnaast hoort je <input> NIET in je <label>
En moet je <label> ook een for="" hebben.
Wil je moeilijker doen (met html5-pattersn, required, limitaties etc), dan zou ik het persoonlijk gewoon volledig uittypen.
Edit:
Eddy; de PHP-tags is voor een URL naar php.net/{functienaam}. Voor letterlijke code kun je de code-tags gebruiken :)
Gewijzigd op 30/08/2013 11:35:50 door Chris -
Nog 1 vraagje, is het verstandiger om de form class mee te geven als object aan de validator? Of gewoon weer de velden met hun waardes aan de validator geven?