Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mvc i formularz
Forum PHP.pl > Forum > PHP > Object-oriented programming
qbas-s
Witam,
dla większości to pewnie będzie banał ale ja dopiero zaczynam z tym przygodę.
Chcę zbudować formularz kontaktowy w oparciu o wzorzec MVC.
Nie wiem tylko gdzie mają być przekazywane dane z formularza: do kontrolera czy do modelu.
Czy przekierowanie danych bezpośrednio z formularza na klasę poprzez znacznik <form> jest poprawne?
Pierwsze co mi przyszło na myśl to zbudowanie pliku(ale nie opartego na klasie) który by przejmował dane z tablicy $_POST a następnie dopiero przekazywał je do odpowiedniej klasy aby dokonać walidacji itp.
Wiem, że pewnie mi ktoś poleci jakiś framework ale ja chcę poznać zasadę działania od podszewki.
Crozin
1. Formularz to właśnie model.
2. Dane do przekazania formularzowi "przyjdą" w żądaniu, więc będziesz musiał je mu przekazać. Pierwszy uruchomiony zostaje kontroler, który tworzy formularz, więc to on przekaże mu dane. Skończysz z czymś w stylu:
  1. $form = new ThreadForm(new Thread());
  2.  
  3. if ($request->getMethod() === 'POST') {
  4. $form->bindData($request->get('my-form')); // Request::get() zwróci tablicę z danymi do formularza.
  5. }
qbas-s
a wyświetlenie i zdefiniowanie formularza nie powinno się znajdować w widoku?
Crozin
Definicją formularza jest... formularz. Co do jego wyświetlania - raczej ciężko zrobić to gdzie indziej.
qbas-s
Czyli formularz ma być oddzielną klasą?
Cysiaczek
Tak, zazwyczaj tak się właśnie to robi. Wszystko, co da się nazwać i co powinno odpowiadać za jakieś działania może być obiektem.
qbas-s
a posiada ktoś może jakiś przykładowy skrypt formularza na wzorcu mvc?
Bo jakoś teraz nie mogę sobie tego wyobrazić smile.gif
Pilsener
Formularz z zend framework:

  1. class Form_Announce_Search extends Zend_Form
  2. {
  3. public function init(){
  4. $this->setMethod('Get');
  5.  
  6. $search = new Zend_Form_Element_Text('search');
  7. $search->setRequired(true);
  8. $search->setLabel('Search');
  9. $search->addFilter('StripTags');
  10. $this->addElement($search);
  11.  
  12. $submit = new Zend_Form_Element_Submit('save','Search');
  13. $this->addElement($submit);
  14. }
  15. }


W kontrolerze tworzysz obiekt formularza i przekazujesz go do widoku:
  1. $form = new Form_Announce_Search();
  2. $this->view->form = $form;


Formularz sam generuje standardowy HTML, można też podpiąć do niego własny widok. Odbieranie, walidacja, karmienie formularza danymi odbywa się poprzez zestaw metod oczywiście.
Crozin
Symfony2 ma całkiem ciekawie rozwiązany mechanizm obsługi formularzy.
Cysiaczek
Aktualnie jestem w trakcie wdrażania się w symfony2, ale bez ORMa. Nie do końca to tam super wygląda, bo jednak fajniejszy był poprzedni FW i trochę szkoda, że tak wiążą formy z modelami. Trochę nadmiarowej pracy trzeba wykonać.
qbas-s
ok, mam klasę która generuje formularz, wiem że z poziomu kontrolera ładuję się ją do widoku.
Tam ta klasa wyświetla formularz. Ale co się dzieje dalej - a mianowicie po kliknięciu przycisku submit?
Akcja ma wskazywać na model i również w modelu dokonywana jest walidacja?
Pilsener
Model to model, wszystkie żądania trafiają do index.php, potem do jakiegoś dispathera i tak dalej aż do wybranej metody:
  1. //kod w kontrolerze wykonany po wpisaniu adresu strona.pl/kontroler/pokaz_strone
  2. public function pokaz_strone(){
  3. $form = new Form_Announce_Search();
  4. if($this->request->isPost() && $form->isValid($this->request->getPostParams())){
  5. $cos_tam = $form->getValue('search');
  6. }
  7. $this->view->form = $form;
  8.  
  9. }


Kontroler sprawdza, czy wysłano tablicę POST i jeśli tak, to wsadza te parametry do metody isValid, która wykonuje walidatory dodane do formularza.
Walidatory dodaje się podobnie, jak inne obiekty:
  1. $postcode = new Zend_Form_Element_Text('postcode');
  2. $validator = new Zend_Validate_PostCode('pl_PL');
  3. $postcode->addValidator($validator);
qbas-s
Podjąłem próbę wykonania formularza opartego o model MVC - oceńcie czy prawidłowo:


index.php - kontroler
  1.  
  2. <?php
  3. function __autoload($class){
  4. require $class.'.php';
  5. }
  6.  
  7. class index{
  8. private $form;
  9. private $view;
  10.  
  11. private $name; //przechowuje wartość pola z formularza
  12. private $msg; // przechowuje alerty
  13.  
  14. //konstruktor renderuje widok
  15. //oraz sprawdza czy został wysłany formularz
  16. function __construct(){
  17. if(isset($_POST['send'])){
  18. $this->name = trim($_POST['name']);
  19. $this->val();
  20. }
  21. $this->render();
  22. }
  23. //przygotowanie modelu - formularz
  24. private function prepareModel(){
  25. $this->form = new form();
  26. }
  27. //przygotowanie widoku
  28. private function prepareView(){
  29. $this->view = new View($this->msg,$this->form->st_form);
  30. }
  31. //renderowanie widoku
  32. private function render()
  33. {
  34. $this->prepareModel();
  35. $this->prepareView();
  36. }
  37. //walidacja formularza
  38. private function val(){
  39. if(strlen($this->name)>0){
  40. $this->msg = "Operacja wykonana poprawnie";
  41. }else{
  42. $this->msg = "Wypełnij puste pole";
  43. }
  44.  
  45.  
  46. }
  47. }
  48. new index();
  49. ?>



View.php - widok

  1. <?php
  2. class View{
  3.  
  4. public $msg;
  5. public $body;
  6.  
  7.  
  8. function __construct($msg,$body){
  9. $this->msg = $msg;
  10. $this->body = $body;
  11. $this->body();
  12. }
  13. public function body(){
  14. echo $this->msg."<br />";
  15. echo $this->body;
  16. }
  17.  
  18. }
  19.  
  20. ?>



form.php - model
  1. <?php
  2. class form
  3. {
  4. public $st_form;
  5.  
  6. public function __construct()
  7. {
  8. $this->showForm();
  9. }
  10. //przpisywanie formularza do zmiennej
  11. public function showForm()
  12. {
  13. $this->st_form = "<form action=\"index.php\" method=\"post\" >
  14. <input type=\"hidden\" name=\"send\" >
  15. <input type\"text\" name=\"name\" >
  16. <input type=\"submit\" value=\"send\" >
  17. </form>";
  18. }
  19. }
  20.  
  21. ?>
Crozin
Zanim weźmiesz się za MVC, poducz się podstaw OOP: http://pl.wikipedia.org/wiki/Zasada_jednej_odpowiedzialności
qbas-s
Cytat(Crozin @ 9.02.2011, 00:12:23 ) *
Zanim weźmiesz się za MVC, poducz się podstaw OOP: http://pl.wikipedia.org/wiki/Zasada_jednej_odpowiedzialności


"Nigdy nie powinno być więcej niż jednego powodu do modyfikacji klasy"

Ale jak to się odnosi do mojego kodu?
Myślałem, że każda klasa wykonuje to co do niej należy....
Crozin
Spróbuj sobie odpowiedzieć co robią poszczególne obiekty, za co są odpowiedzialne. Jeżeli w odpowiedzi użyjesz spójnika "i" to już masz odpowiedź co jest nie tak.
qbas-s


Czy teraz formularz nadal zawiera błędy?



Index.php - kontroler


  1. <?php
  2. function __autoload($class){
  3. require $class.'.php';
  4. }
  5.  
  6. class index{
  7. private $model; //
  8. private $view;
  9. private $val;
  10.  
  11. private $name;
  12. private $form;
  13. private $msg;
  14.  
  15. function __construct(){
  16. $this->startModel();
  17. $this->setData();
  18. $this->getData();
  19. $this->val();
  20. $this->getData();
  21. $this->startView();
  22. }
  23. private function startModel(){
  24. $this->model = new form();
  25. }
  26. private function setData(){
  27.  
  28. if(isset($_POST['send'])){
  29.  
  30. $this->model->name = $_POST['name'];
  31.  
  32. }
  33. }
  34. private function getData(){
  35. $this->name = $this->model->name;
  36. $this->form = $this->model->st_form;
  37. $this->msg = $this->val->msg;
  38. }
  39. private function val(){
  40. if(isset($_POST['send'])){
  41. $this->val = new val($this->name);
  42.  
  43. }
  44. }
  45. private function startView(){
  46. $this->widok = new view($this->form,$this->msg);
  47.  
  48. }
  49. }
  50. new index();
  51. ?>



form.php - model
  1. <?php
  2. class form
  3. {
  4. public $st_form;
  5. public $name;
  6.  
  7. public function __construct()
  8. {
  9. $this->showForm();
  10. }
  11. //przpisywanie formularza do zmiennej
  12. public function showForm()
  13. {
  14. $this->st_form = "<form action=\"index.php\" method=\"post\" >
  15. <input type=\"hidden\" name=\"send\" >
  16. <input type\"text\" name=\"name\" >
  17. <input type=\"submit\" value=\"send\" >
  18. </form>";
  19. }
  20.  
  21. }
  22.  
  23. ?>



view.php - widok
  1. <?php
  2. class view{
  3. private $form;
  4. private $msg;
  5.  
  6. function __construct($form,$msg){
  7. $this->form = $form;
  8. $this->msg = $msg;
  9. $this->render();
  10. }
  11. private function render(){
  12. echo $this->msg."<br/>";
  13. echo $this->form."<br/>";
  14. }
  15. }
  16. ?>




val.php - klasa odpowiedzialna za walidację

  1. <?php
  2.  
  3. class val{
  4. private $name;
  5. public $msg;
  6.  
  7. public function __construct($name){
  8. $this->name = $name;
  9. $this->check();
  10. }
  11. public function check(){
  12. if(strlen(trim($this->name))>0){
  13. $this->msg = "pole nie jest puste";
  14. } else{
  15. $this->msg = "pole jest puste";
  16. }
  17. }
  18. }
  19. ?>
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.