Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][OOP]Prosty system szablonów
Forum PHP.pl > Forum > Przedszkole
webmaniak
Witam,
znalazłem w necie prosty system szablonów. Po małych przeróbkach klasa wygląda tak:
  1. <?php
  2.  
  3. class Lay
  4. {
  5. public $render;
  6.  
  7. public function render($plik, $tablica)
  8. {
  9. $this->render=file_get_contents("template/".$plik.".tpl"); //Wczytanie zawartości pliku
  10. foreach($tablica as $t => $content)
  11. {
  12. $this->render=str_replace("{".$t."}", $content, $this->render); //Podmiana {} na normalny tekst
  13. }
  14.  
  15. $this->render=preg_replace('({(.*?)})', "", $this->render); //Usuwanie wszystkich słów kluczowych, które nie zostały podmienione
  16. return $this->render;
  17. }
  18.  
  19.  
  20.  
  21. public function __desctruct()
  22. {
  23. unset($this->render); //Usuwanie zmiennej
  24. }
  25. }
  26. ?>


Natomiast wywołanie wygląda tak:
  1. <?php
  2.  
  3. include_once "klasa.php";
  4. $szablon = new Lay();
  5.  
  6. $dane1 = array('link1'=>'index.php?page=rejestracja');
  7. $dane2=$szablon->render("logowanie", $dane1);
  8.  
  9. $dane3=array('logowanie'=>$dane2, 'menu_lewe'=>'menu lewe');
  10. echo $szablon -> render("index", $dane3);
  11. ?>



A plik index.tpl wygląda tak:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4.  
  5. </head>
  6.  
  7. <div id="strona">
  8. <div id="nawigacja">
  9. {logowanie}
  10. ...
  11. </div> <!--nawigacja-->
  12. <div id="naglowek">
  13. ...
  14. </div><!--nagłówek-->
  15. <div id="zawartosc">
  16. <div id="lewa_kolumna">
  17. <div class="margines">
  18. <div class="menu_left">
  19. {menu_lewe}
  20. </div><!--menu_left-->
  21. </div><!--margines-->
  22. </div><!--lewa_kolumna-->
  23. <div id="tresc_strony">
  24. <div class="margines">
  25. {content}
  26. </div><!--margines-->
  27. </div><!--tresc_strony-->
  28. <div id="prawa_kolumna">
  29. <div class="margines">
  30. <div id="modul">
  31. {menu_prawe}
  32. </div><!--modul-->
  33. <div class="modul">
  34. </div><!--margines-->
  35. </div><!--prawa kolumna-->
  36. </div><!--zawartosc-->
  37. <div id="stopka">
  38. ...
  39. </div><!--stopka-->
  40. </div><!--strona-->
  41. </body>
  42. </html>

Czyli sprawa wygląda tak, że wczytywany jest plik .tpl, następnie tworzona jest zmienna w której zostają podane dane które mają zostać podmienione za {} w innym pliku(w zmiennej $dane2 jest to plik logowanie.tpl). Do tego momentu wszystko jest ok. Jednak chciałbym zrobić żeby w miejsce {content} zamiast kolejnego pliku *.tpl wczytywało mi jakiś plik php w którym umieszcze switch, sterujący zawartością. I tu mam problem bo nie wiem jak to zrobić. Próbowałem:
  1. public function rend($plik)
  2. {
  3. $this->rend=file_get_contents("template/".$plik.".php"); //Wczytanie zawartości pliku
  4. return $this->rend;
  5. }

Czyli analogicznie tylko że plik php. Jednak to nie działa. Nie wyskakuje błąd, ale też nic się nie dzieje.
Próbowałem też:
  1. public function rend($plik)
  2. {
  3. require ("template/".$plik.".php"); //Wczytanie zawartości pliku
  4. return $this->rend;
  5. }

No i to działa ale wczytuje mi zawartość strony zamiast w {content}, to na samej górze.
Jak sobie z tym poradzić? Może ktoś pomóc, naprowadzić na rozwiązanie tego problemu??
Crozin
Weź to wywal i użyj albo czystego PHP albo jakiegoś gotowego, rozbudowanego systemu szablonów. One mają to do siebie, że aby miały jakikolwiek sens muszą być rozbudowane inaczej jedynie utrudniają życie.
webmaniak
Ja nie chce gotowych rozwiązań. Większą przyjemność sprawia mi zrobienie czegoś od zera, niż przeszukiwanie stron by znaleźć sposób na zrobienie czegoś w "gotowcu". Choć i to jest gotowiec, ale bardzo prosty w porównaniu z innymi i z małymi przeróbkami.
Czyli mam rozumieć że z tego co jest nie da się nic zrobić żeby działało jak chce?
Co do "czystości". Wg jednego z użytkownika forum kohany czysty kod to: dane do bazy, zapytanie, obróbka, echo. Nie za bardzo wiem jak to zastosować do tego przypadku. Jeśli możesz to podpowiedz jak to powinno wyglądać z Twojego punktu widzenia.
ixpack
Więc porzuć OOP - oop to używanie gotowców poniekąd.

"...znalazłem w necie prosty system szablonów." != "Ja nie chce gotowych rozwiązań. Większą przyjemność sprawia mi zrobienie czegoś od zera..."

Czegoś nie rozumiem wink.gif.

A include nie możesz dać w miejsce content?? Albo dać warunek, że w miejsce {content} dajesz swoje?
webmaniak
Cytat(ixpack @ 29.03.2011, 11:38:42 ) *
Więc porzuć OOP - oop to używanie gotowców poniekąd.

"...znalazłem w necie prosty system szablonów." != "Ja nie chce gotowych rozwiązań. Większą przyjemność sprawia mi zrobienie czegoś od zera..."

Cytat(webmaniak)
Choć i to jest gotowiec, ale bardzo prosty w porównaniu z innymi i z małymi przeróbkami.

Napisałem że to jest gotowiec. A przecież system szablonów taki jak np. Smarty posiada o wiele większą funkcjonalność niż ten co ja znalazłem. A chcąc do niego dodać większą funkcjonalność muszę się uporać z podstawową smile.gif.
Odnośnie porzucenia oop, to znalazłem tutorial na wikibooks:
http://pl.wikibooks.org/wiki/PHP/Prosty_ed..._szablon%C3%B3w
Tam w sekcji Czy warto pisać własny system jest stwierdzenie że w celach edukacyjnych warto smile.gif.
Ale macie rację, że warto używać gotowców, poszukam czegoś gotowego, bo chciałbym zastosować taki system do tworzonej stronki, a przecież strona to nie tylko system szablonów(przynajmniej moja planowana smile.gif ).
Co do tego szablonu to include nie pomaga, tzn. zawartość pliku ląduje na górze strony, a w miejsce content jest wyświetlana liczba 1.
Trzeba więc się poddać i przejść na jakiś gotowiec. Jeśli ktoś by jeszcze zechciał coś odpisać i podać jakiś system szablonów (prócz Smarty), który stosuje, bo aktualnie znam tylko ten, a zaraz zacznę poszukiwania jakichś innych.
user767
przyłączam się, mi również nie działa php
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.