Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MVC] Przekazanie wartości z modelu do widoku
Forum PHP.pl > Forum > Przedszkole
jg44
Witam,
piszę prosty skrypt do porównywania podobieństw tekstów w oparciu o MVC, bo nigdy niczego wcześniej nie pisałem na tym wzorcu, a chciałbym nabrać jakiegoś obycia z nim. Strona jest następująca: są 2 textarea, guzik i po jego kliknięciu mają się wyświetlić informacje o tych tekstach. Problem polega w tym, że nie wiem, jak przekazać wartości zwracane przez poszczególne metody klasy Model do Widoku, w szczególności, że te wartości mają być drukowane tylko po kliknięciu przycisku, a zgodnie z tym, co czytałem, Kontroler odpowiada za to, co się ma dziać po naciśnięciu przycisku.
Klasa Modelu:
  1. <?php
  2. class Model
  3. {
  4. public $string1;
  5. public $string2;
  6.  
  7. public function setString1($string1)
  8. {
  9. $this->string1 = $string1;
  10. }
  11.  
  12. public function setString2($string2)
  13. {
  14. $this->string2 = $string2;
  15. }
  16.  
  17. function computeLeven($string1, $string2)
  18. {
  19.  
  20. (...) tutaj algorytm obliczania odległości Levenshteina
  21.  
  22. return $this->resultLeven;
  23. }
  24.  
  25. public function computeNWP()
  26. {
  27. return $this->resultNWP = similar_text(trim($this->string1), trim($this->string2));
  28. }
  29.  
  30. public function getMaxLength()
  31. {
  32. return $this->max = strlen($this->string1) + strlen($this->string2);
  33. }
  34.  
  35. public function getLength_1()
  36. {
  37. return $this->length_1 = strlen($this->string1);
  38. }
  39.  
  40. public function getLength_2()
  41. {
  42. return $this->length_2 = strlen($this->string2);
  43. }
  44.  
  45. public function similarity_1()
  46. {
  47. return $this->similarity_1 = round(($this->resultNWP / strlen($this->string1)*100), 2);
  48. }
  49.  
  50. public function similarity_2()
  51. {
  52. return $this->similarity_2 = round(($this->resultNWP / strlen($this->string2)*100), 2);
  53. }
  54. }
  55. ?>

Widok (w pudełku #wynik chciałbym umieścić wspomniane wartości zwracane przez metody Modelu, próbowałem w taki naiwny sposób, ale jest on bez sensu, bo nie ma sprawdzania warunku, czy guzik został kliknięty):
  1. <? include_once("model/Model.php"); ?>
  2. <!DOCTYPE HTML>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Porównaj podobieństwo tekstów</title>
  5.  
  6. <style type="text/css">
  7. (...)
  8. </style>
  9. </head>
  10. <section id="formularz">
  11. <form action="index.php" method="post">
  12. <p id="ciag1">
  13. Tekst 1:
  14. <textarea cols="50" rows="20" name="ciag1"></textarea>
  15. </p>
  16. <p id="ciag2">
  17. Tekst 2:
  18. <textarea cols="50" rows="20" name="ciag2"></textarea>
  19. </p>
  20. <p id="stat">
  21. <input type="submit" name="wyslany" value="Porównaj" />
  22. </p>
  23. </form>
  24. </section>
  25. <section id="wynik">
  26. <? $entry = new Model(); ?>
  27. Długość pierwszego ciągu: <? echo $entry->getLength_1(); ?>
  28. <br />Długość drugiego ciągu: <? echo $entry->getLength_2(); ?>
  29. <br />Odległość Levenshteina: <? ?>
  30. <br />Najdłuższy wspólny podciąg: <? echo $entry->computeNWP() ?>
  31. <br />% NWP w pierwszym ciągu: <? echo $entry->similarity_1(); ?>
  32. <br />% NWP w drugim ciągu: <? echo $entry->similarity_2(); ?>
  33.  
  34. </section>
  35. </body>
  36. </html>

Kontroler:
  1. <?php
  2. include_once("model/Model.php");
  3. class Controller
  4. {
  5. public $model;
  6.  
  7. public function __construct()
  8. {
  9. $this->model = new Model();
  10. }
  11.  
  12. public function invoke()
  13. {
  14. if(isset($_POST['wyslany']))
  15. {
  16. extract($_POST);
  17. $this->model->setString1($ciag1);
  18. $this->model->setString2($ciag2);
  19. include("view/View.php");
  20. $this->model->computeLeven($ciag1, $ciag2);
  21. $this->model->computeNWP();
  22. $this->model->getMaxLength();
  23. $this->model->getLength_1();
  24. $this->model->getLength_2();
  25. $this->model->similarity_1();
  26. $this->model->similarity_2();
  27. }
  28. else
  29. {
  30. include("view/View.php");
  31. }
  32. }
  33. }
  34. ?>

Uruchomienie całości (index.php):
  1. <?php
  2. include_once("controller/Controller.php");
  3.  
  4. $controller = new Controller();
  5. $controller->invoke();
  6. ?>

Pozdrawiam i proszę o pomoc,
z góry dziękuję.
IceManSpy
Jak chcesz się zabierać za MVC, to zacznij wykorzystawać framework, który go implementuje. Moje komentarze do modelu:
1. Po co robisz settery do string1 i string2 , skoro atrybuty są publiczne?
2. Po co zwracasz w metodach wartości z użyciem $this, spoko nie ma takich atrybutów w modelu (wiem, że się utworzą, ale nie powinieneś tak robić)
3. Model to nie jest tylko opis czegoś. Mogą być różne modele, a Ty pod nazwą Model trzymasz tylko jedną rzecz.

Reszty nie komentuje, bo MVC to nie tylko Model, Vidok i Controler (specjalnie tak napisałem) zapisany pod jednym plikiem. Pod tym kryje się wiele różnych mechanizmów do współpracy między sobą.
Jak wcześniej napisałem, wybierz sobie jakiś framework (ten chyba jest najprostrzy na początek: http://codeigniter.com/ , ale nie najgorszy) i na jego podstawie twórz projekt.
jg44
Co do Twoich uwag:
1) Pierwotnie pola były protected, później zmieniłem na public, a settery zostały wink.gif
2) Masz rację, $this w tym kontekście jest zdecydowanie zbędne

Co do frameworków to tyle co zainstalowałem Kohanę i miałem się za nią wziąć, ale skoro na początek polecasz CodeIgniter, to może najpierw z nim się zapoznam (tym bardziej, że Kohana z niego się wywodzi)
Dzięki za wskazówki.

Aha: "najprostszy", nie "najprostrzy" wink.gif
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.