Problem z klasą walidacji


(jacko1998) #1

Witam, mam problem z klasą walidacyjną. Mianowicie klasa wyłapuje pola po kolei. To znaczy, jeżli pierwsze pole zostanie zwalidowane i nie będzie błędów, to metoda dopiero przechodzi do następnego.

 

Tak ją wywołuje:

 

if(isset($_POST['submit'])) {

$validator = new Validator();

$validator->validate($_POST, array(
'username' => array(
'required' => true,
'min' => 2,
'max' => 15
),
'email' => array(
'required' => true,
'email' => true
),
'password' => array(
'required' => true,
'min' => 5,
'max' => 20
),
'repeat_password' => array(
'required' => true,
'matches' => 'password'
)
)
);

}

 

a tu metoda validate():

 

function validate($method, $rules = array()) {

foreach($rules as $field => $values) {
foreach ($values as $rule => $rule_value) {

$field = $field; // only name of an input
$field = $method[$field]; // $POST['username']

switch ($rule) {
case 'required':
if(empty($_field)) {
return $this->addError("Pole $field musi zostać wypełnione.");
}
break;
case 'min':
if(mb_strlen($field) < $rulevalue) {
return $this->addError("Pole $field musi zawierać co najmniej {$rule_value} znaków.");
}
break;
case 'max':
if(mb_strlen($field) > $rulevalue) {
return $this->addError("Pole $field może zawierać maksymalnie {$rule_value} znaków.");
}
break;
case 'matches':
if($field !== $method[$rulevalue]) {
return $this->addError("Pole $field musi być równe polu $rule_value");
}
break;
case 'email':
if(!filter_var($field, FILTERVALIDATE_EMAIL)) {
return $this->addError("Pole $_field musi zawierać poprawny adres email");
}
break;
}
}
}
}

 

Chciałbym np aby gdy ktoś wypełni tylko pole username, to wypisywało także błędy z innych pól formularza. Formularz dostępny tutaj --> http://goo.gl/7FxYHl


(kostek135) #2

Zamiast zwracać (return) z funkcji, musisz błędy dodawać do jakiejś listy i dopiero po przejściu całego for-each'a, zwrócić referencję do tej listy.


(jacko1998) #3

Dziękuję.