Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [slrypt] validator formularzy
lukaskolista
post
Post #1





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
lukaskolista
post
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


klasa z bledami bedzie w osobnym pliku, tylko teraz jest w tym samym, co walidator
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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ł).
Go to the top of the page
+Quote Post
lukaskolista
post
Post #5





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Mi się nie podoba metoda required()
Wstaw jako jej argument 0 a dowiesz się czemu smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
lukaskolista
post
Post #7





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Nospor@

zamiast
  1. return !empty($value);

zrobilem
  1. return (strlen($value) > 0) ? true : false;
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
sazian
post
Post #9





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


phpion: skoro już wytykamy błędy to trzeba jeszcze dodać gwiazdkę ^[a-zA-Z]*$ winksmiley.jpg
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@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.
Go to the top of the page
+Quote Post
-krzotr-
post
Post #11





Goście







Po co preg ? Jest ctype-alpha i zwraca bool.
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 Aktualny czas: 20.08.2025 - 23:44