Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> obsluga formularza
skowron-line
post
Post #1





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


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





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


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

Ten post edytował acztery 28.12.2006, 17:40:39
Go to the top of the page
+Quote Post
Ace
post
Post #3





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

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


@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?? (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
acztery
post
Post #4





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


przeoczylem te zmienna ale to mialem na mysli..
Go to the top of the page
+Quote Post
skowron-line
post
Post #5





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


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





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

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


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... (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
skowron-line
post
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


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??
Go to the top of the page
+Quote Post
koala
post
Post #8





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 4.03.2005

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


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="?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) " name="?(IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
skowron-line
post
Post #9





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Kod
Czyli wszystko osobno - każdy input = osobna klasa

Kod
klasę która różnilaby się tylko ilością :
input type="?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) " name="?(IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post
Ace
post
Post #10





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

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


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





Grupa: Zarejestrowani
Postów: 169
Pomógł: 0
Dołączył: 27.01.2006

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


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

Ten post edytował Dandelion 2.01.2007, 23:39:57
Go to the top of the page
+Quote Post
NuLL
post
Post #12





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat
szukam jakiejs alternetywy

switch ? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Ace
post
Post #13





Grupa: Zarejestrowani
Postów: 216
Pomógł: 0
Dołączył: 9.08.2003
Skąd: Warszawa

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


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...
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 18:07