Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szablony - oddzielenie PHP od HTML
Forum PHP.pl > Inne > Hydepark
Evinek
Witam.

Otóż ciągle głowię się, czytam i nic nie mogę wymyślić aby było dobrze. Zawsze gdy chce stworzyć jakiś CMS to boje się, że gdy będę zmieniał szablon będę grzebał we wszystkich plikach bo tam było na przykład menu robione (w pętli) a tam to itp.

Na początku myślałem o systemie szablonów - własny, tylko podstawowe funkcje. Okazało się jednak, że wolę pisać czysto w PHP niż tworzyć drugi język do obsługi szablonów.
Później doszło MVC - rozumiem o co chodzi lecz z praktyką już trudniej.

Więc do was pytanie, jak wy robicie takie strony? Poprzez Smarty? czy może jakiś własny sposób.

Zależy mi aby oddzielić PHP od HTML. Czyli: najpierw zapytania, logowanie itp. a na koniec tworzenie szablonu (sklejanie) i wyświetlenie tylko jak to zrobić.
Macie jakieś rady?
Męczy mnie też dzielenie plików na 15 innych. Menu, header(w header: menu), stopka.
Proszę o pomoc bo już nie wytrzymuje z tym...

Pewnie nie jasno coś napisałem. Jak coś proszę pisać.

Pozdrawiam Paweł.
i-skrypty.pl
ja korzystam ze smarty i nie narzekam. Jeśli chodzi o ilość plików szablonowych to przecież możesz zrobić wszystko w jednym, ale po co? wygodniej jest rozdzielać szablon na kilka plików.
bzeebzee
Proponuje ci zapoznanie się z którymś z framework`ów. Wg ich idei są podzielone na 3 warstwy. Prezentacji, biznesowej i widoku. Pozwoli ci to na wydajne pisanie kodu oraz przyśpieszy pracę. Dodatkowo w większości możesz podpiąć sobie np smarty. Sposoby jak to zrobić są opisane w sieci.

Na początek możesz zacząć bawić się w kohana framework.
rafio
Cytat(Evinek @ 19.02.2012, 15:06:48 ) *
Więc do was pytanie, jak wy robicie takie strony? Poprzez Smarty? czy może jakiś własny sposób.


Ja mam klasy widoków które dostają model/array/formularz (zależy od widoku), z tegoż wyciągają interesujące je dane (czasem dodatkowo obrabiają) po czym ładują szablon w Twigu, wpychają mu te dane i zwracją gotowy szablon jako tekst.


Cytat(Evinek @ 19.02.2012, 15:06:48 ) *
Męczy mnie też dzielenie plików na 15 innych. Menu, header(w header: menu), stopka.
Proszę o pomoc bo już nie wytrzymuje z tym...


Jeśli coś pojawia się tylko w innym szablonie i nie jest duże samo w sobie, to nie wydzielam tego do osobnego szablonu. Mam szablon "pageLayout", on zawiera nagłówek, stopkę, miejsce gdzie wkleja się html wygenerowany przez widok kontrolera. Ten szablon dostaje nazwę strony/akcji, array z sekcjami (z którego generuję pierwszy "rząd" menu) oraz array z akcjami w sekcji (drugi rząd menu).

Piszę sobie teraz taki wynalazek (framework? platforma?) i na załączonym obrazku jest 7 szablonów:

1. Wrapper - nie widoczny, zawiera HTML który obecny jest zawsze gdy odsyłam klientowi HTML.

2. Layout - Ogólny układ strony, dostaje dane od uruchomionej akcji i aplikacji.

3. Opakowanie formularzy - Opakowuje grupę formularzy w konieczne tagi + buttony

4. Formularz "tabelka" - Wyświetla pola formularza w układzie "tabelkowym".

5. Input textowy

6. Input select

7. Input checkbox

Pozdr.
ShadowD
Ja polecam framework - sam miałem kilka interpretacji "jak to powinno wyglądać", teraz mam jedną narzuconą i nie żałuje. :-)
!*!
W swoim FW, opartym o MVC zrobiłem mini system szablonów. Zależało mi na oddzieleniu właśnie php od html, bo np. webmaster znać go nie musi. Wprowadziłem tagi, które siedzą w tablicy np. {menu} które zamieniane są na kod php. Przy wczytywaniu szablonu, podmiana tagów odbywa się tylko raz, ponieważ później pobierana jest wersja już "skompilowana" w czystym php. Nie ma też znaczenia czy plików jest 15 czy 150 w szablonie, bo każdy wczytuje tylko wtedy gdy jest potrzebny.

Obadaj różne, proste FW np. kohana czy codeigniter mają mniej więcej zaimplementowane coś podobnego.
by_ikar
Cytat
Zależało mi na oddzieleniu właśnie php od html, bo np. webmaster znać go nie musi.


Nie obraź się, ale ten argument jest z d.upy wyjęty wink.gif już to komuś tłumaczyłem, ale mogę przypomnieć. Co z tego że webmaster php znać nie musi, skoro smarty, twig, phptal, opt i inne narzucają jakąś swoją składnie? Lepiej żeby właśnie znał php i szablony były robione w php, dzięki temu nie będzie musiał się uczyć jakichś nowych rzeczy, bo w nowej wersji templatek coś się zmieniło. Dlatego ten argument jest beznadziejny. Lepiej znać jedno php, niż dziesiątki składni różnych szablonów, które znacznie różnią się od siebie..

Co do tematu. Jak chcesz bawić się w zmianę różnych szablonów "jednym przyciskiem", to IMO musisz zdefiniować jakieś podstawowe elementy, czy podstawowe styli w css. Co z kolei moim zdaniem jest niepotrzebne i robi straszny śmietnik, czego przykładem jest wordpress i masę zbędnych styli które narzuca, wraz ze swoimi wtyczkami.

Można też zrobić by to na takiej zasadzie, że nie ma jakichś narzuconych styli w css, jak i nie ma narzuconej struktury. Problemem było by to że każdy szablon, musiałby zawierać takie same pliki, dla poszczególnych podstron, czy innych elementów. I raczej sporo kodu html by ci się powielało, ale to jest kod html, i raczej można by przymknąć na to oko. A dzięki temu z każdą zmianą szablonu, mógłbyś zmieniać nie tylko grafikę czy style, ale całą strukturę dokumentu html, gdzie strona mogłaby wyglądać o 180 stopni inaczej niż w przypadku poprzedniego szablonu, czego nie da się osiągnąć w pierwszym sposobie, ponieważ masz już jakieś narzucone style, czy strukturę html.

Osobiście wykorzystuje drugi sposób, tzn mam zaimplementowany, ale póki co nie miałem jeszcze potrzeby zmiany szablonu "jednym przyciskiem". Także jakaś opcja jest, ale nie jest jakoś specjalnie intensywnie wykorzystywana.
!*!
Cytat(by_ikar @ 20.02.2012, 11:01:08 ) *
Nie obraź się, ale ten argument jest z d.upy wyjęty wink.gif już to komuś tłumaczyłem, ale mogę przypomnieć. Co z tego że webmaster php znać nie musi, skoro smarty, twig, phptal, opt i inne narzucają jakąś swoją składnie? Lepiej żeby właśnie znał php i szablony były robione w php, dzięki temu nie będzie musiał się uczyć jakichś nowych rzeczy, bo w nowej wersji templatek coś się zmieniło. Dlatego ten argument jest beznadziejny. Lepiej znać jedno php, niż dziesiątki składni różnych szablonów, które znacznie różnią się od siebie..


Tylko że ja nie narzucam jakiejś pro składni z kosmosu, a jedynie proste znaczniki {nav}, {aside}, {footer} i programista php decyduje o tym co ma się pod nimi znajdować, webmaster dba jedynie o wygląd/prezentacje a nie mechanizm działania.
Evinek
A macie może jakiś przykładowy kod? Klasę czy coś?

Tylko bez systemu szablonów, chce czysto w PHP pisać.
wiewiorek
Szablony nic nie dają i niczego nie ułatwiają.
sazian
Cytat(!*! @ 20.02.2012, 13:36:14 ) *
Tylko że ja nie narzucam jakiejś pro składni z kosmosu, a jedynie proste znaczniki {nav}, {aside}, {footer} i programista php decyduje o tym co ma się pod nimi znajdować, webmaster dba jedynie o wygląd/prezentacje a nie mechanizm działania.

równie dobrze można dać <?=$nav;?> <?=$aside;?> <?=$footer;?>
i nie muszę stosować dodatkowych funkcji

co do klasy, ja napisałem własną
najważniejsza część
  1. public function render()
  2. {
  3. $result = '';
  4.  
  5. if(!empty($this->args))
  6. {
  7. extract($this->args);
  8. }
  9. include $file;
  10. $result = ob_get_contents();
  11. if($return)
  12. {
  13. return $result;
  14. }
  15.  
  16. }


wystarczy rozbódować wedle własnych potrzeb
by_ikar
Cytat(!*! @ 20.02.2012, 13:36:14 ) *
Tylko że ja nie narzucam jakiejś pro składni z kosmosu, a jedynie proste znaczniki {nav}, {aside}, {footer} i programista php decyduje o tym co ma się pod nimi znajdować, webmaster dba jedynie o wygląd/prezentacje a nie mechanizm działania.


A jak radzisz sobie z tablicami przekazanymi do takiego szablonu? Lub jak radzisz sobie z obiektami przekazanymi do szablonów? Jeżeli twój system szablonów takich podstawowych rzeczy uniemożliwia, to po co mi taki system? O wiele wygodniej będzie mi wpisać:

  1. <?php $tablica['index']; ?>


i mieć jakieś możliwości.. A jakieś warunki są w twoim systemie szablonów? Pętle? A mogę zobaczyć jak to wygląda? A można jakieś funkcje w ogóle tam używać, czy to tylko zmienne wyświetla?

Przykładowy kod jak ja to robię u siebie: http://forum.php.pl/index.php?showtopic=18...t-member-921998 kod nie jest zbyt skomplikowany, jest to raptem 200 linijek, wraz z komentarzami. I jest tam pełen wypas. Funkcje, pętle, warunki, tablice ala smarty, etc. To samo co w zwykłym php (nieco inaczej podszedłem do tematu ;)). Po lekkim rozbudowaniu, mamy i include, i inne bajery, które opisałem w poście do którego podałem link.
!*!
Cytat
A jak radzisz sobie z tablicami przekazanymi do takiego szablonu?


{nav[index]} lub samo {nav} może być już elementem tablicy, w zależności od potrzeby. Weźmy inny przykład... Budujesz system blogowy... Dasz użytkownikowi możliwość klepania PHP? Nie sądzę wink.gif PHP jest IDEALNYM systemem szablonów i tu nie ma dyskusji, jednak nie jestem zwolennikiem dawania ludziom czegoś co może im sprawić problem, już odpuśćmy niechęć webmastera do php wink.gif po prostu taka forma szablonów wydaje mi się lepsza i myślę o tym bardziej globalnie, przy zmianach dla każdego, a nie tylko tych co się na php znają.

sazian - klapanie <?= ?> nie jest trendi.

Edycja:
Poczytałem o short_open_tag i okazało się że od wersji php 5.4 będzie on działać zawsze... heh a jeszcze niedawno była mowa że mają to całkowicie usunąć. Tak czy inaczej, nie podoba mi się ten sposób, szczególnie że jest to tylko alias który albo działa, albo nie, a standardem dzisiaj jest php 5.3
by_ikar
Cytat
{nav[index]} lub samo {nav} może być już elementem tablicy, w zależności od potrzeby.


A tablice wielowymiarowe, bo pokazałeś tylko jeden wymiar? A stałe? A obiekty? A pętle? A warunki? Jakieś funkcje formatujące stringi? Widzisz, też wymyśliłeś swoją składnie i w ten sposób, jeżeli chciałbym pociąć layout, dla ciebie, musiałbym znać składnie twojego systemu szablonów. A szczerze mówiąc, od ilości tych systemów, oraz wymyślności ich autorów, to tych składni jest tyle że mózg się lasuje wink.gif

Cytat
Weźmy inny przykład... Budujesz system blogowy... Dasz użytkownikowi możliwość klepania PHP? Nie sądzę


Czemu nie? Jeżeli wszyscy webmasterzy znają podstawy php, to czemu miałbym im tego nie udostępnić właśnie w postaci php? Jakieś konkretne przeciwwskazania?

Cytat
po prostu taka forma szablonów wydaje mi się lepsza i myślę o tym bardziej globalnie, przy zmianach dla każdego, a nie tylko tych co się na php znają.


podstaw php można nauczyć się w kilkadziesiąt minut (pętle, warunki, zmienne, tablice). Jeżeli taki webmaster jest w stanie zrozumieć twoją udziwnioną składnie szablonu, którą de facto również musi znać (!), to czemu miałby nie zrozumieć php? W czym twoja składnia, oraz składnia innych systemów szablonów jest łatwiejsza do zrozumienia, od podstaw php? Konkrety, fakty, bo tak to wiem że tobie się tak wydaje, i nic poza tym wink.gif

Nie to że chwalę się pomysłowością, poprostu podszedłem do tematu tak że nie chciało mi się wymyślać nowej składni, której bym zapomniał po jakimś czasie nie używania. I w ten sposób, mam klasę która ma raptem 200 linijek, a jest w niej wszystko co w php. Czyli:

- wyświetlanie zmiennych
- wyświetlanie tablic wielowymiarowych
- wyświetlanie obiektów
- pętle (while, foreach, for)
- warunki (if, switch, operator trójargumentowy)
- blok ignore który jest pomijany przez parser
- wszystkie funkcje formatujące stringi
- wszystkie funkcje operujące na tablicach
- wszystkie zmienne globalne
- wszystkie stałe predefiniowane
- isset/empty/is_null/is_string/is_array etc
- date/striftime i cały asortyment
- includowanie szablonów
- dodatkowe możliwości rozbudowy, jeżeli zajdzie taka potrzeba (np u siebie mam jeszcze includowanie komponentów)

i wiele wiele więcej, w skrócie mój system szablonów ma możliwości i składnie php. Dzięki temu nie muszę się martwić o pluginy czy inne helpery żeby jakoś operować na stringach chociażby, oraz dodatkowo niczego nie dubluje, zgodnie z DRY, jak i nie wymyślam niczego na nowo wink.gif

Prostota? Nie potrzebnych funkcji nie trzeba używać, raz się nauczysz php i stosujesz w każdym projekcie. Szybkość? Czy może być coś szybszego w php, od samego php? Czy zmiany wersji klasy wpłyną na składnie szablonów? Nie, dlatego że to jest najzwyczajniejsze php, a php ma wsteczną zgodność, dzięki temu wiedza którą raz posiądziesz zostanie na bardzo długi czas. Dokumentacja? Wystarczy zajrzeć do dokumentacji php.

Nie to że się reklamuje, bo jest mi rybka czy ktoś używa mojej klasy, lub podoba mu się moje podejście (tzn klamry zamiast tagów php), ale chodzi o prostotę i użyteczność. Nie widzę sensu ładowania kobyły i zaprzęgania do tego dziesiątek klas/funkcji, które już istnieją w php.
!*!
by_ikar - każdy z Nas będzie miał swoje argumenty za i przeciw wink.gif Poza tym, chyba mam inne podejście do tego... Traktuję np. {nav} jak formę tagu, do którego jest przypisana wartość w danej aplikacji. I tak {nav} może być wszystkim i niczym. Koder PHP odpowiada za to co się z tym stanie, a webmaster za to jak to będzie wyglądać. Przykładowo tag ten może wczytać osobny plik html, z nawigacją, w którym będzie inny tag {menu} i kod html. Oczywiście to tylko małe wsparcie, bo 1. można to wyłączyć 2. wszytko i tak jest zlepiane na czysty php i czytane z cache.

Załóżmy że robisz serwis ala jogger.pl, każdy użytkownik ma możliwość zmiany szablonu, na prawdę dasz im możliwość wklepania php?
by_ikar
Cytat
Załóżmy że robisz serwis ala jogger.pl, każdy użytkownik ma możliwość zmiany szablonu, na prawdę dasz im możliwość wklepania php?


A ty codziennie robisz serwisy pokroju jogger? Raczej nie. Oczywiście że bym nie dał, ale większość stron to nie jogger.

Cytat
Traktuję np. {nav} jak formę tagu, do którego jest przypisana wartość w danej aplikacji. I tak {nav} może być wszystkim i niczym. Koder PHP odpowiada za to co się z tym stanie, a webmaster za to jak to będzie wyglądać.


To kto w końcu tnie i projektuje układ w tym layoucie, webmaster, czy koleś odpowiedzialny za php (backend)? Bo jeżeli nie masz powiedzmy includowania innych szablonów, nie masz jakichś funkcji formatowania, nie masz warunków, pętli, i wielu innych rzeczy to IMO mieszasz wówczas kod html gdzieś w pehapie, na poziomie backendu. To po co mi taki system szablonów? Dla samej zasady? Właśnie po to są te szablony, żeby można było includować jakieś pliki które zawierają kod który się powiela (stopka, nagłówek, jakieś boksy czy co tam kto sobie wymyśli). A u ciebie całość jest i tak realizowana po stronie php. Więc teraz narzucasz mi swoją strukturę, bo html w pętlach generujesz po stronie php, i nie mogę tak jakbym chciał takiego html'a dostosować. To ja podziękuje. Wolę już nawet czyściutki php, bez żadnych dodatków ani ficzerów, niż męczyć się z mechanizmem, który na każdym kroku mnie ogranicza.

Podobnie jest w popularnych cms'ach, że spora część kodu html jest gdzieś po stronie php generowana w pętlach, warunkach i innych cudach. Jak chcę zrobić coś bardzo nietypowego, to nie jest za bardzo w stanie, bo mam narzucone style, jak i strukturę.

W moim przypadku, delikatnie przerobię swoją klasę, co by nikt nie mógł php użyć bezpośrednio. A w pozostałych projektach, które nie są joggerem, zastosuje swoją klasę, w niczym się nie ograniczając, i przedewszystkim nikogo nie ograniczając.

Może i masz swoje argumenty, i uważasz je za słuszne, ale dla mnie póki co wszystko co wymieniłeś nie jest argumentem, a jest problemem. Problemem który sobie nieświadomie narzucasz. Chyba nie chciałbym poprawiać kodu jakby ktoś użył takiego typu szablonu.. Oczywiście bez obrazy, ale taka jest rzeczywistość, gdybym musiał coś tam rozbudować, to również musiałbym połowę html'u generować po stronie modelu/kontrolera. Co IMO nawet trochę nie przypomina hasła "oddzielenie prezentacji od logiki". No ale ok, dalej upieraj się przy swoim, i dalej uważaj że dobrze myślisz. Szczerze nie mam nic do tego, twoja sprawa wink.gif
!*!
Albo rybki, albo akwarium, nie uważam żeby miało to jakiekolwiek ograniczenia, jak skończę wrzucę to do ocen, bo bez kodu/przykładów, nie ma co dyskutować. Gdyby był jedyny słuszny mechanizm, mielibyśmy funkcje is_mvc() smile.gif
by_ikar
Z tym is_mvc to trochę poleciałeś po bandzie.. MVC to tylko wzorzec, ale tutaj w przypadku twojego szablonu nie chodzi wcale o MVC, ale o przydatność takiego systemu szablonów. Co z tego że masz super prosty system szablonów (btw mój jest trudny? To raptem 200 linijek wink.gif), skoro i tak większość rzeczy musisz przerzucać na php. W takim wypadku po co mi system szablonów? Przecież i tak mieszam html z php, a system szablonów jest właśnie po to żeby takiego czegoś nie robić. I tutaj już bez względu na to czy to jest mvc, hmvc, czy jaki kolwiek inny wzorzec, chodzi właśnie o oddzielenie logiki od prezentacji. Temu mają służyć szablony. Brak czegoś takiego jak pętle, warunki i jakieś podstawowe operacje na ciągach (str_*), czy operacje na tablicach (array_*), w moim i raczej bardzo wielu wypadkach, dysklasyfikują taki system szablonów, bo on wcale niczego nie ułatwia, a jedynie utrudnia. A w sumie wrzuć, zobaczymy co to to jest.

BTW przykłady mogłeś podać, podałeś nawet w przypadku tablicy. Poprosiłem o przykład pętli, warunków itp. Więc fakt, nie ma co dyskutować, skoro niczego nie podałeś. Ale wnioskując, po tym fragmencie:

Cytat
Traktuję np. {nav} jak formę tagu, do którego jest przypisana wartość w danej aplikacji. I tak {nav} może być wszystkim i niczym.


Domyśliłem się, że właśnie większość operacji robisz po stronie php, a do szablonu już przetworzony html przesyłasz. Dla mnie, taki szablon to tylko problem, i masa ograniczeń. Jeżeli to jest takie ułatwienie, to hmm...
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.