Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [skrypt] Validator
SHiP
post 29.07.2008, 15:20:44
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 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.


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Moli
post 31.07.2008, 14:41:47
Post #2





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Bardzo fajne narzędzie, jak wiesz sam coś takiego piszę więc wiem smile.gif Ogólnie napiszę co wydaje mi się że mógł byś dodać smile.gif

1) Porządek w kodzie biggrin.gif
2) W typie mogły by być wartości standardowe typu telefon, www, e-mail czy nawet ten pesel smile.gif
3) Jeśli sprawdzę wszystkie pola, a później której osobno to sprawdza od nowa. Mógłbyś gdzieś zapisywać czy pole jest poprawnie wypełnione czy nie aby nie sprawdzać po 2 razy.
4) Komunikaty błędów mogłeś zrobić nie jako wiadomości a jako identyfikatory danego błędu. Można później łatwiej na nich operować smile.gif

To takie drobne uwagi spowodowane tym że sam pisze teraz taką bibliotekę, więc napisałem to co u siebie zrobiłem w inny sposób smile.gif Ale ogólnie klasa spoko i taki sposób walidacji naprawdę ułatwia smile.gif

ps. Twoja klasa ma równo 100 linii mniej smile.gif Ale ja u siebie każdą opcje dawałem jako osobną metodę, więc to dla tego smile.gif
Go to the top of the page
+Quote Post
SHiP
post 4.08.2008, 14:57:00
Post #3





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

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


@Moli: dzięki za komentarz. Co do opcji

1. Porzadek zrobiony, kod odchudziłem o okolo 40 linijek winksmiley.jpg i jeszcze widzę możliwość optymalizacji(ale to w wolnym czasie)
2. Dodałem obsługę pola e-mail. Pesel jest typowo polskim wymysłem a z numerem telefonu jest tak, że nikt się nie trzyma standardowego zapisu +48.numer,
3. Cachowanie winików dodane
4. Tak jest mi wygodniej winksmiley.jpg. Może zastosuje system stałych i komunikatów deklarowanych w jeden z zmiennych klasowych w postaci tablicy. Jeszcze nad tym pomyślę.

Dodatkowo dodalem parametr regexp umożliwiający określenie wyrażenia regularnego(w example.php jest pokazane użycie)

Nowa paczka: Pobierz
Licencja : AGPL3

Pozdrawiam


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Crozin
post 11.08.2008, 17:46:17
Post #4





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/ 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 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 winksmiley.jpg


PS. Nie wiem dlaczego, ale Twój sposób formatowania kodu jest dla mnie strasznie nieczytelny tongue.gif
Go to the top of the page
+Quote Post
SHiP
post 11.08.2008, 21:53:21
Post #5





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

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


1) dzięki wielkie za link, przyda się biggrin.gif. Widziałem kiedyś w manualu funkcje mb_ ale jakoś nigdy nie wnikałem co czego one służą smile.gif

2,3) Ostatnio zauwazyłem identyczny rodzaj określania komunikatów błędów w Zendzie i przyznam, że rozwiązanie jest dosyć ciekawe i bardzo prawdopodobne, że wprowadzę je u siebie(jednak muszę to zintegrować z moja klasę do obsługi języków stąd te pseudokomunikaty typu "Too long")

Dzięki za pomysł z sameAs i equal winksmiley.jpg. Pomyślę jak to fajnie złożyć. Pseudojęzyków nie będę wprowadzał. Imho zbędny bajer.

PS: nieczytelność kodu to rzecz względna winksmiley.jpg. Widzę u Ciebie np. tabulacje przed "=>" w deklaracjach tablic i lekko inny system wcięć. Dodatkowo nie stosujesz spacji między " -> " itd itd.

Pozdrawiam


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Crozin
post 11.08.2008, 22:21:59
Post #6





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

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


Cytat
jednak muszę to zintegrować z moja klasę do obsługi języków stąd te pseudokomunikaty typu "Too long"
Nic prostszego (pisząc pierwszego posta sam zamieniałem "zmienne językowe" na zwykły tekst)

Tutaj właśnie ważne jest to, aby w przypadku wystąpienia błędu nie zwracać tylko False winksmiley.jpg
Stała Kernel_Validate_Equal::NOT_EQUAL to string notEqual i w przypadku błeu zwracana jest tablica
Kod
Array(
    [rules] => Array(
        [0] => 'notEqual',
        [1] => '0',
        [2] => Array(
            [0] => '1'
        )
    ),
    [login] => Array(
        [0] => 'notAlnum',
        [1] => 'XSS <>"'&',
        [2] => Array()
    )
)
I klucz tablic to nazwa pola, zero - nazwa walidatora, jeden - wartość zmiennej, dwa - argumenty przekazane walidatorowi (np.: że ma być równe (equal) 1)

Mając te dane wystarczy:
  1. <?
  2.  
  3. $lang = array(
  4. 'errors' => array(
  5. 'notEqual' => 'Pole "%s" musi mieć wartość %s.',
  6. 'notAlnum' => 'Pole "%s" może składać się tylko ze znaków alfanumerycznych.'
  7. )
  8. );
  9.  
  10. $validate = array(...); //pow. tablica - a jesli walidacja jest pomyślna to zwraca true
  11. $errors = array();
  12.  
  13.  
  14. if(is_array($validate)){
  15. foreach($errros as $f => $e){
  16. $errors[] = sprintf($lang['errors'][$e[0]], $f);
  17. }
  18. }
  19.  
  20. print_r($errors);
  21.  
  22. ?>
To już pisane z palca, ale chyba powinno być dobrze tongue.gif (musisz sobie oczywiście to nieco mocniej rozbudować)
Go to the top of the page
+Quote Post
SHiP
post 12.08.2008, 07:49:38
Post #7





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

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


Dokładnie tak to u mnie działa winksmiley.jpg. Tylko mam zewnętrzną klasę do tego. Ale ogólnie robi to samo. Ważne tylko żebym gotowych komunikatów nie wyciagał a właśnie tablice z komunikatami i odpowiednimi parametrami wtedy mi to się ładnie potłumaczy na inne języki.

Pozdrawiam.


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 12:35