Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proste Tworzenie formularza
Forum PHP.pl > Forum > PHP > Object-oriented programming
zietas
Raczkuje w OOP.
Napisałem nasępujący powiedzmy sobie szczerze 'bardzo prosty generator formularza'.
  1. <?php
  2. class FormGenerator
  3. {
  4.  
  5. public function formOpen($action,$file)
  6. {
  7. if($file)
  8. {
  9. return $formStart = '<form method="post" action="'.$action.'" enctype="multipart/form-data">';
  10. }
  11. else
  12. {
  13. return $formStart = '<form method="post" action="'.$action.'">';
  14. }
  15. }
  16.  
  17. public function formInput($label,$type,$name)
  18. {
  19. return $input = ' <label for="'.$name.'">'.$label.'</label>: <input type="'.$type.'" name="'.$name.'" id="'.$name.'" />';
  20. }
  21.  
  22. public function formTextarea($label,$name,$char_width,$num_lines)
  23. {
  24. return $textarea = '<label for="'.$name.'">'.$label.'</label>: <textarea name="'.$name.'" cols="'.$char_width.'" rows="'.$num_lines.'" id="'.$name.'"></textarea>';
  25. }
  26.  
  27. public function formSelect($label,$name,$value,$option)
  28. {
  29. return $select = '<label for="'.$name.'">'.$label.'</label>: <select name="'.$name.'" id="'.$name.'"><option value="'.$value.'">'.$option.'</option></select>';
  30. }
  31.  
  32. public function formBtn($type,$value,$close)
  33. {
  34. if($close)
  35. {
  36. return $input = '<input type="'.$type.'" value="'.$value.'" /></form>';
  37. }
  38. else
  39. {
  40. return $input = '<input type="'.$type.'" value="'.$value.'" />';
  41. }
  42. }
  43. }
  44. ?>


No i moj formularz tworze nastepujaco:
  1. <?php
  2. require_once('class.FormGenerator.php');
  3.  
  4. $form = new FormGenerator();
  5.  
  6. echo $form->formOpen('contact.php',false);
  7. echo $form->formInput('Pierwszy','text','pierwszy_text');
  8. echo $form->formInput('Drugi','text','drugi_text');
  9. echo $form->formBtn('submit','Send',true);
  10. ?>


Czy jest to w miare poprawne?
Czy musze inaczej do tego podejsc? Jezeli tak, to jak?
Seth
A moze cos w ten desen:

  1. <?php
  2.  
  3. $form = new Form(null, 'cos.php');
  4.  
  5. $form
  6. ->add(new Input('test'))
  7. ->add(new SubmitButton('send', 'Wyślij'));
  8.  
  9. echo $form;
  10.  
  11. ?>


Form to obiekt formularza. Gdzie pierwszy parametr to nazwa formularza, drugi to akcja do wywolania, trzeci to metoda itd.
Zmienne te mozna takze byloby ustawic przez $form->name, $form->action itd.

Input to pole typu input winksmiley.jpg Gdzie pierwszy parametr w konstruktorze to name.

SubmitButton dziedziczy po Input,przeslaniajac prametr type na "submit".

Wszystkie klasy dziedzicza po klasie HtmlObject ktora zawierala by podstawowe zmienne jak name, id, class (w RFC do HTMLa jest szczegolowo opisane jakie sa podstawowe atrybuty dostepne w kazdym z elementow).


Metoda Form::add() dodaje do listy obiekty, ktore maja sie znajdowac w formularzu i zwraca "obiekt samej siebie" (dzieki temu mozemy korzystac ze struktury ->funkcja()->funkcja()->funkcja() etc.

Klasa Form przeslania metode __toString() w ktorej to przechodzi po wszystkich obiektach, ktore zostaly dodane przez funkcje add() i wywoluje na nich metode __toString() dolaczajac ja do swojego kodu wynikowego.
Jako, ze klasa Form przeslania __toString() mozemy uzyc prostego echo $form.
matix
Z nudów, napisałem sobie klasę, opierając się na tym, co napisał @Seth:

  1. <?
  2. interface Inputs {
  3. public function __toString();
  4. }
  5.  
  6. class Input implements Inputs {
  7. public function __construct($type, $name, $value = '')
  8. {
  9. $this->sInput = sprintf('<input type="%s" name="%s" value="%s"/>', $type, $name, $value);
  10. }
  11.  
  12. public function __toString()
  13. {
  14. return $this->sInput;
  15. }
  16. }
  17.  
  18. class form {
  19.  
  20. private $sResult = '';
  21.  
  22. function add(Inputs $input = null)
  23. {
  24. $this->sResult .= $input.$this->sLimit;
  25. return $this;
  26. }
  27.  
  28. function __toString()
  29. {
  30. return $this->sResult;
  31. }
  32.  
  33. function setLimit($string)
  34. {
  35. $this->sLimit = $string;
  36. }
  37.  
  38. }
  39.  
  40. $f = new form;
  41.  
  42. $f->setLimit("<br/>\n");
  43.  
  44. $f
  45. ->add (new Input('text', 'login'))
  46. ->add (new Input('text', 'password'))
  47. ->add (new Input('text', 'mail'))
  48. ->add (new Input('submit', 'send', 'sendit'));
  49.  
  50. echo $f;
  51.  
  52. ?>
zietas
dzieki wielkie, zaraz bede analizowal smile.gif
Speedy
Można by dodać do tej klasy jeszcze labele i np. paragrafy <p> zamiast tego setLimit() winksmiley.jpg.
destroyerr
Można by skorzystać z formularzy w symfony 1.1, albo się na nich wzorować. Jak dla mnie są naprawdę nieźle zrobione (z tego co wyczytałem wzorowali się na formularzach z django).
domis86
Wszystko pieknie ladnie, ale co jak trzeba pozniej to wystylowac? Pododawac classy cssowe? Ujac w rozne divy rozne elementy? Czy sobie poradzi z tym templater? Najlepiej uzywac prostych helperow do poszczegolnych elementow w templacie, albo w ogole bez helperow smile.gif
zietas
Cytat(Speedy @ 2.01.2008, 02:36:59 ) *
Można by dodać do tej klasy jeszcze labele i np. paragrafy <p> zamiast tego setLimit() winksmiley.jpg.


to tam jest najmniejszy problem. Z dodaniem klas itd.

Problem tkwi w napisaniu tego poprawnie w OOP smile.gif

Ja sobie powoli cos 'powaznego' z tego tworze (wykorzystujac np. labele, css).


Dzieki Seth i matrix za pomoc.
Seth
np winksmiley.jpg

Co do helperow i symfony, to nie sa one przeciez obiektowe. A o to chodzilo zietasowi.
Poza tym nie widze zadnego problemu aby dodac np. w konstruktorze dodatkowy parametry dla wyboru klasy czy wpisania stylu.

Co do setLimit to mozna by to obejsc przez stworzenie obiektu Paragraph (<p>) w taki sposob:

  1. <?php
  2. $p = new Paragraph();
  3.  
  4. $p->add(new Input('text', 'login'))
  5.  
  6. $form->add($p);
  7. ?>


OBiektowka pelna geba winksmiley.jpg


Nawiasem mowiac ciekawie zrobiono to w Prado - identyczna funkcjonalnosc jak ta w ASP.NET (kontrolki webowe).
Tutaj sa przyklady uzycia wraz z kodem zrodlowym: http://pradosoft.com/demos/quickstart/?pag...ntrols.Standard
destroyerr
Seth ale nikt nie pisał tutaj o helperach z symfony, które rzeczywiście nie są obiektowe. Pisałem o formularzach w symfony1.1 a są one tam całkowice inne niż w niższych wersjach. Pełna obiektowość (widgety "zastąpiły" helpery) no i można konfigurować formatownie formularza.
Dorzucę linki:
http://www.thatsquality.com/section-name/symfony
http://redotheweb.com/2007/12/21/sfforms-t...sing-component/
http://www.aide-de-camp.org/talk/7/interna...007?position=40
http://trac.symfony-project.com/browser/branches/1.1/lib
Seth
Hmm ciekawe, ale z pierwszego linku kod nie wydaje mi sie zbyt intuicyjny.
Chociaz tak samo mowilem kiedy zobaczylem ta mase katalgow jakie symfony tworzy, a teraz juz sie przywyczailem winksmiley.jpg
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.