Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze smarty, tpl i katalogi
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
Legro
mam glowny katalog mojego skryptu ktory nazywa sie main_script

w tym katalogu mam np. dwa foldery: templates oraz files i jeden plik index.php

jezeli chce zrobic szablon do index.php to tworze w folderze templates plik index.tpl

ale teraz mam problem, bo jak chce :

- w folderze files utworzyc plik files.php
- zrobie w folderze templates folder files i w nim plik files.tpl to to nie dziala

czyli jezeli moj plik php znajduje sie w folderze to ten plik tpl tez sie znajduje w takim samym folderze ktory ma taka sama nazwe..

rozumiecie?

wiec jak to zrobic?
siemakuba
nie bardzo rozumiem problem, a wręcz nie widzę problemu...

załóżmy, że masz takie pliki:
Kod
- templates/index.tpl
- templates/files/files.tpl
- templates/whatever_1/whatever_2/whatever_3/whatever.tpl

i załóżmy jeszcze, że:
  1. <?php
  2. $Smarty->templates_dir = 'templates/';
  3. ?>

to aby kolejno zainkludować te pliki robimy:

Kod
{include file="index.tpl"}
{include file="files/files.tpl"}
{include file="whatever_1/whatever_2/whatever_3/whatever.tpl"}


tak samo zreszta przy kiedy używasz metod Smarty Display() czy Fetch(), podajesz sciezke do pliku z szablonem wzledem twojego $Smarty->templates_dir.

no chyba że nie w tym twój problem...
pozdr.
Legro
Nie nie chodzi mi o includowanie w pliku tpl


mam glowny katalog main_script

a w tym katalogu sa takie foldery:

- files ( w tym folderze plik files.php )
- templates ( w tym folderze mam jeszcze jeden katalog files a wnim plik files.tpl )

plik files.php wyglada tak:

  1. <?php
  2.  
  3. require_once '../c.php';
  4.  
  5. $smarty->display('files/files.tpl');
  6.  
  7. ?>


i nie czyta mi tego pliku files.tpl z tego katalogu templates/files

wyswietla blad:

Warning: Smarty error: unable to read resource: "files/files.tpl" in c:\usr\apache\httpd\html\main_script\smarty\Smarty.class.php on line 1095


o to mi chodzi winksmiley.jpg
ikioloak
Pytanie czy katalog templates masz ustawione jako swoj $template_dir. Jesli tak to wg mnie powinno dzialac tak jak robisz.
Siemakuba nie napisal ci o includowaniu w pliku tpl tylko w ogole. Pisze o tym w ostatnim akapicie swojego wpisu.
Poczytaj jakie sa inne metody na wczytywaniu szablonu, moze rozwiaze to twoj problem: http://smarty.php.net/manual/en/template.resources.php
siemakuba
tak jak pisze ikikolak, powinno działać.
ale chyba wiem czemu nie działa. prawdopodobnie swoja templates_dir masz ustawiona mniej wiecej tak:
  1. <?php
  2. $Smarty->templates_dir = "C:\usr\apache\httpd\html\main_script\templates\";
  3. ?>

kiedy probojesz uzyc szablonu za pomocą
  1. <?php
  2. $smarty->display('files/files.tpl');
  3. ?>

jak w rzeczywistosci bedzie wygladac sciezka do pliku?
Kod
C:\usr\apache\httpd\html\main_script\templates\files/files.tpl

zwroc teraz szczegolna uwage na ten fragment: templates\files/files.tpl
takiej sciezki chyba php nie da rady odczytac.

hint ode mnie: w windowsie mozesz usywac zarowno \ jak i / do okreslania sciezek do pliku. kiedy polaczysz to z wiedza, ze w unixie musisz uzywac / - robi sie dosc uniwersalnie, rajt?

podsumowujac:
  1. <?php
  2. $Smarty->templates_dir = "C:/usr/apache/httpd/html/main_script/templates/";
  3. ?>

powinno dac rade

pozdr.
Legro
nie dziala... ale juz chyba wiem dlaczego...

nazwe glownego katalogu skryptu pobieram przez:

  1. <?php
  2. define ('SCRIPT_PATCH_DIR', dirname ( __FILE__ ) . '/');
  3. ?>


czego wynikiem jest:

c:\usr\apache\httpd\html\main_script/


jest to sciezka podana z dysku i ukosniki sa odwrtotnie polozone

na na localhoscie ta sciezka pokazuje z takimi : \
a na zwyklym serwie (chyba!!!!) z takimi : /

jak to mozna zrobic?

moze da sie zastapic dirname czyms innym questionmark.gif
siemakuba
Cytat
moze da sie zastapic dirname czyms innym ??

ja zdecydowanie i upracie używam:
  1. <?php
  2. define('ROOT_PATH', 'E:/www root/');
  3. ?>

nie mialem jeszcze problemow ze sciezkami. A ze nie ustawia sie autmagicznie jak w przypadku dirname? no przeciez sam uzywasz tego jako stalej, stala = niezmienna. nawet przy zalozeniu ze projektujesz na innej maszynie / w innym srodowisku a wersja produkcyjna stoi finalnie gdzie indziej, to jest ustawienie *tylko jednej* stalej w jakims configu.

pozdr.
Legro
nawet jak dalem:

ten kod $smarty -> templates_dir......

to nie dziala ciagle ten sam blad..
siemakuba
oko, moze cos innego gdzies miesza. daj więcej kodu, ten gdzie masz definicje stalych, tam gdzie masz definicje Smarty->templates_dir i tam gdzie wywolujesz Smarty->display();

P.S. przepraszam, ale sprawdz czy ten plik faktycznie istnieje, i czy przypadkiem ma jakas tresc. Smarty zdaje sie powie ze nie ma pliku jezeli ten jest zerowej wielkosci.

pozdr.
Legro
plik istnieje, i dane tez w nim mam...

a oto troche kodu:

plik c.php (jest w glownym katalogu skryptu):

  1. <?php
  2. define ('SCRIPT_PATCH_DIR', 'c:/usr/apache/httpd/html/main_script/');
  3. define ('SMARTY_DIR', SCRIPT_PATCH_DIR . 'smarty/');
  4. define ('SMARTY_TEMPLATES', SCRIPT_PATCH_DIR . 'templates/');
  5. define ('SMARTY_CACHE', SCRIPT_PATCH_DIR . 'cache/'); 
  6. define ('SMARTY_TEMPLATES_C', SCRIPT_PATCH_DIR . 'templates_c/');
  7. define ('SMARTY_CONFIGS', SCRIPT_PATCH_DIR . 'configs/');
  8.  
  9. require_once ( 'conf.php' );
  10. require_once ( SMARTY_DIR . 'Smarty.class.php' );
  11.  
  12. $smarty = new Smarty;
  13.  
  14. ?>


plik conf.php ( jest w glownym katalogu skryptu): mam w nim dane do bazy danych i polaczenie z baza...

przykladowy plik files/files.php

  1. <?php
  2.  
  3. require_once '../c.php';
  4.  
  5. $smarty -> display ('files/files.tpl');
  6.  
  7. ?>


pozdrawiam.
siemakuba
Smarty Manual:
Cytat
$template_dir
This is the name of the default template directory. If you do not supply a resource type when including files, they will be found here. By default this is "./templates", meaning that it will look for the templates directory in the same directory as the executing php script.

wyjaśniam nam, dlaczego zadziała ci wywolanie z pliku index.php a dlaczego nie zadziała z files/files.php.

zmień tak:
  1. <?php
  2.  
  3. $smarty = new Smarty;
  4. $smarty->template_dir = SMARTY_TEMPLATES;
  5.  
  6. ?>


P.S. sorki, troche to mea culpa, ze tak sie nam watek rozciagnal... wczesniej widze przez omylke uzywalem caly czas $smarty->templates_dir. Byc moze gdyby nie ta omylka rozwiazanie znalazlo by sie wczesniej.

pozdr.
Legro
OK. Dzieki za pomoc. Ale teraz wyskoczyl inny blad:

Cytat
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist, or is not a directory. in c:\usr\apache\httpd\html\main_script\smarty\Smarty.class.php on line 1095


A przeciez taki folder mam stworzony w glownym katalogu skryptu :/




EDIT snitch.gif>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ok dodalem jeszcze
$smarty -> compile_dir = SMARTY_TEMPLATES_C;

i dziala smile.gifsmile.gif)smile.gif:


tylko teraz mam problem znowu bo jak skrypt wgram na serwer to sciezka nie bedzie taka: c:\usr\apache\httpd\html\main_script\

tak wiec jak zrobic aby podac glowny katalog skryptu questionmark.gif
siemakuba
damn kurcze blade,
no przeca zmienić tu na odpowiednią ścieżkę, np. /home/legro/www/
  1. <?php
  2. define ('SCRIPT_PATCH_DIR', '/home/legro/www/');
  3. ?>

;)
w ostateczności, jak jesteś maxymalnym leniuchem albo często przerzucasz pliki między lokalnym serwerem a serwerem gdzieś inedziej, zrób tak: (zakładając, że w domu masz WIN a zdalnie unix)

  1. <?php
  2. if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') 
  3. {
  4.  define('SCRIPT_PATCH_DIR', 'c:/usr/httpd/itd.');
  5. } 
  6. else 
  7. {
  8. define ('SCRIPT_PATCH_DIR', '/home/legro/www/');
  9. }
  10. ?>


pozdr.
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.