Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Problem z klasą systemu template'ów
Forum PHP.pl > Forum > Przedszkole
qbejs
Dopiero zaczynam OOP w php i mam do Was prośbę. Piszę sobie system skórek jednak mam problem z metodą build(). Mianowicie jak widać w listningu mam dwa wywołania metody add() która przekazuje tag oraz zawartosc na ktora ma byc zamieniony tag. Jednak u mnie skrypt bierze pod uwagę jedynie wartosci przekazane przez drugą deklaracje metody add(). Co należy poprawić aby brał pod uwagę wszystkie deklaracje metody add() przy przetwarzaniu metody build()

  1. <?php
  2. class Template{
  3. function Template()
  4. {
  5.  
  6. }
  7.  
  8. function setPath($path)
  9. {
  10. $this->tpl_path = $path;
  11. }
  12.  
  13. function setTemplate($template)
  14. {
  15. $this->tpl = $template;
  16. }
  17.  
  18. function add($text,$code)
  19. {
  20. $this->tag = array($text => $code);
  21. }
  22.  
  23. function build()
  24. {
  25.  
  26. if (count($this->tag) != 0)
  27. {
  28. foreach ($this->tag as $text => $code) 
  29. {
  30. $tpl = file_get_contents($this->tpl);
  31. $output = eregi_replace("{". $text ."}",$code,$tpl);
  32. echo $output;
  33. }
  34. }
  35. else
  36. die("Brak zdefiniowanych tagów");
  37. }
  38.  
  39. function benchTimeStart()
  40. {
  41. list($usec, $sec) = explode(" ",microtime()); 
  42. $this->time = ((float)$usec + (float)$sec); 
  43. }
  44.  
  45. function benchTimeStop()
  46. {
  47. list($usec, $sec) = explode(" ",microtime()); 
  48. $time = ((float)$usec + (float)$sec);
  49. $time_end = $time - $this->time;
  50. echo number_format($time_end,6,'.','');
  51. }
  52. }
  53.  
  54.  
  55. $tpl = new Template();
  56. $tpl->setTemplate("test.tpl");
  57. $tpl->add("IMIE","Jan");
  58. $tpl->add("NAZWISKO","Kowalski");
  59. $tpl->build();
  60. }
  61. ?>
matix
Przede wszystkim za każdy razem gdy wywołasz metode add(), usuwasz sobie wcześniej zapisane dane z zmiennej. Ta metoda powinna wyglądać tak:

  1. <?php
  2. $this->tag[] = array($text => $code);
  3. ?>


Myślę, że to jest ten twój problem winksmiley.jpg

Pozdro
qbejs
Ok, a teraz doradzcie jak zrobić żeby metoda build odrazu pokazywala calosc wraz z tagami zmienionymi na kod bo aktualnie wywala mi tyle razy plik tpl ile razy uzywalem metody add()
Cysiaczek
Zobacz, że dla każdego tagu ($this->tag) wywołujesz wczytanie pliku od nowa. Przenieś to przed pętlę.

Pozdrawiam.

Aha.
Popraw proszę tytuł topiku na zgodny z zasadami forum Przedszkole
qbejs
problem rozwiązany. Problem leżał także w metodzie add() gdzie powinno być $this->tag[$text] = $code;

Jeszcze jedna sprawa, dopisałem sobie implementacje pętl. Jednak wogole mi ich nie parsuje. Może Wy znajdziecie błąd bo mnie juz brakło pomysłów

  1. <?php
  2. function build()
  3. {
  4. if (count($this->tag) != 0)
  5. {
  6. $handle = fopen($this->tpl,"r");
  7. $tpl = fread($handle,filesize($this->tpl));
  8.  
  9. foreach ($this->tag as $text => $code) 
  10. {
  11. if (is_array($code))
  12. {
  13.  if (preg_match("/{loop:".$name."}(.*?){endloop:".$name."}/is", $tpl, $loop))
  14.  {
  15.  
  16.  $temp_string = '';
  17.  
  18.  for ($i = 0; $i < count($code); $i++)
  19.  {
  20.  $k = '';
  21.  $v = '';
  22.  $counter = 0;
  23.  
  24.  foreach($code[$i] as $key => $val)
  25.  {
  26.  $k[$counter] = "/{".$key."}/";
  27.  $v[$counter] = $val;
  28.  $counter++;
  29.  }
  30.  
  31.  $temp_string .= preg_replace($k, $v, $loop[1]);
  32.  }
  33.  
  34. $tpl = preg_replace("/{loop:".$name."}(.*?){endloop:".$name."}/is", $temp_string, $tpl);
  35. }
  36. else
  37. {
  38. echo "Error !";
  39. }
  40. }
  41. else
  42. {
  43. $tpl = str_replace('{'.$text.'}',$code,$tpl);
  44. }
  45. }
  46. echo $tpl;
  47. }
  48. else
  49. die("Brak zdefiniowanych tagów");
  50. }
  51. ?>


wywołuje to tak
  1. <?php
  2. $tablica[] = array("imie" => "jan","nazwisko" => "kowalski");
  3. add("pracownicy",$tablica[]);
  4. build();
  5. ?>


a efekt tego jest taki
  1. {loop:pracownicy} {endloop:pracownicy}
  2. {imie} {nazwisko}

Czyli krótko mówiąć nie ma żadnego efektu
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.