Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa] Walidacja pola select w PHP
wlodziu
post 17.02.2013, 09:53:11
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 4.07.2011

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


Witam, chciałbym przedstawić moją klasę na walidacje pola select.

Chodzi o to, by w naszym polu select nie została wpisana wartość, której nie chcemy, oczywiście możecie to sprawdzić za pomocą kilki warunków (czym dłuższy select tym dłuższy warunek)
Na potrzeby swojego skryptu napisałem klasę, która waliduje nasz select.

Jak z niej korzystać?
Dołączamy plik selectvalidate.class.php
  1. require_once('selectvalidate.class.php');

Następnie tworzymy obiekt z nazwą selecta, ja nazwałem wojewodztwo:
  1. $pole = new Select('wojewodztwo');

Dodajemy do niego optiony metodą:
  1. $pole->AddOption('mazowieckie', 'maz'); // dodajemy optiony: nazwa | wartosc
  2. $pole->AddOption('lodzkie', 'lodz'); // jw
  3. $pole->AddOption('slaskie', 'sl'); // jw
  4. $pole->AddOption('pomorskie', 'pom'); // jw


Następnie wyświetlamy nasz select w formularzu:
  1. $pole->showSelect()


Jeśli chcemy go sprawdzić, na poczatku pobieramy wartośc z tego selecta o nazwie wojewodztwo:
  1. $select = $_POST['wojewodztwo'];


I sprawdzamy, czy wartośc jest poprawna:
  1. if ($pole->validateSelect($select)) { // sprawdzamy nasz select
  2. echo 'wykonujemy dalsza czesc skryptu.';
  3. } else {
  4. echo 'Ojj, mamy blad, ktos probuje wpisac inna wartosc';
  5. }


selectvalidate.class.php:
  1. <?php
  2. /*
  3. Author: wlodziu
  4. Date: 17/02/2013
  5. Contact: wlodziuss@wp.pl
  6. */
  7. class Select {
  8. public function __construct ($name) {
  9. $this->name = $name;
  10. }
  11. public function AddOption ($text, $value) {
  12. $this->option[] = $text;
  13. $this->value[] = $value;
  14. }
  15. public function showSelect () {
  16. $count = count($this->option);
  17. $string = '<select name="'.$this->name.'">';
  18. for ($i = 0; $i <= $count - 1; $i++) {
  19. $string .= '<option value="'.$this->value[$i].'">'.$this->option[$i].'</option>';
  20. }
  21. $string .= '</select>';
  22. return $string;
  23. }
  24. public function validateSelect ($val) {
  25. $count = count($this->option);
  26. $x = false;
  27. for ($i = 0; $i <= $count - 1; $i++) {
  28. if ($this->value[$i] == $val) {
  29. $x = true;
  30. }
  31. }
  32. return $x;
  33. }
  34. }
  35. ?>


Przykład zastosowania:
  1. <?php
  2. require_once('selectvalidate.class.php'); // dolaczamy plik z klasą
  3. $pole = new Select('wojewodztwo'); // tworzymy obiekt, z parametrem nazwy selecta
  4. $pole->AddOption('mazowieckie', 'maz'); // dodajemy optiony: nazwa | wartosc
  5. $pole->AddOption('lodzkie', 'lodz'); // jw
  6. $pole->AddOption('slaskie', 'sl'); // jw
  7. $pole->AddOption('pomorskie', 'pom'); // jw
  8. if ($_POST['submit']) {
  9. $select = $_POST['wojewodztwo'];
  10. if ($pole->validateSelect($select)) { // sprawdzamy nasz select
  11. echo 'wykonujemy dalsza czesc skryptu.';
  12. } else {
  13. echo 'Ojj, mamy blad, ktos probuje wpisac inna wartosc';
  14. }
  15. } else {
  16. // wyswietlamy nasz utworzony select: $pole->showSelect()
  17. echo '
  18. <form method="post" action="">
  19. '.$pole->showSelect().'
  20. <input type="submit" name="submit" value="OK">
  21. </form>
  22. ';
  23. }
  24.  
  25. ?>


Jest to moja pierwsza zabawka w php obiektowym, prosiłbym o oceny smile.gif

Ten post edytował wlodziu 17.02.2013, 09:54:59
Go to the top of the page
+Quote Post
CuteOne
post 17.02.2013, 18:37:52
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1.  
  2. $array = array(
  3. 'maz' => 'mazowieckie',
  4. 'pom' => 'pomorskie',
  5. 'war' => 'warmińsko-mazurskie'
  6. );
  7.  
  8. echo '<select name="select">';
  9. foreach($array as $key => $value) echo '<option value="'.$key.'">'.$value.'</option>';
  10. echo '</select>';
  11.  
  12. if(!empty($_POST)) {
  13.  
  14. if(!array_key_exists($_POST['select'], $array)) {
  15.  
  16. echo 'błąd';
  17. }
  18. }


Ta klasa to żadna walidacja.
- brak obsługi grup
- brak obsługi multiple
- brak ustawienia domyślnego "selected"
- jak już sam wspomniałeś im więcej wartości tym więcej problemów. Wytłumacz mi w jaki sposób mam dodać 50, 150 lub 300 opcji za pomocą tego:
  1. $pole->AddOption('mazowieckie', 'maz'); // dodajemy optiony: nazwa | wartosc
  2. $pole->AddOption('lodzkie', 'lodz'); // jw
  3. $pole->AddOption('slaskie', 'sl'); // jw
  4. $pole->AddOption('pomorskie', 'pom'); // jw

?
- sama walidacja to nieporozumienie
Go to the top of the page
+Quote Post
wlodziu
post 17.02.2013, 21:57:29
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 4.07.2011

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


A jak dodasz w swoim kodzie 50 wpisów? Tak samo jak w moim? Czy użyjesz magii?

Cytat
- brak ustawienia domyślnego "selected"

zobacz swój kod.

Nie chodzi mi tutaj o dodawanie wpisów w inny sposób niż z palca, a do tego przeczytaj końcówkę mojego posta.
Go to the top of the page
+Quote Post
phpion
post 18.02.2013, 10:30:15
Post #4





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




Generalnie zgadzam się z CuteOne, ale skoro koniecznie chcesz opinii to:

1. Wszystkie składowe są publiczne. Nie deklarujesz ich jako protected/private więc domyślnie są publiczne.
2. Po co Ci 2 składowe option i value? Możesz to przecież zrobić na 1 tablicy.
3. Masz metodę dodawania opcji, a gdzie metoda usuwania?
4. Metoda showSelect nie pozwala na wstawienie atrybutów HTML select'a. Nie można nadać mu np. klasy albo id.
5. $i <= $count - 1 jest w sumie bez sensu. To samo osiągniesz poprzez $i < $count.
6. W validateSelect robisz zbędne iteracje pętli. Jeśli dany element istnieje to od razu zwróć TRUE, a nie przeszukuj kolejnych elementów.
7. W validateSelect wystarczyłoby skorzystać z in_array(). Jeśli option i value przerobiłbyś na 1 tablicę to wystarczyłoby isset / array_key_exists.
Go to the top of the page
+Quote Post
CuteOne
post 18.02.2013, 12:27:05
Post #5





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Cytat
A jak dodasz w swoim kodzie 50 wpisów? Tak samo jak w moim? Czy użyjesz magii?

  1. public function __construct ($name, $options=array()) {
  2. $this->name = $name;
  3.  
  4. if(!empty($options)) {
  5.  
  6. $this->setOptions($options);
  7. }
  8. }
  9.  
  10. protected function setOptions($options) {
  11.  
  12. if(!empty($options['multioptions'])) {
  13.  
  14. $this->addOptions($options['multioptions']);
  15. }
  16.  
  17. if(!empty($options['default_value'])) {
  18.  
  19. $this->setDefaultValue($options['default_value']);
  20. }
  21. }
  22.  
  23. public function addOptions($options) {
  24.  
  25. if(!is_array($options)) throw new MyException('Not array blablabla'); // jak nie array to won
  26.  
  27. if(!empty($options)) {
  28.  
  29. foreach($options as $k => $v) {
  30.  
  31. if($this->hasValue($k) && $this->allowOverwrite() === false) { // zabezpieczenia przeciw nadpisywaniu danych
  32. throw new MyException('Not array blablabla');
  33. }
  34.  
  35. $this->addOption($k, $v); // tu twoja funkcja
  36. }
  37. }
  38.  
  39. return $this;
  40. }
  41.  
  42.  
  43. $options = array(
  44. 'multioptions' => array(
  45. 'maz' => 'mazowieckie',
  46. 'pom' => 'pomorskie',
  47. 'war' => 'warmińsko-mazurskie'
  48. ),
  49. 'default_value' => 'pom'
  50. );
  51.  
  52.  
  53. $select = new Select('moj_select', $options);
  54.  
  55. //lub
  56.  
  57. $select -> addOptions($options['multioptions']);
Go to the top of the page
+Quote Post
wlodziu
post 19.02.2013, 09:14:33
Post #6





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 4.07.2011

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


I tak czy siak mussiz przypisać je do tablicy, więc możesz także powielać mój kod i wpisywać, sytuacja moze się zmienić, jeśli chcesz to użyć jeszcze dalej, ale to mozna dopisać odpowiednią metodę i nie będzie problemu
Go to the top of the page
+Quote Post
CuteOne
post 19.02.2013, 09:29:43
Post #7





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1. $result = $pdo -> fetchAll();
  2.  
  3. $select = new Select('select', array('multioptions'=>$result));


ps. zobacz sobie do Zenda 1.xx jak tam rozwiązano walidację elementów formularzy i bierz z nich przykład (chociażby po to aby poszerzyć swoją wiedzę)
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: 20.04.2024 - 05:14