Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [smarty 3]
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
Flaku
Witam,

Próbuję zrobić coś własnego jakiś mały cms... chciał bym w nim wykorzystać smarty 3 zrobiłem coś takiego:

plik index.php

  1. /**
  2.  * Initialize the system
  3.  */
  4. define('S6X_MODE', 'FE');
  5. require('system' . DIRECTORY_SEPARATOR .'initialize.php');
  6.  
  7.  
  8. /**
  9.  * Class Index
  10.  */
  11. class Index
  12. {
  13. /**
  14. * Initialize the object
  15. */
  16. public function __construct()
  17. {
  18.  
  19. }
  20.  
  21. /**
  22. * Run the controller
  23. */
  24. public function run()
  25. {
  26. global $objTpl;
  27.  
  28. $objTpl->assign('name','Johny');
  29.  
  30. $objTpl->display('index.tpl');
  31. }
  32. }
  33.  
  34. /**
  35.  * Instantiate controller
  36.  */
  37. $objIndex = new Index();
  38. $objIndex->run();


plik initialize.php:


  1. **
  2. * Define root path to Synthx installation
  3. */
  4. define('DS', DIRECTORY_SEPARATOR);
  5. define('S6X_ROOT', dirname(dirname(__FILE__)) . DS);
  6.  
  7. /**
  8.  * Include functions, constants and interfaces
  9.  */
  10. require(S6X_ROOT . 'system' . DS . 'functions.php');
  11. require(S6X_ROOT . 'system' . DS . 'constants.php');
  12. require(S6X_ROOT . 'system' . DS . 'interface.php');
  13.  
  14.  
  15. /**
  16.  * Load the Smarty class file and create an instance.
  17.  */
  18. require(S6X_ROOT . 'plugins' . DS . 'smarty' . DS . 'Smarty.class.php');
  19.  
  20. $objTpl = new Smarty();
  21. $objTpl->setTemplateDir(S6X_ROOT . 'templates' . DS);
  22. $objTpl->setCompileDir(S6X_ROOT . 'templates_c' . DS);
  23. $objTpl->setConfigDir(S6X_ROOT . 'system' . DS . 'config' . DS);
  24. $objTpl->setCacheDir(S6X_ROOT . 'system' . DS . 'tmp' . DS);
  25. $objTpl->left_delimiter = '<!--{';
  26. $objTpl->right_delimiter = '}-->';
  27. $objTpl->debugging = true;
  28. $objTpl->caching = true;
  29. $objTpl->cache_lifetime = '120';
  30. //$objTpl->testInstall();


i mam problem z wczytaniem szablonu... Błąd HTTP 500 (Internal Server Error). Kiedy wklejam do pliku initialize.php dwie linijki z pliku index.php odpowiadające za wyświetlanie szablonu wszystko jest ok... ale takie rozwiązanie mnie nie urządza. Jak to można rozwiązać? Co robię źle może źle wczytuję zmienna do pliku index że jej tam nie widzi?

Z góry dziękuję za pomoc.
mortus
Dlaczego nie skorzystasz z DI (dependency injection), czyli wstrzykiwania zależności? Skoro Smarty ma być systemem szablonów obsługującym cały Twój system, to naturalną rzeczą wydaję się umieszczenie obiektu klasy Smarty wewnątrz klasy Indeks ("uzależnienie" klasy Index od klasy Smarty), czy jakiejś innej klasy głównej/zarządzającej całym systemem szablonów.
  1. class Index {
  2. private $_template;
  3. public function __construct() {
  4. $this->_template = new Smarty();
  5. // tutaj konfigurujemy
  6. }
  7. public function run() {
  8. $this->_template->assign('name', 'Johny');
  9. $this->_template->display('index.tpl');
  10. }
  11. }
Flaku
No tak, tylko teraz jak będę mieć np plik news.php który będzie się wczytywać bezpośrednio będę musiał w nim zrobić to samo... i kiedy przyjdzie mi edytować coś odnośnie smarty będę musiał edytować wszystkie te pliki. Chciałem to zrobić tak że w każdym pliku który będzie wyświetlany bezpośrednio będzie wczytywany plik z ustawieniami typy obiekt z klasa smarty i kiedy przyjdzie mi coś edytować będę robić to tylko w pliku z ustawieniami i działać będzie wszędzie... Dla tego tak tego nie zrobiłem. Ale dziwi mnie to że mój sposób nie działa ;/
mortus
Myślałem, że ta klasa Index, to jest taki punkt wspólny (FrontController) dla całej aplikacji, czyli miejsce, w którym aplikacja rozpoczyna pracę. Tymczasem kolega z tego wzorca jednak nie korzysta. W takim razie proponuję przekazywać obiekt klasy Smarty jako argument konstruktora.
  1. define('S6X_MODE', 'FE');
  2. require('system' . DIRECTORY_SEPARATOR .'initialize.php');
  3. class Index {
  4. private $_template;
  5. public function __construct($template) {
  6. $this->_template = $template;
  7. }
  8. public function run() {
  9. $this->_template->assign('name', 'Johny');
  10. $this->_template->display('index.tpl');
  11. }
  12. }
  13. $index = new Index($objTpl);
  14. $index->run();


Już teraz jednak warto się zastanowić nad architekturą całego system i przemyśleć podejście, bo nie wiem, czy jest ono słuszne (choć do jego oceny musiałbym całą specyfikację systemu poznać).
Flaku
Ten sposób zwraca taki sam błąd jak ten który napisałem w pierwszym poście:

  1. define('S6X_MODE', 'FE');
  2. require('system' . DIRECTORY_SEPARATOR . 'initialize.php');
  3.  
  4. class Index
  5. {
  6. private $Template;
  7.  
  8. public function __construct($objTpl)
  9. {
  10. $this->Template = $objTpl;
  11. }
  12.  
  13. public function run()
  14. {
  15. $this->Template->assign('name','Johny');
  16.  
  17. $this->Template->display('index.tpl');
  18. }
  19. }
  20.  
  21. $objIndex = new Index($objTpl);
  22. $objIndex->run();
Crozin
@mortus: To co pokazałeś w swoim pierwszym poście to dokładna odwrotność dependency injection. Zaś to co pokazałeś w drugim to właśnie DI.

Cytat
i mam problem z wczytaniem szablonu... Błąd HTTP 500 (Internal Server Error).
Masz tak skonfigurowany serwer, że w przypadku błędu wyświetla taką stronę. Sprawdź logi.
Flaku
W logach niestety nie jest nic konkretnego napisane... tylko godzina, plik i wyszukiwarka.
mortus
Cytat(Crozin @ 7.03.2012, 15:28:18 ) *
@mortus: To co pokazałeś w swoim pierwszym poście to dokładna odwrotność dependency injection. Zaś to co pokazałeś w drugim to właśnie DI.


Zgadza się, pomyliłem określenia. Zatem gwoli sprostownia:
Dependency Non-Injection:
  1. class Index {
  2. protected $_template;
  3. public function __construct() {
  4. $this->_template = new Smarty();
  5. // tutaj konfigurujemy
  6. }
  7. public function run() {
  8. $this->_template->assign('name', 'Johny');
  9. $this->_template->display('index.tpl');
  10. }
  11. }

Depenedncy Injection:
  1. class Index {
  2. protected $_template;
  3. public function __construct($template) {
  4. $this->_template = $template;
  5. }
  6. public function run() {
  7. $this->_template->assign('name', 'Johny');
  8. $this->_template->display('index.tpl');
  9. }
  10. }


Niemniej jednak wszystkie trzy (uwzględniając global) sposoby powinny działać. Włącz wyświetlanie i raportowanie wszystkich błędów skryptu PHP (na początku pliku index.php):
  1. ini_set('display_errors', 'on');

Jeśli w głównym katalogu aplikacji masz plik .htaccess (ten sam katalog, w którym jest plik index.php), to spróbuj go tymczasowo usunąć (może któraś z reguł coś psuje).
Sprawdź dokładnie logi serwera, bo jakaś wzmianka o błędzie powinna się tam znaleźć.
Flaku
Jest błąd:

  1. Fatal error: Class 'Config' not found in /../system/initialize.php on line 62


W tej linijce jest obiekt:

  1. $objConfig = Config::getInstance();


Klasa Config jest wczytana automatycznie w piku functions.php który jest wczytywany na samym początku pliku initialize.php przez obiektem smarty. Próbowałem dać obiekt smarty za obiekt Config i wszystko działa ale dla czego nie chce go wczytywać kiedy obiekt smarty jest przed obiektem Config ?:/ coś tam chyba w smarty jest pokręcone?
mortus
Ciężko cokolwiek powiedzieć nie mając zielonego pojęcia o tym, jak wygląda kod, który powoduje problemy. Może to wina Smarty, a może i nie.
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-2024 Invision Power Services, Inc.