Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt] Validator
SHiP
post
Post #1





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Tak piszę sobie powoli mój framework i ostatnio zobaczyłem w Zendzie fajne rozwiązanie validatora (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . Trochę składnia zenda do mnie nie przemawia wiec napisałem coś swojego.

Dla nieobczajonych. Klasa sprawdza poprawność elementów w tablicy na podstawie określonych wymogów.

Przyklad uzycia

  1. <?php
  2. include 'validator.php';
  3.  
  4. $validators = Array(
  5. '*' => Array(
  6. 'required' => true
  7. ),
  8. 'title' => Array(
  9. 'minlength' => 5,
  10. 'maxlength' => 80,
  11. ),
  12. 'subtitle' => Array(
  13. 'minlength' => 5,
  14. 'required' => false,
  15. )
  16. );
  17.  
  18. $dane = Array('title' => 'jakis tytul');
  19.  
  20. $input = new MoheboInput($dane);
  21. $input -> setValidators($validators);
  22. echo 'title => '.(integer) $input -> isValid('title').'<br/>';
  23. echo 'subtitle => '.(integer) $input -> isValid('subtitle').'<br/>';
  24. ?>


* odnosi się do wszystkich zmiennych przy czym wlaściwości elementu sa zawsze nadrzędne(tj. gwiazdka ma zawsze mniejszy priorytet, nawet jesli podamy ją jako ostatni element tablicy).

Dostępne wymagania
minlength - minimalna długość
maxlength - maksymalna dlugosc
required - czy element nie moze byc pusty(czy jest wymagany)
between - wartosc musi sie miescic w podanym zakresie
in - wartosc musi byc identyczna z jedna sposrod podanych
type - typ zmiennej (tj. string, boolean, double, integer) lub obiekt klasy własnej.

Jeśli deklarujemy wlasny typ to jako type przekazujemy obiekt naszej klasy pamietajac ze musi ona zawietac metodę isValid(), oraz zmienna $errors oraz zmienna $value

Wiecej w przykladzie dostepnm w paczce.

Pobierz

Czekam na komentarze oraz pomysły na rozwinięcie listy wymagań oraz ogólnie opcji validatora.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ja u siebie trochę inaczej to rozwiązałem, ale:
1) Pliki są w kodowaniu UTF-8, dlatego też zamiast np. strlen" title="Zobacz w manualu PHP" target="_manual używaj mb_strlen" title="Zobacz w manualu PHP" target="_manual
  1. <?
  2. $str = 'Witaj świecie';
  3.  
  4. echo strlen($str); //14
  5. echo mb_strlen($str); //13 - bo tyle jest znaków
  6. ?>
(pozwole sobie przyspamować http://blog.crozin.com/2008/08/11/operacje...odowanie-utf-8/ (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )
2) Sprzydałoby się trochę więcej danych w przypadku błędu, dla przykładu:
  1. <?
  2. //pseudo-kod
  3. $v->maxLength('ala ma kota', 8);
  4. ?>
Zdanie ala ma kota ma więcej niż te 8 znaków, ale samo Too long może być czasem trochę niewygodne (np. gdy chcemy zautomatyzować wyświetlanie błędów użytkownikowi). Tutaj mógłbyś zwrocić: False (czyli, że błąd) + Spodziewaną długość (8) + Długość jaką miał ciąg (13) + ew. sam ciąg - aby wygodnie wyświetlić szczegółowy komunikat
Cytat
Jakieś tam pole może mieć maksymalnie 8 znaków - podano 13.

3) Apropo sposobu zgłaszania błedów - sprzydała by się możliwość ustawiania "indywidualnych" błedów - posłużę się tutaj moim przykładem :
  1. <?php
  2.  
  3. $_POST = array(
  4. 'rules' => '0',
  5. 'username'  => 'Crozin',
  6. 'password'  => 'myPassword',
  7. 'repeatPassword' => 'myPasssword',
  8. 'email' => 'sb@sth.com',
  9. 'repeatEmail' => 'sb@sth.com'
  10. );
  11.  
  12. $this->validate->customMessages(array(
  13. 'rules' => array(Kernel_Validate_Equal::NOT_EQUAL => 'Musisz zaakceptować regulamin, aby się zarejestrować')
  14. ));
  15. $validate = $this->validate->chain($_POST, array(
  16. 'login' => 'length[4,30]|word', 
  17. 'password'  => 'length[6,255]',
  18. 'repeatPassword' => 'sameAs[password]',
  19. 'email' => 'email',
  20. 'repeatEmail' => 'sameAs[email]',
  21. 'rules' => 'equal[1]'
  22. ), array(...));
  23.  
  24. ?>
I kilka słów wyjaśnienia.
Kernel_Validate::customMessage() (btw: właśnie się zooriętowałem, że mam customMassages w orginalnym kodzie (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ) jako pierwszy i jedyny argument przyjmuje tablice, w której każdy klucz odpowiada zmiennej z $_POST (w tym przypadku) a wartość danego klucza to kolejna tablica, w której jako klucz podawane są stałe, np: Kernel_Validate_Equal::NOT_EQUAL - co oznacza, że jeżeli walidator Equal wyrzuci bład NOT_EQUAL to zamiast domyślnej wiadomości Pole [nazwaPola] musi mieć wartość [wartość]. zostanie zwrócone Musisz zaakceptować regulamin, aby się zarejestrować.

Sam walidator działa w miarę podobnie do Twojego, z tym, że reguły walidacji możemy podać jako tablice (jak u Ciebie), albo jako string z "pseudo-kodem", a same walidatory (Equal, sameAs, Email itp.) to klasy implementujące interfejs i dziedziczące po abstrakcyjnej klasie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


PS. Nie wiem dlaczego, ale Twój sposób formatowania kodu jest dla mnie strasznie nieczytelny (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 29.09.2025 - 02:48