Piszę właśnie aplikację z zastosowaniem wzorca MVC i z obsługą smarty i napotkałem pewien problem, z którym nie bardzo jestem w stanie sobie poradzić.
Struktura katalogów i plików wygląda tak:
--ROOT
|
+-controller (frontcontroller.php + inne kontrolery)
+-model
+view (test.tpl)
+libs/smarty
|
-index.php
W pliku index.php mam "include" wszystkich klas z katalogów powyżej (poza view), a także wywołanie klasy FrontController
W pliku frontcontroller.php klasa FrontController dziedziczy po klasie Smarty.
I teraz jeśli napiszę klasę tak:
<?php class FrontController extends Smarty { public function __construct() { $this -> template_dir = ROOT_PATH."/view/"; $this -> compile_dir = ROOT_PATH.'/libs/smarty/templates_c/'; $this -> config_dir = ROOT_PATH.'/libs/smarty/configs/'; $this -> cache_dir = ROOT_PATH.'/libs/smarty/cache/'; $this -> display('test.tpl') } } ?>
To plik test.tpl zostaje załadowany poprawnie.
Ale chciałbym aby zamiast wpisywania w każdej klasie ścieżek do ładowania smart zastosować jedną klasę, np.
<?php class LoadSmarty extends Smarty { public function __construct() { $this -> template_dir = ROOT_PATH."/view/"; $this -> compile_dir = ROOT_PATH.'/libs/smarty/templates_c/'; $this -> config_dir = ROOT_PATH.'/libs/smarty/configs/'; $this -> cache_dir = ROOT_PATH.'/libs/smarty/cache/'; } } ?>
frontcontroller.php
<?php class FrontController extends Smarty { public function __construct() { $display = new LoadSmarty(); $display -> display('test.tpl') } } ?>
Problem polega na tym, że jeżeli zastosuję ten sposób to w kontrolerze, który ma wywołać dany template pojawia się komunikat:
Warning: Smarty error: unable to read resource: "test.tpl" in ..//libs/smarty/Smarty.class.php on line 1092
I jeszcze mam pytanie, czy jest jakiś sposób aby obejść ładowanie smarty do każdej klasy z osobna, tylko załadować raz i mieć to z głowy.
P.S. Piszę z "palca" z pracy więc gdzieś w kodzie mogą być błędy.