Foutmeldingen in/bij formuliervelden
In het vogende stuk code (Ik weet niet hoe ik de stukken code van elkaar kan schreiden:
Code Form class:
Code Element class
Code Text Element
Code RegistratieForm
Code formulier.php
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
<?php
abstract class Form implements IForm {
private $elements;
private $id;
private $action;
private $method;
private $attribs;
private $isGeldig;
private $errorMessages;
private $values;
const METH_POST = 'post';
const METH_GET = 'get';
public function __construct($options) {
$this->isGeldig = true;
$this->errorMessages = array();
$this->values = array();
$this->id = isset($options['id']) ? $options['id'] : 'Formulier';
$this->action = isset($options['action']) ? $options['action'] : '#';
$this->method = isset($options['method']) ? $options['method'] : self::METH_POST;
//attribs zijn alle overige HTML-attributen die je aan een formulier zou willen toekennen: style, class etc.
$this->attribs = isset($options['attribs']) ? $options['attribs'] : '';
}
public function add(IElement $elm) {
$this->elements[$elm->getName()] = $elm;
}
public function render() {
//PHP_EOL is een ingebouwde constante in PHP die een nieuwe regel maakt (zie je in broncode van de HTML)
$html = "<form method='{$this->method}' action='{$this->action}' id='{$this->id}' {$this->attribs}>" . PHP_EOL;
foreach ($this->elements as $element) {
$html .= $element->render() . '<br />' . PHP_EOL;
}
$html .= "</form>" . PHP_EOL;
return $html;
}
public function isValid() {
$this->clean();
foreach ($this->elements as $element) {
if (!$element->isValid()) {
$this->isGeldig = false;
$this->errorMessages[$element->getName()] = $element->getMessages();
}
}
return $this->isGeldig;
}
public function getMessages() {
return $this->errorMessages;
}
public function clean() {
foreach ($this->elements as $element) {
$element->clean();
}
}
public function getValues() {
foreach ($this->elements as $key => $element) {
$this->values[$key] = $element->getValue();
}
return $this->values;
}
}
?>
code class Element
<?php
abstract class Element implements IElement {
protected $filters;
protected $validators;
protected $options;
protected $value;
protected $name;
protected $label;
protected $attribs;
protected $isGeldig;
protected $errorMessages;
public function __construct(array $options = array())
{
$this->isGeldig = true;
$this->filters = array();
$this->validators = array();
$this->value = '';
$this->setOptions($options);
}
public function setOptions(array $options)
{
$this->name = isset($options['name']) ? $options['name'] : 'standaardnaam'; //eigenlijk moet de naam worden getest; niet alle namen zijn volgens de HTML-specs toegestaan!
$this->label = isset($options['label']) ? $options['label'] : 'label';
$this->value = isset($options['value']) ? $options['value'] : '';
$this->attribs = isset($options['attribs']) ? $options['attribs'] : '';
if (isset($options['validators']) && is_array($options['validators'])) {
foreach ($options['validators'] as $validator) {
$this->addValidator($validator);
}
}
if (isset($options['filters']) && is_array($options['filters'])) {
foreach ($options['filters'] as $filter) {
$this->addFilter($filter);
}
}
}
public function addValidator(Validator $validator)
{
$this->validators[] = $validator;
}
abstract public function render();
public function addFilter(Filter $filter)
{
$this->filters[] = $filter;
}
public function isValid()
{
foreach ($this->validators as $validator) {
if (!$validator->isValid($this->value)) {
$this->isGeldig = false;
$this->errorMessages[] = $validator->getMessages();
}
}
return $this->isGeldig;
}
public function clean()
{
$localValue = $this->value;
foreach ($this->filters as $filter) {
$localValue = $filter->clean($localValue);
}
$this->value = $localValue;
}
public function getValue()
{
return $this->value;
}
public function getMessages()
{
return $this->errorMessages;
}
public function getName()
{
return $this->name;
}
}
?>
Code Text element
<?php
/**
* User: GJ
* Name: TextElement.php
* Date: 14-8-13
* Time: 12:10
*/
class TextElement extends Element {
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type='text' name='{$this->name}' value='{$this->value}' $this->attribs>";
$html .= '</label>';
$html .= $this->getMessages();
return $html;
}
}
?>
Code RegistratieForm:
<?php
class RegistratieForm extends Form {
public function __construct($options) {
parent::__construct($options);
$initials = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$initials->setOptions(array(
'name' => 'voorletters',
'label' => 'Uw voorlettes',
'value' => isset($_GET['voorletters']) ? $_GET['voorletters'] : '',
'validators' => array(
new InitialValidator(array() /* no options necessary */),
),
)
);
$lastname = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$lastname->setOptions(array(
'name' => 'achternaam',
'label' => 'Uw achternaam',
'value' => isset($_GET['achternaam']) ? $_GET['achternaam'] : '',
'validators' => array(
new LastNameValidator(array() /* no options necessary */),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
$email = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$email->setOptions(array(
'name' => 'email',
'label' => 'Uw e-mailadres',
'value' => isset($_GET['email']) ? $_GET['email'] : '',
'validators' => array(
new EmailValidator(array() /* no options necessary */),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
// of we maken een element en geven bij de constructie al de opties weer, zoals hier
$password = new PasswordElement(array(
'name' => 'password',
'label' => 'Uw wachtwoord',
'value' => isset($_GET['password']) ? $_GET['password'] : '',
'validators' => array(
new StringLengthValidator(array('min' => 3, 'minError' => 'Het wachtwoord is te kort', 'max' => 12, 'maxError' => 'Het wachtwoord is te lang'))
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
$submit = new SubmitElement(array(
'value' => 'verzenden',
'name' => 'verzenden',
)
);
//de gemaakte elementen toevoegen aan het formulier
$this->add($initials);
$this->add($lastname);
$this->add($email);
$this->add($password);
$this->add($submit);
}
}
?>
code formulier.php:
<?php
//autoloader
function __autoload($class) {
require_once $class . '.php';
}
//het formulier aanmaken
$form = new RegistratieForm(
array(
'id' => 'frmRegistratie',
'css' => 'userform',
'method' => 'get',
'action' => ''
)
);
//de elementen aanmaken:
if (isset($_GET['verzenden'])) {
$result = $form->isValid();
if ($result == TRUE) {
var_dump('correct', $form->getValues());
} else {
var_dump('', $form->getMessages());
}
die();
}
$html = $form->render();
echo $html;
?>
Hopelijk kan iemand mij helpen om de foutmeldingen in het formulier te krijgen op de plek waar de waarde niet valide is. (en de rest van het formulier ingevuld houden).
Alvast bedankt!
abstract class Form implements IForm {
private $elements;
private $id;
private $action;
private $method;
private $attribs;
private $isGeldig;
private $errorMessages;
private $values;
const METH_POST = 'post';
const METH_GET = 'get';
public function __construct($options) {
$this->isGeldig = true;
$this->errorMessages = array();
$this->values = array();
$this->id = isset($options['id']) ? $options['id'] : 'Formulier';
$this->action = isset($options['action']) ? $options['action'] : '#';
$this->method = isset($options['method']) ? $options['method'] : self::METH_POST;
//attribs zijn alle overige HTML-attributen die je aan een formulier zou willen toekennen: style, class etc.
$this->attribs = isset($options['attribs']) ? $options['attribs'] : '';
}
public function add(IElement $elm) {
$this->elements[$elm->getName()] = $elm;
}
public function render() {
//PHP_EOL is een ingebouwde constante in PHP die een nieuwe regel maakt (zie je in broncode van de HTML)
$html = "<form method='{$this->method}' action='{$this->action}' id='{$this->id}' {$this->attribs}>" . PHP_EOL;
foreach ($this->elements as $element) {
$html .= $element->render() . '<br />' . PHP_EOL;
}
$html .= "</form>" . PHP_EOL;
return $html;
}
public function isValid() {
$this->clean();
foreach ($this->elements as $element) {
if (!$element->isValid()) {
$this->isGeldig = false;
$this->errorMessages[$element->getName()] = $element->getMessages();
}
}
return $this->isGeldig;
}
public function getMessages() {
return $this->errorMessages;
}
public function clean() {
foreach ($this->elements as $element) {
$element->clean();
}
}
public function getValues() {
foreach ($this->elements as $key => $element) {
$this->values[$key] = $element->getValue();
}
return $this->values;
}
}
?>
code class Element
<?php
abstract class Element implements IElement {
protected $filters;
protected $validators;
protected $options;
protected $value;
protected $name;
protected $label;
protected $attribs;
protected $isGeldig;
protected $errorMessages;
public function __construct(array $options = array())
{
$this->isGeldig = true;
$this->filters = array();
$this->validators = array();
$this->value = '';
$this->setOptions($options);
}
public function setOptions(array $options)
{
$this->name = isset($options['name']) ? $options['name'] : 'standaardnaam'; //eigenlijk moet de naam worden getest; niet alle namen zijn volgens de HTML-specs toegestaan!
$this->label = isset($options['label']) ? $options['label'] : 'label';
$this->value = isset($options['value']) ? $options['value'] : '';
$this->attribs = isset($options['attribs']) ? $options['attribs'] : '';
if (isset($options['validators']) && is_array($options['validators'])) {
foreach ($options['validators'] as $validator) {
$this->addValidator($validator);
}
}
if (isset($options['filters']) && is_array($options['filters'])) {
foreach ($options['filters'] as $filter) {
$this->addFilter($filter);
}
}
}
public function addValidator(Validator $validator)
{
$this->validators[] = $validator;
}
abstract public function render();
public function addFilter(Filter $filter)
{
$this->filters[] = $filter;
}
public function isValid()
{
foreach ($this->validators as $validator) {
if (!$validator->isValid($this->value)) {
$this->isGeldig = false;
$this->errorMessages[] = $validator->getMessages();
}
}
return $this->isGeldig;
}
public function clean()
{
$localValue = $this->value;
foreach ($this->filters as $filter) {
$localValue = $filter->clean($localValue);
}
$this->value = $localValue;
}
public function getValue()
{
return $this->value;
}
public function getMessages()
{
return $this->errorMessages;
}
public function getName()
{
return $this->name;
}
}
?>
Code Text element
<?php
/**
* User: GJ
* Name: TextElement.php
* Date: 14-8-13
* Time: 12:10
*/
class TextElement extends Element {
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type='text' name='{$this->name}' value='{$this->value}' $this->attribs>";
$html .= '</label>';
$html .= $this->getMessages();
return $html;
}
}
?>
Code RegistratieForm:
<?php
class RegistratieForm extends Form {
public function __construct($options) {
parent::__construct($options);
$initials = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$initials->setOptions(array(
'name' => 'voorletters',
'label' => 'Uw voorlettes',
'value' => isset($_GET['voorletters']) ? $_GET['voorletters'] : '',
'validators' => array(
new InitialValidator(array() /* no options necessary */),
),
)
);
$lastname = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$lastname->setOptions(array(
'name' => 'achternaam',
'label' => 'Uw achternaam',
'value' => isset($_GET['achternaam']) ? $_GET['achternaam'] : '',
'validators' => array(
new LastNameValidator(array() /* no options necessary */),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
$email = new TextElement();
// we kunnen een element aanmaken en pas daarna de opties zetten, zoals hier:
$email->setOptions(array(
'name' => 'email',
'label' => 'Uw e-mailadres',
'value' => isset($_GET['email']) ? $_GET['email'] : '',
'validators' => array(
new EmailValidator(array() /* no options necessary */),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
// of we maken een element en geven bij de constructie al de opties weer, zoals hier
$password = new PasswordElement(array(
'name' => 'password',
'label' => 'Uw wachtwoord',
'value' => isset($_GET['password']) ? $_GET['password'] : '',
'validators' => array(
new StringLengthValidator(array('min' => 3, 'minError' => 'Het wachtwoord is te kort', 'max' => 12, 'maxError' => 'Het wachtwoord is te lang'))
),
'filters' => array(
new FilterStripTags(),
new FilterTrim()
)
)
);
$submit = new SubmitElement(array(
'value' => 'verzenden',
'name' => 'verzenden',
)
);
//de gemaakte elementen toevoegen aan het formulier
$this->add($initials);
$this->add($lastname);
$this->add($email);
$this->add($password);
$this->add($submit);
}
}
?>
code formulier.php:
<?php
//autoloader
function __autoload($class) {
require_once $class . '.php';
}
//het formulier aanmaken
$form = new RegistratieForm(
array(
'id' => 'frmRegistratie',
'css' => 'userform',
'method' => 'get',
'action' => ''
)
);
//de elementen aanmaken:
if (isset($_GET['verzenden'])) {
$result = $form->isValid();
if ($result == TRUE) {
var_dump('correct', $form->getValues());
} else {
var_dump('', $form->getMessages());
}
die();
}
$html = $form->render();
echo $html;
?>
Hopelijk kan iemand mij helpen om de foutmeldingen in het formulier te krijgen op de plek waar de waarde niet valide is. (en de rest van het formulier ingevuld houden).
Alvast bedankt!
Gewijzigd op 20/08/2013 16:53:26 door Krist Ensing
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
{
private $errors;
function validate()
{
if($_POST['email'] == '')
$this->errors['email'] = 'Je hebt geen emailadres ingevuld.';
// en nog meer velden die je kunt valideren
if(count($this->errors))
return false;
return true;
}
function getError($id)
{
if(isset($this->errors[$id]))
return $this->errors[$id];
return '';
}
};
?>
class form
{
private $errors;
function validate()
{
if($_POST['email'] == '')
$this->errors['email'] = 'Je hebt geen emailadres ingevuld.';
// en nog meer velden die je kunt valideren
if(count($this->errors))
return false;
return true;
}
function getError($id)
{
if(isset($this->errors[$id]))
return $this->errors[$id];
return '';
}
};
?>
Gewijzigd op 20/08/2013 17:41:38 door Frank Nietbelangrijk
De rendercode va TextElement.php is deze:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class TextElement extends Element {
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type='text' name='{$this->name}' value='{$this->value}' $this->attribs>";
$html .= '</label>';
$html .= $this->getMessages();
return $html;
}
}
[code]
Hopelijk kun je me verder helpen!
class TextElement extends Element {
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type='text' name='{$this->name}' value='{$this->value}' $this->attribs>";
$html .= '</label>';
$html .= $this->getMessages();
return $html;
}
}
[code]
Hopelijk kun je me verder helpen!
Toevoeging op 20/08/2013 20:22:34:
een andere tip:
de $_GET en $_POST zijn gewoon arrays. je kunt gewoon $arr = $_GET doen om de hele array in één keer te kopiëren. gebruik dan in de rest van je code gewoon $arr zodat je makkelijker kan switchen van GET naar POST en eventueel SESSION.
Ik begrijp het als dat veel gevraagd is, maar hoop toch dat je het wilt doen, ik zou er enorm mee geholpen zijn.
Morgen wil ik (misschien) wel even voor je kijken. zou handig zijn om de volledige code te hebben
Gewijzigd op 20/08/2013 21:42:57 door Krist Ensing
geregeld