Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [slrypt] validator formularzy
Forum PHP.pl > Inne > Oceny
lukaskolista
Witam. Jest to moj pierwszy walidator, dlatego prosze o konstruktywne opinie i sugestie, co poprawic

  1. <?php
  2.  
  3. // Klasa z podstawowymi metodami walidacji
  4. class valid {
  5.  
  6. public function required($value) {
  7. return !empty($value);
  8. }
  9.  
  10. public function alpha($value) {
  11. return (bool) preg_match('/[a-zA-Z]/', $value);
  12. }
  13.  
  14. }
  15.  
  16. // Klasa do walidacji konkretnego formularza, w tym przypadku formularza logowania
  17. class user_valid extends valid {
  18.  
  19. public function username_valid($value) {
  20. return false;
  21. }
  22.  
  23. public function errors() {
  24. return array(
  25. 'username' => array(
  26. 'required' => 'Musisz podac nazwe uzytkownika',
  27. 'alpha' => 'Nazwa moze skladac sie jedynie ze znakow alfabetu',
  28. 'username_valid' => 'Test obiektow',
  29. ),
  30. 'password' => array(
  31. 'not_sended' => 'Nie otrzymano hasla',
  32. 'required' => 'Musisz podac haslo',
  33. ),
  34. );
  35. }
  36. }
  37.  
  38.  
  39. // Klasa validacji
  40. class validation {
  41.  
  42. private
  43. $fields = array(),
  44. $rules = array(),
  45. $errors = array(),
  46. $valid_object;
  47.  
  48. public function __construct($post, $object_name) {
  49. $this->fields = $post;
  50. $this->valid_object = new $object_name;
  51. }
  52.  
  53. public function add_rules($field_name, $rules) {
  54. if (isset($this->rules[$field_name])) {
  55. $this->rules[$field_name] = array_merge($this->rules[$field_name], $rules);
  56. } else {
  57. $this->rules[$field_name] = $rules;
  58. }
  59. }
  60.  
  61. public function add_error($field_name, $error_name) {
  62. if (isset($this->errors[$field_name])) {
  63. $this->errors[$field_name][] = $error_name;
  64. } else {
  65. $this->errors[$field_name] = array($error_name);
  66. }
  67. }
  68.  
  69. public function validate() {
  70. foreach ($this->rules as $field_name => $rules) {
  71. foreach ($rules as $method) {
  72. if (isset($this->fields[$field_name])) {
  73. if ($this->valid_object->$method($this->fields[$field_name]) === false) {
  74. $this->add_error($field_name, $method);
  75. }
  76. } else {
  77. $this->add_error($field_name, 'not_sended');
  78. }
  79. }
  80. }
  81. return empty($this->errors);
  82. }
  83.  
  84. public function errors() {
  85. $errors_array = $this->valid_object->errors();
  86. $output_errors = array();
  87. foreach ($this->errors as $field_name => $errors) {
  88. foreach ($errors as $error) {
  89. if (isset($errors_array[$field_name])) {
  90. $output_errors[$field_name][] = $errors_array[$field_name][$error];
  91. } else {
  92. $output_errors[$field_name] = array($errors_array[$field_name][$error]);
  93. }
  94. }
  95. }
  96.  
  97. return $output_errors;
  98. }
  99.  
  100. }
  101.  
  102.  
  103. // Obsluga
  104. $post = array(
  105. 'username' => '123',
  106.  
  107. );
  108.  
  109. $validation = new validation($post, 'user_valid');
  110. $validation->add_rules('username', array('required', 'alpha', 'username_valid'));
  111. $validation->add_rules('password', array('required'));
  112. if ($validation->validate()) {
  113. echo 'Poprawna nazwa';
  114. } else {
  115. echo 'Bledy:';
  116. echo '<ul>';
  117. foreach ($validation->errors() as $field_name => $errors) {
  118. foreach ($errors as $error) {
  119. echo '<li>'.$error.'</li>';
  120. }
  121. }
  122. echo '</ul>';
  123. }


Umiescilem wszystko w 1 pliku, aby bylo latwiej. Domyslnie klasy _valid beda w osobnym folderze
marcio
Widze ze nie masz na sztywno metod walidacji lecz mozesz tworzyc klasy dla danego forma wiec jest good
Ja bym wyrzucil tresci error'ow do osobnych plikow i do tego zadbal o mozliwosc wielojezykowosci smile.gif

Tak ogolnie calego kodu nie analizowalem ale polecam poczytac:
http://forum.php.pl/index.php?showtopic=14...t=0&start=0
Temat: klasaphp Validation
lukaskolista
klasa z bledami bedzie w osobnym pliku, tylko teraz jest w tym samym, co walidator
phpion
Albo mi się wydaje, albo zaczerpnąłeś "inspirację" z Kohany. Tak czy siak interesuje mnie czy da się (a chyba nie) napisać walidator matches, czyli sprawdzający czy podane pola mają taką samą wartość (najczęściej wykorzystywany do sprawdzania podanych haseł).
lukaskolista
z kohany zaczerpnalem jedynie nazwy. Nie da sie, to ma byc prosty walidator bez zbednych funkcji, ktore wykorzysta sie max 2 razy w calek aplikacji. Wystarczy zrobic $haslo1 === $haslo2 i juz jest matches
nospor
Mi się nie podoba metoda required()
Wstaw jako jej argument 0 a dowiesz się czemu smile.gif
lukaskolista
Nospor@

zamiast
  1. return !empty($value);

zrobilem
  1. return (strlen($value) > 0) ? true : false;
phpion
To jak już jesteśmy przy wytykaniu błędów, to mi nie podoba się metoda alpha(). Dlaczego? Podaj jako parametr np. abc123 - przejdzie walidację, a zapewne nie powinno. Musisz dodać ograniczniki ^ oraz $, czyli:
  1. public function alpha($value) {
  2. return (bool) preg_match('/^[a-zA-Z]$/', $value);
  3. }

smile.gif
sazian
phpion: skoro już wytykamy błędy to trzeba jeszcze dodać gwiazdkę ^[a-zA-Z]*$ winksmiley.jpg
phpion
@up:
Nie trzeba, ale można. Nie wiem czy nie lepiej byłoby dodać + zamiast *, no ale decyzja należy do autora. Wówczas dany element byłby równocześnie wymagany.
krzotr
Po co preg ? Jest ctype-alpha i zwraca bool.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.