Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC templates
Forum PHP.pl > Forum > PHP > Object-oriented programming
Szymciosek
Witam, pisałem ostatnio o zmianach widoków itd, powiedziano mi, że źle robię, później wprowadziłem poprawkę do oceny: http://dl.dropbox.com/u/21239599/mvc3.rar czy już jest ok.
Dalej podpowiedziano mi, że trochę, źle robię z widokami i dobrze byłoby zastosować template, ale teraz pytanie jak to ma działać ?

Na tą chwilę jak można zauważyć w paczce z mojego dropboxa w index.php mam ładowanie kontrolera, który ładuje mi dalej widoki, w widokach mam wszystko wyświetlane co potrzebuję, ale jaki sens jest powtarzania 15 razy kodu związanego z header/footer skoro mogę zrobić chyba jakiś szablon i ładować za pomocą MVC dane/treści do tego szablonu.
Tak jak wspomniałem, wszystko zaczyna się w index.php
index > kontroler > model > widok, nie ma tutaj mowy o szablonie

zrobiłem sobie do tego plik config.php, który zawiera
  1. $template = 'templates/light_template.php';


jest on includowany w index.php, myślę, że to tutaj powinno odbyć się załadowanie konkretnego szablonu... ale co dalej ? teraz w index mam ładowanie kontrolera, a on chyba musi być załadowany w danym template ?
Jak w template dostać się do zmiennych z danego widoku skoro początkowo one są teraz ładowane w index ?

Struktura katalogów:
- controllers
- models
- templates (katalog odpowiedzialny za templates, które chcę ładować)
- views
- config.php
- index.php

W sumie to prosiłbym o jakieś naprowadzenie na to jak korzystać z takich templates.
Z góry dziękuję.
droslaw
Przeczytałem Twój post, ale kod mógłbyś wstawić w jakieś lepiej dostępne miejsce.
Szablonu nie ładuje się w index.php, kontrolera nie ładuje się w szablonie.
Pytasz jak przekazać dane do szablonu. Najlepiej napisać do tego odpowiednią klasę. Np. taką:
  1. class Template
  2. {
  3. protected $_tplPath;
  4. protected $_data = array();
  5.  
  6. public function __construct($tplPath)
  7. {
  8. $this->_tplPath = $tplPath;
  9. }
  10.  
  11. public function __toString()
  12. {
  13. return $this->render();
  14. }
  15.  
  16. public function __get($key)
  17. {
  18. return $this->_data[$key];
  19. }
  20.  
  21. public function __set($key, $value)
  22. {
  23. $this->_data[$key] = $value;
  24. }
  25.  
  26. public function render()
  27. {
  28. require($this->tplPath);
  29. $content = ob_get_clean();
  30. return $content;
  31. }
  32. }

Patrz na metodę render. Jeśli ładujesz szablon w metodzie widzi on wszystkie zmienne jakie są dostępne w tej metodzie. Możesz odnosić się do danych przez $this.
Dlatego zadziała coś takiego(kod layout.phtml):
  1. <!-- kod -->
  2. <title><?=$this->title?></title>
  3. <!-- kod strony nagłowek itp. -->
  4. <?=$this->content?>
  5. <!--dalszy kod ?>

Powiedzmy że masz też szablon news-list.phtml:
  1. <?foreach($this->newsList as $newsContent){
  2. echo $newsContent;
  3. }
  4. ?>

Coś takiego mógłbyś gdzieś w kontrolerze:
  1. //Teraz jeśli wyświetlasz liste wiadomości tworzysz dwie instancje szablonów
  2. $newsTpl = new Template('news-list.phtml');// szablon odpowiedzialny za sekcję z wiadomościami.
  3. $newsTpl->newsList = $newsList; //$newsList to jakaś tablica z newsami pobrana z modelu
  4. $layout = new Template('layout.phtml'); // szablon odpowiedzialny za layout
  5. $layout->title = 'Ostatnie wiadomości';
  6. $layout->content = $newsTpl;
  7. echo $layout; //wyświetli gotowy kod.

Metoda __toString w klasie Template pozwala jej instancje traktować jak stringi, prze co możliwe jest wyświetlanie szablonów wewnątrz inny przez echo.
Mógłbyś też wybrać inną drogę i stworzyć jedną instancję Template. Dalej w szablonach(nie klasie) dodawać inne szablony za pomocą require(). Ale wtedy wszystkie szablony miałyby wspólne dane, co według mnie spowodowałoby niepotrzebny bałagan.
Mógłbyś nawet załadować plik szablonu w akcji kontrolera, działałoby, ale to dopiero byłby sajgon.
To tylko takie poglądowe rozwiązanie i musisz jeszcze sporo pokombinować i poczytać. Np. tworzenie i wyświetlanie layouta nie powinno się odbywać w akcji kontrolera.
Szymciosek
1) Czemu dropbox jest zły ? Skoro z mojego konta idą tylko te dane, które udostępnię ?
2) Czemu kontrolera nie tworzyć w index ? Co z tym nie tak ? Skoro przecież to właśnie w index wszystko się zaczyna
3) Czyli template w takim przypadku jakim opisałem powinien być bardziej klasą php niżeli samym plikiem html z wstawkami php w odpowiednim miejscu ? Czyli PHP (Klasa) + HTML (Wstawki)

Muszę nad tym pomyśleć, znasz jakieś przykłady z prawidłowym (wg Ciebie) wykorzystaniem MVC i template ?
droslaw
1) Zły jest w tym wypadku rar. Wolałbym od razu zobaczyć źródła.
2) Ja pisałem że nie można ładować szablonu w index.php. Kontroler(w najprostszym przypadku) mógłby być. Ja tworzę odpowiednie kontrolery w Dyspozytorze.
3) Nie pisałem że szablon to klasa, pisałem że to może być plik z wstawkami php. Ale tem plik powinien być ładowany przez klasę, która udostępni mu dane. Dodatkowo taka klasa powinna mieś metodę __toString, przez co jej instancja może być traktowana jak napis i dzięki temu łatwo dołączana wewnątrz innych szablonów.

Najlepiej przeglądać kod różnych frameworków. Czytać jakieś artykuły na ten temat. W naszym języku raczej tego wiele nie będzie.
Szymciosek
Masz jakieś przykłady z takim czymś ?
droslaw
Poszukaj w google pod hasłem mvc tutorial.
Bardzo krótko i w prosty sposób[pl]
Też po polsku, autor zajmuje m.inn. Open Power Template
Tu jest trochę więcej informacji [en]
Poszukaj więcej porównuj, pisz i poprawiaj swój kod.
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.