Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System szablonów i parsowanie kodu php
Forum PHP.pl > Forum > PHP
Simson
Witam serdecznie wszystkich użytkowników! Jest to mój pierwszy post, więc mam nadzieję, że wybrałem dobry dział. Mój problem polega na tym, iż korzystam z "innego" systemu szablonów - mam na myśli, że nie są to smarty, czy OPT, tylko mniej skomplikowany, a za razem zaawansowany system. I próbuję uruchomić na nim kod php, który includuje system newsów na stronie głównej. Obecnie wygląda to tak: http://irex-gliwice.pl/ Jak widać kod działa poprawnie, ale nie wyświetla się na przewidzianym dla niego miejscu oraz tle. Dosyć długo już próbuję rozwiązać ten problem, niestety bezskutecznie, dlatego też zwracam się do was z prośbą o pomoc. Załączam też plik z mojej www.

1) Klasa do obsługi szablonów
  1. <?
  2. class CTemplate
  3. {
  4. var $content;
  5. var $keywords;
  6. var $url;
  7.  
  8. function CTemplate($url='')
  9. {
  10. $this->url = $url;
  11. $this->keywords = array();
  12. if ($url)
  13. $this->code=file_get_contents($url);
  14.  
  15. }
  16.  
  17. function Load($url)
  18. {
  19. $this->code=file_get_contents($url);
  20. }
  21.  
  22. function Clear()
  23. {
  24. unset($this->keywords);
  25. $this->keywords = array();
  26. }
  27.  
  28. function Add($keyword, $text)
  29. {
  30. $this->keywords[$keyword] = $text;
  31. }
  32.  
  33. function Get()
  34. {
  35. reset($this->keywords);
  36. while (list ($key, $val) = each ($this->keywords))
  37. $this->code = str_replace($key, $val, $this->code);
  38. return $this->code;
  39. }
  40. }
  41. ?>


2)Plik index.php, dodałem w nim funkcję eval
  1. <?
  2. include('library/ctemplate.php');
  3.  
  4. $strona = new CTemplate('template/CSite.html');
  5.  
  6. switch($HTTP_GET_VARS['site'])
  7. {
  8. default:
  9. case 'start':
  10. $strona->Add('{SRODEK}', eval('?>' . file_get_contents('template/CSiteStronaGlowna.html'). '<?'));
  11. break;
  12. case 'galeria':
  13. $strona->Add('{SRODEK}', file_get_contents('template/CSiteGaleria.html'));
  14. break;
  15. case 'o_nas':
  16. $strona->Add('{SRODEK}', file_get_contents('template/CSiteONas.html'));
  17. break;
  18. case 'kontakt':
  19. $strona->Add('{SRODEK}', file_get_contents('template/CSiteKontakt.html'));
  20. break;
  21. }
  22. $strona->Add('{MENU}', file_get_contents('template/CSiteMenu.html'));
  23. $strona->Add('{INFO}', file_get_contents('template/CSiteInfo.html'));
  24.  
  25. echo $strona->Get();
  26. ?>
jaslanin
eval nie przekazuje się przez wartość, wykonuje się dokładnie w miejscu jego wywołania. Czyli w Twoim przypadku na początku strony.

Musisz sobie to logicznie jakoś inaczej rozplanować, np. za pomocą include.
Simson
No, ale właśnie nie bardzo wiem co z tym zrobić, ponieważ nie mogę zaincludować bezpośrednio kodu php w pliku html, bo parser nie może go obsłużyć.
jaslanin
Twoja klasa się nie nadaje do tego co chcesz zrobić, więc musisz ją przerobić, nie wiem co masz w tych wszystkich plikach które masz opisane w kodzie ale wg. mnie to mogło by wyglądać mniej więcej tak:

plik index.php
  1. <?php
  2.  
  3. class easyTemplate
  4. {
  5.  
  6. function setAktualnaStrona ($aktualnaStrona)
  7. {
  8.  
  9. $this->aktualnaStrona = $aktualnaStrona;
  10. }
  11.  
  12. function setDozwoloneStrony ($dozwoloneStronArr)
  13. {
  14.  
  15. $this->dozwoloneStrony = $dozwoloneStronArr;
  16. }
  17.  
  18. function add ($name, $value)
  19. {
  20.  
  21. $this->zmienne[$name] = $value;
  22. }
  23.  
  24. function make ()
  25. {
  26.  
  27. if (in_array($this->aktualnaStrona, $this->dozwoloneStrony))
  28. {
  29. if (count($this->zmienne)>0)
  30. {
  31. foreach ($this->zmienne as $klucz => $wartosc)
  32. {
  33. $$klucz = $wartosc;
  34. }
  35. }
  36. include "strony/$this->aktualnaStrona.php";
  37. }
  38. }
  39. }
  40.  
  41. $easyTemplate = new easyTemplate();
  42.  
  43. $easyTemplate->setDozwoloneStrony(array('index' , 'galeria' , 'kontakt'));
  44. $easyTemplate->setAktualnaStrona($_GET['strona']);
  45. $easyTemplate->add('test', 'bbbbbbb');
  46. $easyTemplate->make();
  47.  
  48. ?>



plik strony/index.php
  1. sdasdasd
  2.  
  3. <?= $test ?>


To taki przykład, do bardziej zaawansowanych rzeczy polecam się z zapoznaniem z jakimś frameworkiem np. Kohana (proty do nauki, najlepiej w wersji 2.3.4 bo wersja 3 ma jeszcze kiepską dokumentacje)
Zyx
Simson -> właśnie od tego są gotowe systemy szablonów, byś nie musiał wynajdować koła od zera tym bardziej, że nie radzisz sobie z tym. Po pierwsze, dlaczego piszesz pod PHP4, kiedy od 6 lat jest PHP5, po drugie szablony z samym podstawianiem bloków na wartości nie mają absolutnie żadnego sensu, po trzecie bardziej wykonanie bardziej zaawansowanych rzeczy umożliwia kompilacja szablonów do postaci kodu PHP i uruchamianie tego kodu, ale żeby pisanie kompilatora miało sens, to trzeba naprawdę wiedzieć, co się robi. Inaczej nic nie polepszysz, a jedynie pogorszysz sprawę, ponieważ zaprojektowanie sensownego języka szablonów nie jest takie proste, jak się większości ludzi wydaje. Z obiektówką u Ciebie średnio, z tego co widzę, więc może na początek pobaw się jakimś systemem z PHP jako językiem szablonów, a później czymś przyzwoitym, np. OPT lub PHPTAL.
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.