Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SMARTY] Odwoływanie się do .tpl
GreenGo
post 25.03.2008, 18:38:32
Post #1





Grupa: Zarejestrowani
Postów: 265
Pomógł: 4
Dołączył: 30.08.2004

Ostrzeżenie: (0%)
-----


Witam.
Mam mniej więcej taka strukturę katalogów:

smart/libs/Smarty.class.php
smarty/page/index.php
smarty/page/template/index.tpl


w index.php mam wczytanie klasy Smarty i odwołanie się do index.tpl. Wszystko działa ładnie ale jak przeniosę plik index.php do np.
smart/page/modules/index.php
i oczywiścię zmienie ścieżkę do klasy Smarty to już mi nie czyta pliku index.tpl :/ dlaczego tak jest ?

Z góry dzięki za pomoc, pozdrawiam.

Ten post edytował GreenGo 25.03.2008, 18:41:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
phpion
post 25.03.2008, 18:43:44
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Dodatkowo musisz zmienić ścieżki do odpowiednich katalogów. Najlepiej jeśli rozszerzysz klasę Smarty np. w ten sposób:
http://www.smarty.net/manual/en/installing...ty.extended.php
Go to the top of the page
+Quote Post
GreenGo
post 27.03.2008, 22:08:54
Post #3





Grupa: Zarejestrowani
Postów: 265
Pomógł: 4
Dołączył: 30.08.2004

Ostrzeżenie: (0%)
-----


Coś chyba robie źle :/
Oto drzewko katalogów:

Plik index.php mam w klatlogu smarty/alko/modules/index.php
plik setup.php mam w smart/alko/setup.php

index.php
  1. <?
  2.  
  3. if( $userdata['session_logged_in'] AND $userdata['username'] == "Green" )
  4. {
  5. $name = $_GET['name'] ;
  6. if(empty($name)) {
  7.  
  8.  } else {
  9.  include "admin_mod/admin_$name.php";
  10.  }
  11.  }else {echo"lipa";}
  12.  
  13. require('../setup.php');
  14. $smarty = new Smarty_Setup;
  15. $smarty -> assign('title', 'tytul');
  16. $smarty -> assign('meta1', '<meta name="description" content="Panel Administracyjny" />');
  17. $smarty -> assign('meta2', '<meta name="description" content="Panel Administracyjny" />');
  18. $smarty -> assign('meta3', '<meta name="keywords" content="Panel Administracyjny" />');
  19. $smarty -> assign('css', '<link rel="stylesheet" type="text/css" href="style.css" />');
  20.  
  21. $smarty -> display('admin_overall_header.tpl');
  22. ?>


setup.php
  1. <?php
  2.  
  3. require('../../libs/Smarty.class.php');
  4.  
  5. class Smarty_Setup extends Smarty {
  6.  
  7.  function Smarty_Setup()
  8.  {
  9.  
  10. $this->Smarty();
  11.  
  12. $this->template_dir = '/templates/';
  13. $this->compile_dir = '/templates_c/';
  14. $this->config_dir  = '/configs/';
  15. $this->cache_dir = '/cache/';
  16.  
  17. $this->caching = true;
  18. $this->assign('app_name', 'Guest Book');
  19.  }
  20.  
  21. }
  22. ?>

No i nie działa.
Byłbym wdzięczny za pomoc smile.gif
Go to the top of the page
+Quote Post
tiraeth
post 27.03.2008, 22:27:30
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Po pierwsze, zdecyduj się. Katalog ze Smarty to smart, smarty czy Smarty?

Po drugie, zarówno require jak i include dołącza kod PHP. Dla przykładu:

Kod
- Directory
-- Subdirectory
---- index.php
-- setup.php
- Directory2
-- config.php


Jeśli w pliku setup.php ustawisz: include('../Directory2/config.php') i otworzysz w przeglądarce http://localhost/Directory/setup.php, to poprawnie załaduje się plik config.php.

Jeśli potem plik setup.php dołączysz do index.php z Directory/Subdirectory, to PHP będzie szukało config.php w Directory/config.php, czyli ../ względem Subdirectory. Te dwie kropeczki oznaczają katalog wyżej, tak jak w linii komend (tudzież w konsoli) wpisujesz cd .., aby przejść do foldera wyżej.

Najlepszym rozwiązaniem jest zastosowanie takiego myku:
Directory/Subdirectory/index.php
  1. <?php
  2. /* Sciezka do katalogu glownego aplikacji
  3.  * ----
  4.  * /Directory/Subdirectory/ ---> /Directory/ ---> /
  5.  */
  6.  $sRootDir = '../../';
  7.  include( '../setup.php' );
  8.  // Mozna takze:
  9.  // include( $sRootDir . 'Directory/setup.php' );
  10. ?>

Directory/setup.php
  1. <?php
  2.  if ( !isset($sRootDir) ) {
  3. /* Jesli nie ustawiono przed zaincludowaniem tego pliku nigdzie zmiennej $sRootDi
    r, to ja ustawimy, tak aby pasowala do obecnej sciezki
  4.    * ----
  5.    * /Directory/ ---> /
  6.    */
  7.  $sRootDir = '../';
  8.  }
  9.  include( $sRootDir . 'Directory2/config.php' );
  10. ?>

Directory2/config.php
  1. <?php
  2. echo 'Hello world!';
  3. ?>


Teraz zadziała, zarówno jak w przeglądarce wywołasz http://localhost/Directory/setup.php jak i http://localhost/Directory/Subdirectory/index.php. Wynikiem powinno być Hello World!.

Pisane z palca, powinno działać. Jak pomogło zrozumieć - jest taki przycisk obok posta...
Go to the top of the page
+Quote Post
GreenGo
post 27.03.2008, 23:48:09
Post #5





Grupa: Zarejestrowani
Postów: 265
Pomógł: 4
Dołączył: 30.08.2004

Ostrzeżenie: (0%)
-----


Dzięki tiraeth, sie napracowałeś ale to to ja już doskonale wiem smile.gif
Dlatego właśnie nie wiem co jest źle w tym co ja robie, niby wszystkie pliki i klasa smart się odnajdują czyli ścieżki do plików są ok, ale informacje się nie przekazują do .tpl :/

nie za bardzo rozumiem po co jest w setup.php to
  1. <?php
  2. $this->caching = true;
  3. $this->assign('app_name', 'Guest Book');
  4. ?>

i nie wiem czy te lokalizacje są dobrze podane
  1. <?php
  2. $this->template_dir = '/templates/';
  3. $this->compile_dir = '/templates_c/';
  4. ?>


Pozdrawiam smile.gif
Go to the top of the page
+Quote Post
Zyx
post 28.03.2008, 09:14:16
Post #6





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Nie przekazują się, ponieważ nie utworzyłeś jeszcze obiektu parsera. Zobacz: masz linijkę:

Kod
include "admin_mod/admin_$name.php";


A teraz popatrz, w którym miejscu wywołujesz to:

Kod
$smarty = new Smarty_Setup;


Jest to parę linijek niżej, zatem najpierw dołączasz i wykonujesz szablon, który próbuje dodać dane do nieistniejącego parsera, który tworzysz dopiero po fakcie. Zasada jest prosta: wszelkie inicjacje, setupy itd., które ustawiają rzeczy niezbędne modułowi do pracy, muszą wykonać się przed jego uruchomieniem, a nie po nim smile.gif.

Jeszcze ad. zarządzania ścieżkami w skrypcie. Kodując je na sztywno, bardzo szybko się w nich pogubisz. Ja stosuję bardzo proste i skuteczne rozwiązanie. Obieram sobie zawsze pewien katalog i podaję wszystkie ścieżki względem niego. Katalogiem tym jest najczęściej katalog główny projektu. W Twoim przypadku wyglądałoby to następująco: Twoim katalogiem głównym jest Smarty. Jeżeli masz skrypt w katalogu smarty/alko/modules/index.php i chcesz z jego poziomu dołączyć smart/alko/setup.php, nie piszesz ../setup.php, tylko ../../../alko/setup.php (najpierw wyskakujemy do wnętrza głównego katalogu i dopiero z niego schodzimy z powrotem w głącool.gif. Na początku to wygląda na mocno kombinowane, ale to głównie dlatego, że strasznie głęboko zagrzebałeś pliki, które internauci będą uruchamiali z przeglądarki smile.gif.

Ścieżek nigdy nie koduję w skrypcie bezpośrednio. Zawsze tworzę jeden plik zwany common.php albo bootstrap.php, który na początku tworzy stałe ze wszystkimi ścieżkami względem głównego katalogu, ładuje wszystkie potrzebne pliki i tworzy obiekty. Dopiero po jego wykonaniu sterowanie wraca do modułu czy czego tam chcesz.

Przykładzik. Mamy główny katalog w /projekt, zaś z przeglądarki jest dostęp do katalogu /projekt/www. Bezpośrednio w katalogu głównym mamy bootstrap.php:

Kod
<?php

define('DIR_WWW', DIR_MAIN.'www/');
define('DIR_LIBS', DIR_MAIN.'libs/');
define('DIR_SMARTY', DIR_LIBS.'smarty/');
define('DIR_TEMPLATES', DIR_MAIN.'templates/');

// i tak jeszcze trochę

require(DIR_LIBS.'biblioteka1.php');
require(DIR_LIBS.'biblioteka2.php');
require(DIR_SMARTY.'smarty.class.php');

// tworzymy obiekty

$tpl = new Smarty_Setup;
$costaminnego = new CosTamInnego;

?>


Teraz w projekt/www/ mamy index.php:

Kod
<?php
// Pokazujemy, jak z pliku index.php trafić do katalogu głównego
define('DIR_MAIN', '../');
require(DIR_MAIN.'bootstrap.php');

// W tym momencie mamy zainicjowane wszystkie biblioteki
// Oraz mamy stałe dające nam łatwy dostęp do wszystkich katalogów.
// mozemy wiec przystapic do generowania zawartosci strony

require(DIR_MODULES.'jakis_modul.php');

$tpl -> display('o_matko_to_dziala.tpl');
?>


Tak więc podsumowując:
1. Plik index.php oraz każdy inny uruchamiany z przeglądarki musi wiedzieć dwie rzeczy: gdzie jest bootstrap.php oraz jak trafić do katalogu głównego.
2. Bootstrap.php musi wiedzieć, gdzie leżą wszystkie pliki, patrząc z głównego katalogu.
3. Index.php uruchamia bootstrapa i mówi mu, gdzie się znajduje.
3. Bootstrap.php w odpowiedzi przekazuje mu informacje o położeniu wszystkich innych plików uwzględniające lokalizację index.php, a także tworzy środowisko do pracy.

Są też inne techniki, np. z wykorzystaniem include_path.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:03