Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> mvc i formularz
qbas-s
post
Post #1





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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. }


Ten post edytował Crozin 8.02.2011, 11:48:01
Go to the top of the page
+Quote Post
qbas-s
post
Post #3





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


a wyświetlenie i zdefiniowanie formularza nie powinno się znajdować w widoku?
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Definicją formularza jest... formularz. Co do jego wyświetlania - raczej ciężko zrobić to gdzie indziej.
Go to the top of the page
+Quote Post
qbas-s
post
Post #5





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


Czyli formularz ma być oddzielną klasą?
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


a posiada ktoś może jakiś przykładowy skrypt formularza na wzorcu mvc?
Bo jakoś teraz nie mogę sobie tego wyobrazić (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Symfony2 ma całkiem ciekawie rozwiązany mechanizm obsługi formularzy.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #10





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


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?

Ten post edytował qbas-s 8.02.2011, 14:26:49
Go to the top of the page
+Quote Post
Pilsener
post
Post #12





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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);
Go to the top of the page
+Quote Post
qbas-s
post
Post #13





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Zanim weźmiesz się za MVC, poducz się podstaw OOP: http://pl.wikipedia.org/wiki/Zasada_jednej_odpowiedzialności
Go to the top of the page
+Quote Post
qbas-s
post
Post #15





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 28.06.2009

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




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. ?>


Ten post edytował qbas-s 9.02.2011, 23:35:24
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: 24.12.2025 - 02:28