Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System szablonów - parę pytań
Forum PHP.pl > Forum > PHP
krzysiek9394
Witam, mam pare pytań o tworzeniu własnego systemu szablonów.

1. Załóżmy że mamy dwa pliki szablonów:
  1. <title>{tytul}</title>
  2. </head>
  3. <div id='header'>
  4. <img src='header.png' />
  5. </div>
  6. <div id='panele'>
  7. <div id='menu'>
  8. Menu
  9. </div>
  10. <div id='panel1'>
  11. Panel 1
  12. </div>
  13. </div>
  14. <div id='zawartosc'>
  15. {zawartosc}
  16. </div>
  17. <div id='stopka'>
  18. {stopka}
  19. </div>
  20. </body>
  21. </html>


i drugi:

  1. <title>{tytul}</title>
  2. </head>
  3. {include header.tpl}
  4. {include panele.tpl}
  5. <div id='zawartosc'>
  6. {zawartosc}
  7. </div>
  8. {include stopka.tpl}
  9. </body>
  10. </html>


(w tym drugim pliki typu header.tpl czy panele.tpl zawierają divy podane w pierwszym pliku)

I tu kieruję pierwsze pytanie: która z metod jest lepsza (wydajność, porządek).
Pytanie drugie: czy jest sens robienia plików .tpl do każdego pliku .php? np.
  1. index.php
  2. index.tpl
  3. tresc.php
  4. tresc.tpl
  5. uzytkownicy.php
  6. uzytkownicy.tpl
  7. ustawienia.php
  8. ustawienia.tpl
  9. newsy.php
  10. newsy.tpl
  11. artykuly.php
  12. artykuly.tpl

itd. Czy nie wprowadzi to zbyt dużego bałaganu w plikach? Jeśli tak to jakie inne wyjście polecacie?
Zyx
Ad. 1 - zależy, czego potrzebujesz. Jeśli tego nagłówka potrzebujesz też w innym miejscu, to można rozważyć drugi wariant, w przeciwnym wypadku nie ma sensu. Zresztą statyczny include jest średnio przydatny.

Ad. 2 - a jak niby sobie to inaczej wyobrażałeś? Jeśli nie chcesz bałaganu, to wpakuj to w osobny katalog i tyle.

Nawiasem mówiąc, polecam lekturę: http://www.zyxist.com/pokaz.php/uzyteczne_systemy_szablonow
thek
To, czy robić plik.php i plik.tpl zależy tylko od jednego -> czy dane w tpl są całkowicie statyczne czy nie. Plik.php można przyrównać do kontrolera a plik.tpl do widoku najprościej ujmując. Jeśli więc w widoku nie masz żadnych danych dynamicznych tylko plain-text to robienie dla niego plik.php tylko po to, by móc wywołać plik.tpl mija się z celem. Samo stosowanie php i tpl jest jak najbardziej sensowne, gdyż oddzielasz od siebie strukturę strony od operacji logicznych. Po to jest widok by wyświetlać już przetworzone dane i nic więcej. Może on jedynie minimalnie się zmieniać w zależności od tych danych (jakieś if czy pętle winksmiley.jpg ), ale nic ponadto. Od pobierania, obróbki danych masz plik php. Tpl ma to tylko wyświetlić. Dzięki temu nie musisz sie martwić rzeczami w stylu: "Do licha... Gdzie pomiędzy tym wszystkim wyświetlam tę konkretną daną i co jeśli zmienię coś". Dzięki temu interfejs strony jest w dużym stopniu niezależny od stojącego za nim silnika. Ja niestety pracuję w firmie, gdzie większość serwisów to jeszcze stare php4 i muszę grzebać się w kodzie przez szukanie w jakiej pętli gdzie jest wywoływane echo wyświetlające coś tam i jeszcze porozrzucana całość po pliku w niewiadomym miejscu, bo jest to funkcja wywołana kaskadowo przez kilka funkcji i przyjmująca jako parametry jakieś globale. To jest tragedia w której trzeba spędzić kilka godzin przynajmniej by połapać się co jest gdzie, zwłaszcza, że nazewnictwo plików w stylu srodek1.php, srodek2a.php, srodek3.php to naprawdę "przyjemność". Jedyny plus jest taki, że szef już ulega narzekaniom działu IT (czyli moim i kumpla winksmiley.jpg ) i wszystkie serwisy docelowo będą przepisywane na obiektówkę w php5. Zejdzie nam jeszcze w tej firmie jak nic kawał czasu zanim bazy przekonwertujemy, napiszemy od zera layouty, administracje itp smile.gif No ale po naszej zabawie serisy będa już tylko wprowadzały funkcjonalności jako proste moduły, a nie grzebanie się i poprawianie ze 20 plików naraz i jeszcze liczyć na to, że jedna zmiana w pliku X nie spapra czegoś w pliku Y i Z o czym dowie sie człowiek dopiero po fakcie, bo nie wiedział, że one też czegoś z pliku X używały winksmiley.jpg

EDIT: Ta tyrada była tylko po to, byś mógł docenić sensowność systemu szablonów i tego jak powinny wyglądać.
krzysiek9394
Cytat(Zyx @ 11.09.2009, 16:15:00 ) *
Ad. 1 - zależy, czego potrzebujesz. Jeśli tego nagłówka potrzebujesz też w innym miejscu, to można rozważyć drugi wariant, w przeciwnym wypadku nie ma sensu. Zresztą statyczny include jest średnio przydatny.


A zakładając że mamy powiedzmy pliki panelu admina (z 18 plików). I mając .tpl bazujące na pierwszym przykładzie chce zmienić nazwe pliku nagłówka i załóżmy dodać nowy panel. I co, i mam w każdym z tych 18 plików zmieniać nazwe pliku headera i dodawać nowego diva od panelu?
Zyx
Nie - przeczytaj proszę podany przeze mnie link. Po prostu stworzyłeś sobie zbyt prosty system szablonów i właśnie widzisz, że pokonuje Cię dość prosty problem. Jednym z ograniczeń jest m.in. niemożność wczytania nazwy pliku do dołączenia ze zmiennej szablonu.
krzysiek9394
można to zrobić tak:
  1. <div id='header'>
  2. <img src='{$header_adres}' />
  3. </div>

ale czy nie ma jakiegoś lepszego sposobu? tamtego artykułu jakoś nie trawię

EDIT: a czemu ten pomysł z include jest zły?

odświeżam
bim2
A jaki miałby być lepszy sposób? Nie widzę innej możliwości.
krzysiek9394
no ja chyba też haha.gif a mam jeszcze pytanie o pętle. czy jest sens robienia pętli t.j:
  1. {foreach $tablica as $zmienna }
  2. {while $x !== $y}
  3. {for $x<3, $x++}

i podstawiania tych danych pod pętle PHP?
bim2
  1. {foreach=zmienna}
  2. <li>{$zmienna}</li>
  3. {/foreach}

Ja tak robie :]
krzysiek9394
a inne pętle?
bim2
A w templatkach potrzebujesz jakiś innych?
krzysiek9394
Jakby tak pomyśleć to na razie nie haha.gif wielkie dzięki temat do zamknięcia
Zyx
Bo zamiast tworzyć nowy szablon za każdym razem, gdy masz inny zestaw paneli, możesz ładować dynamicznie te, które potrzebujesz. I nagle okazuje się, że nie potrzebujesz nagłówka przenosić do osobnego pliku.

Kod
<html>
<head>
<title>{tytul}</title>
</head>
<body>
<div id='header'>
     <img src='header.png' />
</div>
<div id='panele'>
     {foreach $panele as $panel}
     <div id='{$panel.id}'>
          {include $panel.file}
     </div>
     {/foreach}
</div>
...


Aby odpowiedzieć na kolejne pytanie, spróbuję ogólnie streścić ideę tekstu, który Ci podsunąłem i którego nie wiedzieć czemu, nie trawisz. Robisz system szablonów, zatem aby nadawał się on do użytku, musi oferować odpowiednie możliwości, gdyż inaczej polegnie on na najprostszej rzeczy. Takie elementarne cegiełki, które są właściwie niezbędne, to np. instrukcje warunkowe i właśnie pętle, o które się pytasz. Tak więc pytanie nie brzmi: "czy powinno się te pętle dodawać" tylko "dlaczego ich jeszcze nie zaimplementowałeś".

OK, masz już system szablonów z pętlami i tego typu bajerami. I odpowiedz sobie teraz na kolejne pytania:

1. Skoro doszedłeś do takiego poziomu, to czy nie lepiej było wykorzystać jakiś gotowy system, który oferował takie coś od ręki?
2. Czym się te Twoje szablony różnią od pisania w czystym PHP? Chyba jedynie tym, że masz klamerki zamiast <?php ... ?>, bo jedną połowę rzeczy robisz dokładnie tak samo, jak w PHP, a drugą robisz 2 razy dłużej, bo sobie nie możesz pomóc funkcjami czy obiektówką. Ergo, władowałeś kupę pracy tylko po to, by się ograniczyć smile.gif.

Jeśli piszesz system szablonów, by się czegoś nauczyć, to OK, ale jeżeli myślisz o poważnym zastosowaniu, to jest to ślepa uliczka. Żeby taki system faktycznie pomagał, musi się niestety wyróżniać czymś więcej, niż zastąpieniem <?php ... ?> klamerkami, a "to coś" już nie jest tak łatwe do wymyślenia, o implementacji nie wspominając.
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.