Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MVC] Przekazanie wartości z modelu do widoku
jg44
post
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

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


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

Ten post edytował jg44 17.02.2012, 21:21:23
Go to the top of the page
+Quote Post
IceManSpy
post
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


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.


--------------------
Go to the top of the page
+Quote Post
jg44
post
Post #3





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

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


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

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

 



RSS Aktualny czas: 21.08.2025 - 19:14