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&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&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]