Witam :)
Zacząłem robić system szablonów na mojej stronie z wykorzystaniem klasy Template. Oto jej kod (przerobiłem z jakiejś strony):

class Template {
  var $unparsed = array(0 => '');
  var $parsed = '';
  var $blocks = array('default' => '');

  // konstruktor ze sciezka do szablonu
  function Template($plik) {
    $this -> unparsed = @file($plik.'.tpl');
  }

  // parsowanie
  function parse() {
    $this -> parsed = '';
    $cnt = count($this->unparsed);
    
    for($i = 0; $i <= $cnt; $i++) {
      $tekst = $this->unparsed[$i];
      $found = array();

      if(preg_match_all("#\{(.+?)\}#is", $tekst, $found)) {

        foreach($found[1] as $block) {
          $block_names[] = '{'.$block.'}';
          $block_values[] = &$this -> blocks[$block];
        }

        $tekst = str_replace($block_names, $block_values, $tekst);
      }
      
      $this -> parsed .= $tekst;
    }
  }
  
}

W pewnym momencie napotkałem problem, jeśli chodzi o bazę :(
Więc dajmy na to taki przykład, który proceduralnie wyglądałby tak:

<?php

$sql = 'SELECT * FROM dzialy WHERE typ = 'dzial'';
$wynik = mysql_query($sql,$polaczenie);

while($row = mysql_fetch_array($wynik)) {
  echo '    <table cellpadding="0" cellspacing="0" width="122">
      <tr>
        <td class="menu_tytul_left">'.$row['nazwa'].'</td>
      </tr>
    </table>
    <table cellpadding="0" cellspacing="0" width="122">
  ';
  $zap = mysql_query('SELECT * FROM dzialy WHERE typ='poddzial' && dzial='.$row['id'],$polaczenie);
  while($w = mysql_fetch_array($zap)) {
    echo '      <tr>
        <td><a href="index.php?show=dzial&amp;page='.$w['id'].'" class="menu">'.$w['nazwa'].'</a><br /></td>
      </tr>
      <tr>
        <td><img alt="" height="2" src="img/hr.gif" width="120" class="menu" /></td>
      </tr>
    ';
  }
} 

?>

Wyświetla on listę działów (kolumna typ == dzial) oraz poddziałów (kolumna typ == poddzial) dla poszczegółnych tych działów.

Z użyciem klasy Template próbowałem tak:

$tpl_index = new Template('templates/'.$skin.'/index'); // index.tpl

$sql = 'SELECT * FROM dzialy WHERE typ = 'dzial'';
$wynik = mysql_query($sql,$polaczenie);

while($row = mysql_fetch_array($wynik)) {
  $tpl_index->blocks= $tpl_index->blocks + array(
    'MENU.DZIALY' => '<tr>
        <td class="menu_tytul_left">'.$row['nazwa'].'</td>
      </tr>
    </table>
    <table cellpadding="0" cellspacing="0" width="122">'
  );
  
  $zap = 'SELECT * FROM dzialy WHERE typ='poddzial' && dzial = '.$row['id'];
$wyn = mysql_query($zap,$polaczenie);

while($rows = mysql_fetch_array($wynik)) {
  $tpl->blocks = $tpl->blocks + array(
    'MENU.PODDZIALY' => '      <tr>
        <td><a href="index.php?show=dzial&amp;page='.$rows['id'].'" class="menu">'.$rows['nazwa'].'</a><br /></td>
      </tr>
      <tr>
        <td><img alt="" height="2" src="img/hr.gif" width="120" class="menu" /></td>
      </tr>
    '
  );
}
}

Gdzie $tpl_index to zmienna klasowa pliku index.tpl. MENU.DZIALY i MENU.PODDZIALY to już łatwo się domyślić co to jest, więc w pliku index.tpl robię tak:

{MENU.DZIALY}
{MENU.PODDZIALY}

Jednak to mi wyświetla tylko same działy, bez poddziałów [sciana]


BTW: jednak to i tak będzie mierny sposób, bo w końcu w moim index.php nie ma być kodu HTML. Stworzyłem zmienną klasową $tpl_dzialy i w pliku dzialy.tpl kod:

<tr>
        <td class="menu_tytul_left">'.$row['nazwa'].'</td>
      </tr>
    </table>
    <table cellpadding="0" cellspacing="0" width="122">

Ano trza by to przebudowywać (tablica $row nie ma jej tu być). I w ogóle mi się już pomieszało wszystko. ;)
Może więc ma ktoś jakiś gotowy sposób na rozwiązaniemego problemu (bardziej interesuje nnie ten opisany na dole)?
Z góry dzięki za odpowiedzi! [browar]