password vergelijken met confirm
Ik wil in een validator wachtwoord en wachtwoordbevestiging met elkaar vergelijken.
In eerte instantie zijn ze in de constructor geset:
(hieronder volgt code met daarin opmerkingen en vragen, omdat ik de eindtag van
\[code\] niet ken...
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
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
$password = new PasswordElement(array(
'name' => 'password',
'label' => '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())
));
$confirm = new PasswordElement(array(
'name' => 'confirm',
'label' => 'bevestigen wachtwoord: ',
'value' => isset($_GET['confirm']) ? $_GET['confirm'] : '',
'validators' => array(
new PasswordValidator(array()),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim())
De password validator ziet er als volgt uit:
class PasswordValidator extends AbstractValidator {
public function isValid($value) {
$confirm = $_GET['confirm'];
$password= $_GET['password'];
if ($confirm === $password) {
return true;
} else {
$this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
return false;
}
}
}
Dit heeft echter niet het gewenste effect.
Ook geeft de editor als comentaar: Multiple annotations here.
Wat gaat er fout?????
'name' => 'password',
'label' => '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())
));
$confirm = new PasswordElement(array(
'name' => 'confirm',
'label' => 'bevestigen wachtwoord: ',
'value' => isset($_GET['confirm']) ? $_GET['confirm'] : '',
'validators' => array(
new PasswordValidator(array()),
),
'filters' => array(
new FilterStripTags(),
new FilterTrim())
De password validator ziet er als volgt uit:
class PasswordValidator extends AbstractValidator {
public function isValid($value) {
$confirm = $_GET['confirm'];
$password= $_GET['password'];
if ($confirm === $password) {
return true;
} else {
$this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
return false;
}
}
}
Dit heeft echter niet het gewenste effect.
Ook geeft de editor als comentaar: Multiple annotations here.
Wat gaat er fout?????
Gewijzigd op 21/08/2013 19:39:32 door Krist Ensing
't Is net HTML ;)
Ik zie dat je het wachtwoord via $_GET verstuurd. Dat is niet echt handig. Doe dat liever via $_POST.
Je vergelijking is wel goed.
Maar als ik de form method ook op get hebt staan zou de vergelijking het toch moeten doen?
Code (php)
Zijn beide niet ingesteld, dan wordt dit vervolgens toch true.
Hoe zou ik wel de waardes van confirm en password kunnen vergelijken. De code bovenaan is de constructor en in onderstaande codede heb de html code gerenderd:
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
class PasswordElement extends Element {
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type=\"password\" value='$this->value' name='$this->name' $this->attribs>";
$html .= "</label>";
return $html;
}
}
?>
public function render()
{
$html = '';
$html .= '<label>' . $this->label;
$html .= "<input type=\"password\" value='$this->value' name='$this->name' $this->attribs>";
$html .= "</label>";
return $html;
}
}
?>
Hopelijk kun je me helpen, want ik heb al op een aantal manieren getracht de waarden op te vragen en te vergelijken.
Gewijzigd op 22/08/2013 09:11:57 door Krist Ensing
Je hebt een class PasswordValidator extends AbstractValidator voor validaties. Dan is het, denk ik, zinvol om een isset() in te bouwen in de hoofdklasse AbstractValidator: wat er niet is, kun je immers niet valideren. En dat geldt voor alle afgeleide klassen.
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
abstract class AbstractValidator implements Validator {
protected $_options;
protected $_messages;
public function __construct(array $options)
{
$this->_messages = array();
$this->_options = $options;
}
public function getMessages()
{
return $this->_messages;
}
}
protected $_options;
protected $_messages;
public function __construct(array $options)
{
$this->_messages = array();
$this->_options = $options;
}
public function getMessages()
{
return $this->_messages;
}
}
moet er dan komen isset($this->options); in de functie __construct?
Je geeft hier een $value door, maar gebruikt die helemaal niet:
Code (php)
In de ouderklasse kun je een public function isValid($value) toevoegen die elke validatie eindigt met false zodra $value ontbreekt of leeg is. Afgeleide klassen kunnen daaraan vervolgens specifieke validaties toevoegen.
Voor de wachtwoorden borduur je daarop voort met een uitzondering: je wilt niet alleen beide waarden apart valideren, maar ook of ze aan elkaar gelijk zijn.
Met andere woorden, zoiets als isset() geldt voor alle validaties en plaats je in een hoge klasse. In de afgeleide klasse voor wachtwoorden voeg je daaraan validaties toe die exclusief voor wachtwoorden gelden. Denk bijvoorbeeld ook aan regels uit je wachtwoordbeleid, zoals de minimumlengte van wachtwoorden.
Wat wil je met de array $options gaan doen? Wat zit er in die array?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
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);
}
}
{
$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);
}
}
De classe element wordt vervolgens weer aangerepen om html te renderen, bijvoorbeeld in password:
Voor de validatie van input heb je geen compleet HTML-element nodig. Bovendien zitten de ingevoerde wachtwoorden helemaal niet in het HTML-element. Je kunt input en output beter strikt scheiden.
Kun je me misschien helpen met wat code, waar ik iets aan heb?
Code (php)
1
2
3
4
5
2
3
4
5
<?php
// Array GET doorgeven voor $_GET['password'] en $_GET['confirm']
$obj = new PasswordValidator();
$pass = $obj->isValid($_GET);
?>
// Array GET doorgeven voor $_GET['password'] en $_GET['confirm']
$obj = new PasswordValidator();
$pass = $obj->isValid($_GET);
?>
Dan wordt $value in de algemene functie isValid($value) een array en krijg je zoiets:
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
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
<?php
class PasswordValidator extends AbstractValidator
{
public function isValid($value)
{
if (!is_array($value)) {
$this->_messages[] = 'Deze methode vereist een array';
return false;
}
if (!isset($value['password']) || !isset($value['confirm'])) {
$this->_messages[] = 'Een van beide wachtwoorden ontbreekt';
return false;
}
$value['password'] = trim($value['password']);
$value['confirm'] = trim($value['confirm']);
if (empty($value['password']) || empty($value['confirm'])) {
$this->_messages[] = 'Een van beide wachtwoorden is leeg';
return false;
}
if ($value['password'] === $value['confirm']) {
return true;
} else {
$this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
return false;
}
}
}
?>
class PasswordValidator extends AbstractValidator
{
public function isValid($value)
{
if (!is_array($value)) {
$this->_messages[] = 'Deze methode vereist een array';
return false;
}
if (!isset($value['password']) || !isset($value['confirm'])) {
$this->_messages[] = 'Een van beide wachtwoorden ontbreekt';
return false;
}
$value['password'] = trim($value['password']);
$value['confirm'] = trim($value['confirm']);
if (empty($value['password']) || empty($value['confirm'])) {
$this->_messages[] = 'Een van beide wachtwoorden is leeg';
return false;
}
if ($value['password'] === $value['confirm']) {
return true;
} else {
$this->_messages[] = 'De wachtwoorden zijn niet gelijk aan elkaar';
return false;
}
}
}
?>
Er schort nog een en ander aan, maar maak je objectmodel niet te complex.
Gewijzigd op 22/08/2013 10:41:21 door Ward van der Put
Gewoon in de het regstratieformulier onder de constructor van password en confirm zetten?
Ik ben absoluut niet de referentie wat OOP betreft; dus neem het voor wat het waard is ...
Ik hoor anderen dan mezelf dit weinig zeggen; maar als je met OOP bezig bent, begin dan niet met je class te schrijven. Begin buiten de claas.
Begin ze te gebruiken alsof alles werkte.
Alles wat je nodig hebt buiten de class, wordt binnen de class op public gezet; al de rest op private (of protected...).
Dus, wil je even tonen wat je dot buiten de class?
Wat doe je met $password en $confirm?
( $password = new PasswordElement ... )
Gewijzigd op 22/08/2013 10:54:02 door Kris Peeters
Wel schort er nog wat aan het objectmodel. PasswordValidator() is nu (extern) afhankelijk van het bestaan van de keys 'password' en een 'confirm' in een array. Dat kun je netter formaliseren door door te geven welke keys de validatie kan verwachten.
Verder moet er nog een wachtwoordbeleid in en eventueel een databasecontrole: bijvoorbeeld 1 == 1 is nu namelijk ook geldig.
Ward van der Put op 22/08/2013 10:54:58:
... PasswordValidator() is nu (extern) afhankelijk van het bestaan van de keys 'password' en een 'confirm' in een array. ...
Ja, vind ik ook.
Dit zou beter zijn
Code (php)
1
2
3
4
2
3
4
<?php
$obj = new PasswordValidator();
$passwordIsValid = $obj->isValid($_GET, array('password', 'confirm'));
?>
$obj = new PasswordValidator();
$passwordIsValid = $obj->isValid($_GET, array('password', 'confirm'));
?>
Maar moet ik deze code (het stukje hierboven) overnemen in de constructor van password of confirm of ergens anders?