Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [smarty] Problem z includowaniem :/
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
iMax
Witam, zaczne od pokoazania jak wyglada uklad mojej strony:

index.php
  1. <?php
  2. require...
  3. require...
  4. require...
  5.  
  6.  
  7. if(isset($_GET['act']))
  8. {
  9. switch($_GET['act'])
  10. {
  11. case 'news' : $site = 'news';
  12. break;
  13. .......
  14. .......
  15. default : $site = 'news';
  16. break;
  17. }
  18. }
  19. else
  20. {
  21. $site = 'news';
  22. }
  23.  
  24. $smarty = new Smarty;  
  25. $smarty->assign('site', $site);
  26. $smarty->display('index.tpl');
  27.  
  28. ?>


index.tpl
  1. <?php
  2. <td //ustawienia">{include_php file="menu.php"}</td>
  3. <td //ustawienia">
  4. {if $site eq "news"}
  5.  
  6. {include_php file="news.php"}
  7.  
  8. {elseif ......
  9. ..........
  10. ..........
  11. ..........
  12.  
  13. {/if} </td>
  14. <td //ustawienia>{include_php file="login.php"}</td>
  15. ?>


Funkcja require wczytuje mniedzy innymi takie pliki jak ten glowny plik od smartow, polaczenie z baza czy funkcje... W napisanych skryptach nie uzywam require, poniewaz zawsze beda wczytywanie poprzez index, a tam sa juz owe requiry. Wszystko pieknie dzialalo do czasu, az zaczalem tworzyc skrypt logowania. Sam skrypt logowania potrzebowal pliku laczenia z baza, z funkcjami i smartami, ale mam jeszcze jeden plik rozpoczynajacy sesje i nadajacy kilka zmiennych globalnych, ale jak ten plik umieszcze w index require to nie dziala jak nalezy..., czyli tak jakby byl wczytany bezposrednio do skryptu logowania. Tego pliku bedzie potrzebowalo jeszcze kilka innych skryptow...
Co robic? Uzywac require z tym plikiem w kazdym skrypcie wymagajacym go?
JoShiMa
A dlaczego chcesz inkludować php do szablonu? Idea szablonu powstała po to, żebyś to co masz załatwić w php załatwił to najpierw a potem dopiero przekazał dane do szablonu i je wyświetlił. A Ty na dodatek mieszając z powrotem to co miało być rozdzielone to jeszcze, z tego co rozumiem wczytujesz gdzieś w środku skrypt, który Ci otwiera sesje. Kompletny bałagan robisz.
iMax
To jak proponujesz zrobic uklad strony w smarty tak, aby po bokach bylo menu, u gory logo, a na dole stopka, a w zeby w srodku byly wyswietlane wszystkie podstrony?
JoShiMa
Normalnie. O tym jaka ma być podstrona decyduję w obrębie php i informację podaję do skryptu, który ewentualnie includuje odpowiedni plik tpl w miejsce podstrony jeśli podstrony mają różne budowy.

Popatrz sobie na bicykle.pl/index09.php Tak właśnie to realizuję.

index tpl zawiera szkielet strony. Dostaje info o tym jaki dział się ma wyświetlić. Wczytuje tpl odpowiedniego dla tego działu menu lewego i odpowiednie tpl dla zawartości w zależności jakie informacje dostanie.

W szablonach smarty mam tylko pętle warunki i includowanie innych tpl. Żadnego kodu php. Grunt to dobrze przemyśleć tworzenie struktury danych wsadowych dla szablonu i ich obsługę w samym szablonie.
iMax
Zastosowalem twoj sposob, ale mam jeszcze 2 pytania.
1: Np. w pliku news.php mialem w petli while
  1. <?php
  2. $smarty = new Smarty;
  3. $smarty->assign...
  4. zmienne
  5. .....
  6. $smarty->display('news.tpl');
  7. ?>

i te zmienne przekazywaly do news.tpl wszystkie zmienne do wyswietlenia (tytul, tresc, itp...), a ze skoro to bylo w petli to sie wyswietlaly wszystkie newsy. Teraz w news.php ucialem new smarty i display a zostawilem same assign, bo index.php wyglada tak:
  1. <?php
  2. $smarty = new Smarty;
  3. if(isset($_GET['act']))
  4. {
  5. switch($_GET['act'])
  6. {
  7. case 'news': 
  8. include ('news.php');
  9. $smarty->assign('site', 'news.tpl');
  10. break;
  11.  
  12.  cos tam....
  13.  
  14. }
  15. }
  16. else
  17. {
  18. cos tam....
  19. }
  20.  
  21. $smarty->display('index.tpl');
  22. ?>

a index.tpl krótko, zawiera na srodku {include file="$site"}

..i wyswietla sie tylko jeden news. Troche pokopane, no ale moze sa inne sposoby ;/

2: Jak umieszcze w index.tpl, aby wyswietlalo np. menu.tpl - to wyswietla sam szablon, bo niby jak ma sie zaladowac menu.php?
JoShiMa
Cytat(iMax @ 22.07.2008, 13:45:48 ) *
..i wyswietla sie tylko jeden news. Troche pokopane, no ale moze sa inne sposoby ;/

No pewnie, że wyświetli się jeden, bo przekazujesz tylko jeden. Jak przekażesz tablicę newsów to w pętli wczytasz tyle razy news.tpl z odpowiednimi parametrami ile razy Ci to będzie potrzebne smile.gif to znaczy tyle ile newsów.

Cytat(iMax @ 22.07.2008, 13:45:48 ) *
2: Jak umieszcze w index.tpl, aby wyswietlalo np. menu.tpl - to wyswietla sam szablon, bo niby jak ma sie zaladowac menu.php?

No nie ma się załadować. menu.php uruchamiasz robisz w obrębie działania twoich skryptów php, wstrzykujesz do szablony dane dla menu a potem w szablonie wczytujesz tpl menu, który te dane zinterpretuje i pokaże to co należy.
iMax
Znowu mam problem tongue.gif
Nie moge przekazac tablicy newsow w taki sposob (akurat pokazuje na przykladzie innego skryptu)...
  1. <?php
  2. $sources=array();
  3. $sql="SELECT * FROM news_sources ORDER BY sourceID DESC";
  4. $result=mysql_query($sql) or die(mysql_error());
  5. while($source=mysql_fetch_array($result))
  6. {
  7. $sources[]=$source;
  8. }
  9. $smarty->assign('sources', $sources);
  10. $smarty->display('news_sources.tpl');
  11. ?>

i
tpl
  1. <ol>
  2. {section name=idx loop=$sources}
  3. <li>{$sources[idx].link} <a href="news.php?act=delsource&id={$sources[idx].sourceID}">usuń</a></li>
  4. {/section}
  5. </ol>

... pomimo ze to dziala dobrze, bo wczesniej musze zastosowac kilka funkcji na zmiennych z bazym, a potem dopiero moge przekazc szablonowi.
Co robic? Mecze sie z tym juz pare godz...

EDIT:
zrobilem cos takiego i dziala:
  1. <?php
  2. $sor=array();
  3. $sources=array();
  4. $sql="SELECT * FROM news_sources ORDER BY sourceID DESC";
  5. $result=mysql_query($sql) or die(mysql_error());
  6. while($source=mysql_fetch_array($result))
  7. {
  8. $sor['link']=$source['link'];
  9. $sor['sourceID']=$source['sourceID'];
  10. $sources[]=$sor;
  11. }
  12. $smarty->assign('sources', $sources);
  13. $smarty->display('news_sources.tpl');
  14. ?>

...ale wedlug mnie kod wyglada nieestetycznie haha.gif Moze jakos inaczej to zapisac?
decha-design
zamień while na foreach ... do smarty moim zdaniem jest lepsza ... to samo w *.tpl zamiast section używaj foreach ...

przynajmniej ja tak robie, 0 problemów ...
JoShiMa
Cytat(decha-design @ 22.07.2008, 22:24:35 ) *
zamień while na foreach ... do smarty moim zdaniem jest lepsza ... to samo w *.tpl zamiast section używaj foreach ...

przynajmniej ja tak robie, 0 problemów ...

Dwie bzdury. foreach jest dobra w jednych przypadkach a while (w php) i section (w tpl) w innych Foreach jest typową pętlą do tablic asocjacyjnych i nie ma sensu stosowac jej na siłę do zwykłych tablic.

iMax Nie wydaje Ci się, że ten kod jest sensowniejszy niż to co miałeś do tej pory, czyli poplątanie z pomieszaniem? Clou tkwi w dobrej konstrukcji danych wsadowych tak, alby łatwo je było wyświetlić w formularzu bez zbędnych przekształceń, które można wykonać wcześniej w php.

A jak chcesz, żeby było jeszcze ładniej i bardziej elastycznie daj:
  1. <?php
  2. $sor['tpl']='news_sources.tpl'
  3. ?>


Wtedy do tablicy $sources[] będziesz mógł dodawać różne sekcje o różnych podszablonach i wszystkie obsługiwać jedną pętlą section.
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.