Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: php Templates
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Strzałek
Ostatnio miałem potrzebę napisac małą stronę, więc nie było sensu używać smart'ów.
Napisałem coś takiego:


  1. <?php
  2. /**
  3.  * Prosty system szablonów php
  4.  * @copyright Copyright (c) Strzalek 2005
  5.  * @author Strzalek <strzalek@vp.pl>
  6.  * @version 1.0.0
  7.  * @package Template
  8.  */
  9.  
  10.  class Template {
  11.  
  12. /**
  13.    * Ścieżka szablnów
  14.    * @var string
  15.    */
  16. public $templateDir = './templates/';
  17.  
  18. /**
  19.    * Przechowywuje zmienne wykorzystywane
  20.    * w szablonach
  21.    * @var array
  22.    */
  23. protected $_vars = array();
  24.  
  25. /**
  26.  * Dołączenie wartości
  27.  * @param string $key Nazwa
  28.  * @param mixed $value Wartość
  29.  * @return void
  30.  */
  31.  public function assign($key, $value){
  32.  $this -> _vars[$key] = $value;
  33.  }
  34.  
  35.  /**
  36.  * Dołączenie wartości przez referencje
  37.  * @param string $key Nazwa
  38.  * @param mixed $value Wartość
  39.  * @return void
  40.  */
  41.  public function assignByRef($key, &$value){
  42.  $this -> _vars[$key] =& $value;
  43.  }
  44.  
  45.  
  46.  /**
  47. * Wyświetla plik szablonu
  48. * @see Template::fetch();
  49. * @param string $file Nazwa pliku
  50. * @return void
  51. */
  52.  public function display($file){
  53. echo $this -> fetch($file);
  54.  }
  55.  
  56.  /**
  57. * Zwraca wartość szablonu
  58. * @throws TemplateException
  59. * @param string $file Nazwa pliku
  60. * @return mixed
  61. */  
  62.  public function fetch($file){
  63.  
  64. $filePath = $this -> templateDir.$file;
  65.  
  66. if(file_exists($filePath) and is_readable($filePath)){
  67.  
  68.  ob_start();
  69.  
  70.  extract($this -> _vars, EXTR_SKIP);
  71.  
  72.  include($filePath);
  73.  
  74.  return ob_end_flush();  
  75. }
  76.  
  77. throw new TemplateException('Błąd przy generowaniu szablonu');
  78. return false;
  79.  }
  80.  
  81.  }
  82.  
  83.  
  84.  class TemplateException extends Exception { }
  85.  
  86.  
  87. ?>


Barodz prosta klasa, którą używa się tak:

  1. <?php 
  2.  
  3.  try{
  4.  
  5. $tpl = new Template();
  6.  
  7. $tpl -> assign('title', 'Testowy tytuł biggrin.gif');
  8.  
  9. //to można oczywiście pobrać z bazy ;)
  10. $allNews = array(array('title' => 'newsik D:', 'id' => 1),
  11.  array('title' => 'Hej sialalala', 'id' => 2),
  12.  array('title' => 'Umc, umc, umc', 'id' => 3)
  13. );
  14.  
  15. $tpl -> assign('allNews', $allNews);
  16. $tpl -> display('index.tpl');
  17.  
  18.  }catch(TemplateException $e){
  19. echo $e;
  20.  }
  21.  
  22. ?>


a plik szablonu wygląda tak:

  1. <html>
  2. <body>
  3. <?php echo $title ?><br />
  4.  
  5. <?php foreach($allNews as $news): ?>
  6.  <small><?php echo $news['title'] ?></small><br />
  7. <?php endforeach; ?>
  8. </body>
  9. </html>


To tyle. Ewentualne błędy, albo udogodnienia proszę zgłaszać.
Pozdrawiam.
Lisek54
Zkorzystałem z tej klasy.

Działa wszystko pięknie, lecz na końcu każdego wygenerowanego szablonu znajduje się liczba "1".

Kod
Tutaj moj testowy tutul, news albo cos w tym rodzaju...
1


To samo przy generowaniu news z bazy:

Kod
Giertych wprowadza nowe ... :: 2006-11-03
Moj testowy news

Proces uczniów... :: 2006-11-03
Moj drogi testowy news
1


W kodzie nic nie znalazłem, a tak używam klasy:

  1. <?php
  2. $tpl = new Template();
  3. $tpl -> assign('news', 'lala newsy'); # definicja szablonowej zmiennej
  4. $tpl -> display('news.tpl');
  5. ?>




A oto twój przykład:

Kod
Testowy tytuł :D
newsik D:
Hej sialalala
Umc, umc, umc
1
.

PHP5, MySql, Krasnal 2.7

Pozdro
nospor
Cytat
Działa wszystko pięknie, lecz na końcu każdego wygenerowanego szablonu znajduje się liczba "1".
Wynika to z niezagladania przez autora klasy do manuala.
http://pl.php.net/manual/pl/function.ob-end-flush.php
ob_end_flush zwraca true albo false, a nie to co bylo w buforze. To co bylo w buforze leci od razu na ekran.

a w kodzie mamy:
  1. <?php
  2. public function display($file){
  3. echo $this -> fetch($file);
  4.  }
  5. ?>

a fetch nie zwraca tekstu , tylko zwraca true, a "echo true" = 1 na ekranie smile.gif
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.