Klasa walidująca formularz

2011-07-10 11:26:32 Post #1 user76

 
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
define('CONTENTS_LENGTH'5);
define('SUBJECT_LENGTH'5);

class 
Validate {

public 
$dataPost = array();
var 
$errors = array();

public function 
__construct(){
$this->dataPost = ($_POST);
print 
$this->dataPost['subject'];
}    

public function 
AddValidator($type,$data){

switch (
$type)
{
case 
'subject': {
if(empty(
$data) || strlen($data) < SUBJECT_LENGTH){
$this->errors[] = "Temat nie może być krótszy, niż "SUBJECT_LENGTH " znaków<br />"
}
}
break;

case 
'contents': {
if(empty(
$data) || strlen($data) < CONTENTS_LENGTH){
$this->errors[] = "Opis musi mieć więcej znaków<br />"
}
}
break;

case 
'email': {
if (empty(
$data) || !preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$/i'$data)) { 
$this->errors[] = "Niepoprawny e-mail<br />"

}
break;

case 
'numeric': {
if (!
is_numeric($data)) { 
$this->errors[] = "Pole musi zawierać cyfry<br />"

}
break;

}
}
 
public function 
Errors(){
print 
"<br />";
if (
count($this->errors) > 0) {
foreach(
$this->errors as $value){
print 
$value;
}
}
}
 
};

$validate = new Validate;
$validate->AddValidator('subject',$validate->dataPost['subject']);
$validate->AddValidator('contents',$validate->dataPost['contents']);
$validate->AddValidator('email',$validate->dataPost['email']);
$validate->AddValidator('numeric',$validate->dataPoste['phone']);
$validate->Errors();


2011-07-11 10:35:06 Post #2 nospor

 
Ta klasa nie nadaje się do ogólnego użytku. Zgóry zdefiniowane typy jak SUBJECT czy CONTENTS, które sprawdzają długość pola. Nie każdy ma takie typy. Powinien być typ: MAXLENGTH i on by załatwił wszystko.
Zamiast tekstowych komunikatów powinny być kody błędów.
Niby używasz php5 a stosujesz archaizmy jak VAR.

2011-07-12 20:44:31 Post #3 user76

 
czyli
1
2
3
4
5
public function addValidator($data,$case){
//...
}

$validate->addValidator('title','notEmpty'); 


Rozumiem, że zamiast contents, emaIl numeric powinny być sposoby na sprawdzenie?

Jak powinno wyglądać przeprowadzenie walidacji po dodaniu walidatora ?
mam tylko to
1
$validate->doValidate(...)


Na co zamienić var?

Czy formularz i walidacji mogą być interfejsem ?

Co do kodów znalazłem tylko na przesyłanie pliku. Stworzyć własne ?
W zendzie to wygląda tak:
'kluczBłędu' => 'Wiadomosć błędu'

2011-07-13 10:33:35 Post #4 nospor

 
Tak na dobrą sprawę to walidatory powinieneś przypisywać do pól. No ale ty nie masz tu klasy formularza tylko klasę walidator.
Walidator length:
1
2
3
<?php
$validate
->AddValidator('length',$validate->dataPost['subject'],array('min'=>3'max'=>8));
?>

Trzeci parametr to tablica opcji. W przypadku walidatora length jest to opcja min i max. W ten sposób masz uniwersalny walidator na długość.

addValidator powinno dodawać walidator a nie od razu walidować. Walidować powinno się dopiero po wykonaniu metody np. doValidate();

Kody możesz zwracać jak napisałeś.

na co var? No to doczytaj o podstawach obiektówki...
public, private, protected - do wybory do koloru.

2011-08-07 00:33:00 Post #5 user76

 
Jak przypisać moją walidację do pól w formularzu, jeżeli wywołuje pola:

1
2
3
4
5
6
print $form->formularz_start('index.php','post','');
print 
$form->dodaj_element('text','Time','Time to kill (Hour:minute GST!!) : ','','','','','','','',''); 
print 
$form->dodaj_element('hidden','sessionId','',$calculator->genId(),'','','','','','',''); 
print 
$form->dodaj_element('submit','send','Save','','','','','','','',''); 
print 
$form->formularz_koniec();

2011-08-08 07:56:11 Post #6 nospor

 
np. do metody dodaj_element, dodać koleny parametr, który będzie walidatorem

2011-08-29 19:01:56 Post #7 Michał

 
Idea fajna, z wykonaniem gorzej ale na +, ze sam piszesz takie rzeczy.

U siebie zaimplementowałem możliwość dodania callbacka jako walidatora i zwraca on true/false.
W sferze funkcji anonimowych - bajka

2011-08-30 00:34:21 Post #8 user76

 
Pisze właśnie framework i jestem przy użytkownikach, jeszcze naprawię szablony php i mogę budować strukturę.

W ACL wykorzystałem bazę z 3 tabelami do kontroli uprawnień użytkowników na poziomie różnych modułów.

2011-09-01 14:22:26 Post #9 user76

 
jak wyglądała ta klasa ?

2011-09-04 12:55:27 Post #10 nospor

 
Kurcze, skasowałeś linka i już za bardzo nie pamiętam
Ale z tego co pamiętam, to znowu zdefiniowałeś na stałe walidatory i nie można było dodać nic własnego?

2011-09-04 15:04:42 Post #11 user76

 
Można dodać własne walidatory, wystarczy wytypować w klasie konfiguracji:

1
2
3
4
5

$ob 
= new FormCfg;
$ob->getFormVal('contact');



Tam jest na sztywno ustawione tablice walidatorów dla różnych modułów, chyba to lepsze rozwiązanie. Jeśli chcę zmienić walidatory, wczytuję inną konfigurację.

Może w kodzie na sztywno, ale dla mnie nie jest to nieporęczne. Jeśli chcę zmienić ze string na numeric po prostu zmieniam to w kodzie w konfiguracji. Nie potrzebuję inaczej.

Odpowiedz