Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [smarty 3]
Flaku
post 7.03.2012, 12:27:19
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005
Skąd: Częstochowa

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


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.

Ten post edytował Flaku 7.03.2012, 12:28:00
Go to the top of the page
+Quote Post
mortus
post 7.03.2012, 13:16:43
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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


Ten post edytował mortus 7.03.2012, 13:17:22
Go to the top of the page
+Quote Post
Flaku
post 7.03.2012, 13:51:33
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005
Skąd: Częstochowa

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


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 ;/
Go to the top of the page
+Quote Post
mortus
post 7.03.2012, 14:03:56
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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ć).

Ten post edytował mortus 7.03.2012, 14:04:52
Go to the top of the page
+Quote Post
Flaku
post 7.03.2012, 14:19:46
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005
Skąd: Częstochowa

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


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();


Ten post edytował Flaku 7.03.2012, 14:20:05
Go to the top of the page
+Quote Post
Crozin
post 7.03.2012, 15:28:18
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@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.
Go to the top of the page
+Quote Post
Flaku
post 7.03.2012, 15:36:51
Post #7





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005
Skąd: Częstochowa

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


W logach niestety nie jest nic konkretnego napisane... tylko godzina, plik i wyszukiwarka.
Go to the top of the page
+Quote Post
mortus
post 7.03.2012, 23:15:29
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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źć.
Go to the top of the page
+Quote Post
Flaku
post 8.03.2012, 08:38:00
Post #9





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 2.10.2005
Skąd: Częstochowa

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


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?
Go to the top of the page
+Quote Post
mortus
post 8.03.2012, 22:19:37
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
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: 25.04.2024 - 18:37