Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obsluga formularza
Forum PHP.pl > Forum > PHP > Object-oriented programming
skowron-line
  1. <?php
  2.  
  3. class obsluga_formularza {
  4.  
  5. public $nazwa;
  6. public $adres;
  7. private $wzorzec = '/^[a-zA-Z0-9.-_]+@[a-zA-Z0-9-.]+.[a-zA-Z]{2,4}$/';
  8.  
  9.  
  10. function __construct($nazwa, $adres) {
  11.  
  12. $this -> nazwa = $nazwa;
  13. $this -> adres = $adres;
  14.  
  15. }
  16.  
  17. function policz_znaki() {
  18.  
  19. $ile_znakow = strlen($this -> nazwa);
  20. return $ile_znakow;
  21.  
  22. }
  23. function sprawdz_adres() {
  24.  
  25. if(!preg_match($this ->wzorzec, $this -> adres)){
  26. return "bledny adres e-mail";
  27. }else{
  28. return "adres e-mail jest poprawny";
  29. }
  30.  
  31. }
  32. function pokaz() {
  33. return $this -> policz_znaki().
  34. $this -> sprawdz_adres();
  35. }
  36. }
  37.  
  38.  
  39. echo'<form action="" method="post">
  40. nazwa:<input type="text" name="nazwa">
  41. adres:<input type="text" name="adres">
  42. <input type="submit" name="submit">';
  43.  
  44. if(isset($_POST['submit'])){
  45.  
  46. $parm = new obsluga_formularza($_POST['nazwa'], $_POST['adres']);
  47.  
  48. echo $parm -> pokaz();
  49.  
  50. }
  51. ?>


od jakiegos czasu usiluje sie nauczyc programowac obiektowo i napisalem cos takiego.
nie wiem czy jest to napisane poprawnie ale dziala jak ja to sobie zalorzylem.
lecz moje pytanie brzmi czy tak powinno to wyglada czy moze sprawdzanie poprawnosci wpisanych danych powinno byc poza klasa?? moze to zly przyklad ale chodzi mi o to ze jezeli teraz chcialbym sprawdzic czy pola zostaly wypelnione to czy mam to napisac w klasie czy poza nia??
acztery
pare uwag.

1)
czemu tak:
  1. <?php
  2. function policz_znaki() {
  3. $ile_znakow = strlen($this -> nazwa);
  4. return $ile_znakow;
  5. }
  6. ?>


nie lepiej

  1. <?php
  2. function policz_znaki() {
  3. return $ile_znakow = strlen($this -> nazwa);
  4. }
  5. ?>


2) czemu w metodach masz np "bledny adres e-mail" nie lepiej false albo true
3) czemu $this -> policz_znaki(). anie self::policz_znaki().
4) metoda sa public static czy jak ..

acha a metody sprawdz_adres policz_znaki moge byc private chyba

nie jestem specem ale tyle mi sie rzuciło
Ace
@acztery jesli sie czepiasz to czepiaj sie dokladnie...

proponujesz
  1. <?php
  2. function policz_znaki() {
  3. return $ile_znakow = strlen($this -> nazwa);
  4. }
  5. ?>


to ja zaproponuje
  1. <?php
  2. function policz_znaki() {
  3. return strlen($this -> nazwa);
  4. }
  5. ?>


po co $ile_znakow?? smile.gif zmienna zbedna

poza tym to jest srednia obiektowosc, ubranie funkcji w obiekt.

Formularz to jedno
Walidacja danych to drugie
Co z tymi danymi robimy to trzecie...

Formularz moze skladac sie z wielu obiektow.. kazde pole moze byc obiektem skladajacym sie z metod walidowania tego pola
acztery
przeoczylem te zmienna ale to mialem na mysli..
skowron-line
dzeki za uwagi jak zawsze bardzo cenne ale i tak nikt nie odpowiedzial na moje pytanie

Cytat(Ace @ 29.12.2006, 00:16:50 ) *
poza tym to jest srednia obiektowosc, ubranie funkcji w obiekt.

@Ace mozesz to rozwinac
Ace
Jasne,

Najprostrzy przyklad, twoja klasa "obsluga_formularza" jest odpowiedzialna za wyswietlenie DANEGO formularza, oraz metody do walidacji ma w sobie. Czemu?

Pomysl lepiej nad obiektem formularza, ktory bedziesz mogl rozszerzac. Walidacja w formularzu? Zle zagranie. Walidacje powinienes trzymac w zupelnie innym miejscu - inna klasa? ktora bedzie zawierac zbior wszystkich metod walidacji czego zywnie sobie chcesz...

Ludzie chcacy pisac obiektowo, piszac proceduralnie po prostu ubieraja zbior funkcji w obiekt... smile.gif

Pomysl inaczej, Formularz to jakis obiekt ma napewno jakies wlasnosci - lista pol, akcja ktora stanie sie po submit, wczesniej walidacja danych, kazde pole ma przypisane do siebie sposob walidacji, moze nie miec walidacji, moze miec 1 sposob walidacji, albo kilka walidacji...

Twojego przykladu nie da sie rozszerzac. W obiektowosci liczy sie to, ze dobrze napisane obiekty mozesz wykorzystac wiele razy, pozatym latwosc rozbudowy/przebudowy jest wielkim plusem OOP. Wszystko sklada sie z obiektow. Wiec obsluga_formularza powinna tez dzielic sie na wiele mniejszych obiektow. Chociazby lista pol, albo walidacje w klasie do obslugi formularzy.
skowron-line
Kod
Najprostrzy przyklad, twoja klasa "obsluga_formularza" jest odpowiedzialna za wyswietlenie DANEGO formularza, oraz metody do walidacji ma w sobie.

  1. <?php
  2. echo'<form action="" method="post">
  3. nazwa:<input type="text" name="nazwa">
  4. adres:<input type="text" name="adres">
  5. <input type="submit" name="submit">';
  6.  
  7. if(isset($_POST['submit'])){
  8.  
  9. $parm = new obsluga_formularza($_POST['nazwa'], $_POST['adres']);
  10.  
  11. echo $parm -> pokaz();
  12.  
  13. }
  14. ?>


formularz jest poza klasa dopiero po nacisnieciu submita jest wywolywana klasa.


czyli "mowisz" ze formularz tez powinien byc w klasie??, a walidacja w innej??

dopiero zaczynam przygode z OOP i samo jej uzycie jest dla mnie malo zrozumiale

Kod
Twojego przykladu nie da sie rozszerzac

w jakim sensie nie da sie go rozszerzac?? to co powinno tam jeszcze sie znajdowac??
Kod
Wiec obsluga_formularza powinna tez dzielic sie na wiele mniejszych obiektow. Chociazby lista pol, albo walidacje w klasie do obslugi formularzy.

nie kapuje dlaczego??
koala
czyli "mowisz" ze formularz tez powinien byc w klasie?? - nie
a walidacja w innej?? - tak

  1. <?php
  2. class textInputComponent implements ioptComponent
  3. {
  4. protected $message = NULL;
  5. protected $tagParameters = array();
  6. protected $tpl;
  7.  
  8. public function __construct()
  9. {
  10. $this -> message = NULL;
  11. } // end __construct();
  12.  
  13. public function setOptInstance(optClass $tpl)
  14. {
  15. $this -> tpl = $tpl;
  16. } // end setOptInstance();
  17.  
  18. public function set($name, $value)
  19. {
  20. switch($name)
  21. {
  22. case 'message':
  23. $this -> message = $value;
  24. break;
  25. default:
  26. $this -> tagParameters[$name] = $value;
  27. }
  28. } // end set();
  29.  
  30. public function push($value, $desc, $selected = false)
  31. {
  32. $this -> set($value, $desc);
  33. } // end push();
  34.  
  35. public function setDatasource(&$source)
  36. {
  37. if(is_array($source))
  38. {
  39. if(isset($source['name']))
  40. {
  41. $this -> tagParameters['name'] = $source['name'];
  42. }
  43. if(isset($source['value']))
  44. {
  45. $this -> tagParameters['value'] = $source['value'];
  46. }
  47. if(isset($source['message']))
  48. {
  49. $this -> message = $source['message'];
  50. }
  51. }
  52. } // end setDatasource();
  53.  
  54. public function begin()
  55. {
  56. return '<input type="text"'.generateTagElementList($this->tagParameters).' />';
  57. } // end begin();
  58.  
  59. public function onmessage($pass_to)
  60. {
  61. if($this -> message == NULL)
  62. {
  63. return 0;
  64. }
  65. $this -> tpl -> vars[$pass_to] = $this -> message;
  66. return 1;
  67. } // end onmessage();
  68.  
  69. public function end()
  70. {
  71. return '';
  72. } // end end();
  73. }
  74. ?>

Ten kod pochodzi z OpenPowerTemplate - plik opt.components.php
input type="text" - jest klasą
input type="select" - jest kolejną klasą
itd. czyli każdy "input" to osobna klasa
a Twoja klasa mogaby się nazywać "Zend_Filter_Input" (zaglądnij do Zend-a). Za pomocą tej klasy możesz sprawdzić czy podany przez użytkownika email to faktycznie email, jeśli pytasz o wiek to czy to co podal użytkownik to napewno jest "int", czy nick ma minimum np. 5 znaków itd.
Czyli wszystko osobno - każdy input = osobna klasa a walidacja w innej.

Gdybyś swój formularz wstawil do do tej swojej klasy to miabyś klasę do obsugi tego konkretnego formularza a do kolejnego musiabyś stworzyć kolejną taką samą klasę która różnilaby się tylko ilością :
input type="?questionmark.gif" name="?questionmark.gif"
czyli jeśli w serwisie masz 10 formularzy musisz stworzyć 10 niemalże identycznych klas a tak masz zestaw konkretnych klas (elementów formularzy) i walidację w osobnej i czy w serwisie "XXX" czy "YYY" czy "ZZZ' ciągle korzystasz z tych samych klas nie musząc ciągle tworzyć nowych.
skowron-line
Kod
Czyli wszystko osobno - każdy input = osobna klasa

Kod
klasę która różnilaby się tylko ilością :
input type="?questionmark.gif" name="?questionmark.gif"


a wczoraj jak zasypialem wpadlem na cos takiego ale jak znam zycie to pewnie to rozwiazanie nie jest wlasciwe i ktos je skrytykuje

  1. <?php
  2.  
  3. class formularz {
  4.  
  5. public $describe;
  6. public $name;
  7. public $rows;
  8. public $cols;
  9.  
  10.  
  11. public function text($name, $describe) {
  12.  
  13. return $describe. '<input type="text" name="'.$name.'">';
  14.  
  15. }
  16.  
  17. public function textarea($name, $describe, $rows, $cols) {
  18.  
  19. return $describe. '<textarea rows="'.$rows.'" cols="'.$cols.'" name="'.$name.'"></textarea>';
  20.  
  21. }
  22.  
  23. }
  24.  
  25. $parm = new formularz;
  26.  
  27. echo $parm -> text("dupa", "dupa");
  28. echo $parm -> textarea("dupa","dupa","5","10");
  29.  
  30. ?>
Ace
Powiem tak,

dla mnie piszac obiekt do oblugi formularzy chce, latwo tworzyc rozne formularze, dodawac walidacje, zrodla danych...

Formularz to jeden obiekt, mam tez obiekty kazdego z typow pol - bo kazde pole jest inne... Mam Managera do tworzenia walidacji, Kazda walidacja jest przypisana do pola, po $_POST ida dane do formularza, obiekt jest tworzony, dane sa uzupelniane i walidujemy + wiemy ktore pola sa zle wypelnione. Proste...

Nie tworz nowych metod dla roznych typow Pol... To jest ZLE. Chodzi w skrocie o to, ze jak w jednym projekcie bedziezs mial jakies tam typy pol, a w innym inny wyglad tych pol. To czemu masz modyfikowac klase formularzy? Szablony do tego zastosuj. W kolejnych projektach nie mozesz modyfikowac klasy formularza. Musisz dobudowywac do niej pewna funkcjonalnosc, ale samej jej nie mozesz modyfikowac.

Narazie pracuje nad swoimi komponentami wiec wiecej nie moge powiedziec - bo jeszcze nie skonczone i nie przetestowane.
Dandelion
zalozmy ze za pomoca describe table wygenerowalem sobie cos takiego w php


Field Type

int(11) id
char(50) tytul
longtext tresc
datetime data_dodania
char(40) autor
int(40) id_kat

chcialbym napisac klase ktora na podstawie tych danych sama wygeneruje formularz do oblugi wybranej tabeli

troche nad tym myslalem i zastanawia mnie obsluga pol

przyklad:

longtext tresc

jak zaprogramowac klase zeby wiedziala ze polu longtext w formularzu odpowiada textarea

Uzywanie if do kazdego typu pola w bazie danych mija sie z celem dlatego szukam jakiejs alternetywy
NuLL
Cytat
szukam jakiejs alternetywy

switch ? snitch.gif
Ace
Chyba troszke sie ograniczasz...

Pole int jak odwzorujesz? Bo moze to byc select box z wybraniem np: id kategorii, badz po prostu ilosc (textbox)

Lepiej chyba sam stworzyc definicje ze pole takie typ - taki, pole inne typ - inny...
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-2025 Invision Power Services, Inc.