Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Smarty]szkielet strony
Forum PHP.pl > Forum > Przedszkole
robos85
Witam. Troszkę już się zapoznałem ze Smarty. Mam jakiś tam prosty skrypcik oparty o Smarty właśnie. Mam inny problem.
Do tej pory pisałem bez uzycia smarty a szablon dzieliłem na 3 główne pliki. head.php, foot.php i plik z główną zawartością.
Chciałbym dalej tak robić, lecz opierać wszystko na smarty. Przypuśćmy że mam pliki nagłówka i stopki zrobione już w smarty, i jak je teraz poprawnie dodawać do pliku głównego typu wiadomości, ogłoszenia itp....
Mam nadzieję, że rozumiecie o co mi chodzi. nie chcę w każdym pliku zaczynać od deklaracji html.... tylko podczepiać już gotowe pliki, w których już są wykonywane różne rzeczy,np w zależności od tego czy jest się zalogowanym, słowa kluczowe robione dynamicznie.

Czy jeżeli dam dołączenie
Kod
{include file='header.tpl'}
do pliku głównego czyli najpierw include headera.tpl, później zawartość pliku głównego i na koniec include foot.tpl - to kod php odpowiedzialny za te 2 pliki czyli np head.php i foot.php zostanie wykonany?

Chciałbym się dowiedzieć, jak to zrobić najlepiej, żeby później nie robić tego źle.

Z góry dzięki za odp.

Dodam, że pliki główne są w katalogu /templates, a pliki nagłówka i stopki w katalogu: /templates/includes.
Pliki php są w kat. głównym, a pliki nagłówka i stopki w katalogu/includes

Czy taki zapis jest "dobry":
header.php
  1. <?php
  2.  
  3. require_once('smarty/Smarty.class.php');
  4. $smarty = new Smarty;
  5. $smarty->template_dir = "templates/";
  6. $smarty->compile_dir ='smarty/templates_c/';
  7. $smarty->config_dir  = 'smarty/configs/';
  8. $smarty->cache_dir = 'smarty/cache/';
  9.  
  10. $tytul='Tytuł strony';
  11. $smarty -> assign('tytul', $tytul);
  12. $smarty->display('includes/header.tpl');
  13. ?>

header.tpl
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <title>{$tytul}</title>
  3. </head>


index.php
  1. <?php
  2.  
  3. require_once('includes/header.php');
  4.  
  5.  
  6. $smarty->assign('tytul', $tytul);
  7. $smarty->assign('test1', $test1);
  8.  
  9. // klikanie
  10. if(isset($_GET['id'])){
  11. switch ($_GET['id']) {
  12. case 1:
  13. $opcja=1;
  14. break;
  15. case 2:
  16. $opcja=2;
  17. break;
  18. case 3:
  19. $opcja=3;
  20. break;
  21. }
  22. }
  23. else{
  24. $opcja="Brak wybranej opcji.";
  25. }
  26. $smarty->assign('cyfra', $opcja);
  27.  
  28. //tablice
  29. $samochody = array(
  30. 'Ford', 'Opel', 'Fiat', 'BMW', 'Mercedes', 'Renault', 'Citroen', 'Volkswagen'
  31. );
  32. $smarty -> assign('samochody', $samochody);
  33.  
  34. //php dla if'ów
  35. if(isset($_GET['id'])) {
  36. $wyb_opcja=$_GET['id'];
  37. }
  38. $smarty -> assign('wyb_opcja', $wyb_opcja);
  39. //display
  40.  
  41.  
  42. $smarty->display('index.tpl');
  43. require_once('includes/footer.php');
  44.  
  45. ?>

index.tpl
  1. {include file='includes/header.tpl'}
  2. <p>Pierwszy tekst pogrubiony:<strong>{$test1|capitalize}</strong></p>
  3. <p><a href="index.php?id=1">1</a> <a href="index.php?id=2">2</a> <a href="index.php?id=3">3</a></p>
  4. <p>Cyfra zależy od kliknięcia: {$cyfra}</p>
  5. <p>Spis samochodów - tablica prosta:</p>
  6. <ul>
  7. {section name=typ loop=$samochody start=1 step=2}
  8. <li>{$smarty.section.typ.iteration} - {$samochody[typ]}</li>
  9. {/section}
  10. </ul>
  11. <p>Wybrana opcja: {if $wyb_opcja==1}1{elseif $wyb_opcja==2}2{elseif $wyb_opcja==3}3{else}0{/if}</p>
  12. {include file='includes/footer.tpl'}




W takim układzie header i footer się 2x wykonuje:/
Shili
Nic dziwnego - wywołujesz je dwa razy.

Jak dwa razy wywołasz w php include(plik) to również jesteś zdziwiony, że masz to na ekranie dwa razy?

Na Twoim miejscu zrobiłabym to tak:
  1. <?php
  2.  
  3. require_once('includes/header.php');
  4.  
  5. // jakiś tam kod
  6.  
  7. require_once('includes/footer.php');
  8. $smarty->display('index.tpl');
  9. ?>

A w header i footer nie wywoływała smarty->display.
robos85
yhm, dzięki za wskazówkę:)

A co do mojego szablonu - takie tworzenie w smarty całego szkieletu jest ok?
Czy można top jakoś lepiej zrobić?
Shili
Cytat
A co do mojego szablonu - takie tworzenie w smarty całego szkieletu jest ok?
Szkieletu czego? Wyglądu?

Jeśli się już zdecydowałeś na smarty (które jest wolne, ale ma zabójczo dobrą pomoc i jest po prostu rozpowszechnione), to tak - w samym wyglądzie strony (plikach .tpl) nie zaleca się już używania php. Po to masz na przykład instrukcje warunkowe, pętle i inne przydatne rzeczy, żeby wszystko było możliwe do osiągnięcia za pomocą smarty i języków "po stronie przeglądarki" winksmiley.jpg
robos85
yhm, a co to znaczy wolne. Czy są jakieś lepsze systemy oddzielania htmla od php?
Jeżeli tak to jakie:). Ale czytałem o smarty i wszyscy zachwalają.
Shili
Smarty jest mocno rozbudowane, obiektowe i tak dalej. To znaczy proste do modyfikacji, dodawania własnych funkcji i modyfikatorów, bardzo wygodne w użytkowaniu, ale szybkością nie zachwyca.

Nie znaczy to oczywiście, że każda strona będzie się ładować latami, ale jednak na wydajności trochę straci.

Najszybsze są szablony macierzyste - czyli zwykłe php, z tym że w plikach z htmlem bardzo okrojone. Są smarty, open power template, można wszystko robić za pomocą xml i xslt i wielu, wielu innych. Uważam jednak, że tak czy siak trzeba choćby podstawy smartów znać - bardzo często są wykorzystywane, głównie w projektach nad którymi pracuje kilka osób.

Uważasz, że smarty są ok - nie ma sprawy, rób w smarty. Jednak warto przy tym wszystkim zdawać sobie sprawę, że będzie to sporo wolniejsze od czystego phpa. I tyle winksmiley.jpg
robos85
Yhm, tylko skoro jest wolna, to czemu tak dużo programistów z niej korzysta?
nospor
przesadzają z tą powolnością. Smarty kompiluje swoje szablony do czystego kodu php wiec ostatecznie to i tak kod php sie wykonuje a nie szablon smartiego.
Oczywiscie w fazie produkcji nalezy ustawic by zawsze kompilowal szablon, ale gdy sie juz aplikacje wystawi na serwer jako ostateczną wersje to nalezy ustawic by kompilowal tylko raz a kazde nastepne odwolanie bylo juz do kodu php.

Ze smarty jak z obiektowką: niby spowalnia ale i tak wszyscy uzywaja. Owszem, każde dodanie nowych rzeczy, bajerow spowalnia wykonywanie skryptu, ale znacznie przyspiesza jego tworzenie i jego czytelnośc. Coś za coś.
robos85
Cytat(nospor @ 6.09.2008, 16:34:53 ) *
przesadzają z tą powolnością. Smarty kompiluje swoje szablony do czystego kodu php wiec ostatecznie to i tak kod php sie wykonuje a nie szablon smartiego.
Oczywiscie w fazie produkcji nalezy ustawic by zawsze kompilowal szablon, ale gdy sie juz aplikacje wystawi na serwer jako ostateczną wersje to nalezy ustawic by kompilowal tylko raz a kazde nastepne odwolanie bylo juz do kodu php.


A jak jest z moim przykładem? Poprawnie? Bo nie wiem gdzie się takie coś ustawia
nospor
Cytat
A jak jest z moim przykładem? Poprawnie?
Pytasz oco? O szablon? No ten na poczatku to byl zly ale nie wiem jak masz teraz bo Shili pare poprawek ci zarzuciła.

Cytat
Bo nie wiem gdzie się takie coś ustawia
To na serwerze by nie kompilowal?
  1. <?php
  2. $smarty->force_compile = ...
  3. $smarty->compile_check = ...
  4. ?>

Doczytaj sobie co tam wstawic by dzialo sie co chcesz winksmiley.jpg
Shili
Cytat
przesadzają z tą powolnością.
Smarty jest jednym z wolniejszych jeśli chodzi o szablony php. Nigdzie nie twierdzę, że jest zły, trzeba to jednak brać czasem pod uwagę. A już szczególnie trzeba o tym wiedzieć, jeśli się chce używać moim zdaniem winksmiley.jpg

Choćby dlatego, że przy wizytówce która ma wszystkiego 5 podstron nie opłaca się dodanie smartów - są lepsze rozwiązania. I w tym przypadku nawet na czytelności niewiele się traci.
grzanka
Poczytaj sobie tą dokumentację: http://www.rzseattle.org/docs/smartypl/ . Jest po polsku i dość przystępnie napisana
nospor
Cytat
Smarty jest jednym z wolniejszych jeśli chodzi o szablony php

Ale mowisz juz o sytuacji gdy smarty ma juz kod w postaci czystego php? A co tam jest wowczas wolniejsze? Przeciez szablonu juz nie parsuje.
Jesli jednak mowisz wlasnie o tym to jakies bencharki masz moze?
robos85
Cytat(nospor @ 6.09.2008, 18:46:35 ) *
Pytasz oco? O szablon? No ten na poczatku to byl zly ale nie wiem jak masz teraz bo Shili pare poprawek ci zarzuciła.

To na serwerze by nie kompilowal?
  1. <?php
  2. $smarty->force_compile = ...
  3. $smarty->compile_check = ...
  4. ?>

Doczytaj sobie co tam wstawic by dzialo sie co chcesz winksmiley.jpg


W tym moim pierwszym kodzie co podałem wprowadziłem tylko zmiany, które podała Shili i teraz działa, tylko pytanie czy to co zrobiłem jest optymalne w miarę.
Co do $compile_check doczytałem, że jest domyślnie na TRUE i taką wartość należy ustawić podczas projektowania, gdy szablon nie jest skończony. Na FALSE należy nastawić gdy szablon jest skończony i gotowy do użytku publicznego.

A co do $force_compile to jest domyślnie na FALSE. Jeżeli jest TRUE wymusza rekompilację szablonu i powinno być na true podczas projektowania - podobnie jak funkcja poprzednia.

Dobrze rozumuję? Jeżeli tak muszę pamiętać, aby $compile_check ustawić na false po opublikowaniu gotowej strony:)


btw. im więcej czytam o smarty, tym bardziej czytelne, łatwiejsze i "użyteczne" się staje:)
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.