<!– BEGIN:news –>
<td class="div_1">
<table>
<tr>
<td valign="top" class="image"><a href="{news.link}"><img src="{news.image}" alt="" /></a></td>
<td valign="top">
<span>{news.date}</span>
<p>{news.title}</p>
<img src="{config.path.img}icon_str.gif" alt="" /><a href="{news.link}">Подробнее</a>
</td>
</tr>
</table>
</td>
<!– END:news –>
Блок используется на всех страницах сайта. Естественно, логично будет вынести парсинг этого блока куда-нибудь в бифор-каллбек контроллера, чтобы каждый раз не определять его вручную. А теперь представим, что злыдни-дизайнеры решили выводить на разных страницах разное количество новостей и при этом не говорят нам какое, а сами хотят определять это число.
К нашему великому счастью, класс XTemplate обладает волшебным методом reset:
/**
* resets the parsed text
*
* @access public
* @param string $bname Block to reset
*/
public function reset ($bname) {
$this->parsed_blocks[$bname] = '';
}
Как его можно применить в нашей ситуации? Всё очень даже примитивно: создадим специальный конфигурационный блок, в котором версталы будут писать число - количество новостей, которое нужно выводить.
<!– BEGIN:count –>3<!– END:count –>
Ну а дальше в контроллере считываем это количество и сбрасываем этот блок:
$xtpl->parse('count');
$count = $xtpl->text('count');
$xtpl->reset('count');
Для удобства можем создать метод с произвольным названием, чтобы каждый раз не писать эти три строчки:
class SinklerXTemlate extends XTemplate {
public function __construct($file, $tpldir = '', $files = null, $mainblock = 'main', $autosetup = true) {
parent::__construct($file, $tpldir, $files, $mainblock, $autosetup);
}
public function read_cfg($bname) {
$this->parse($bname);
$cfg = $this->text($bname);
$this->reset($bname);
return $cfg;
}
}
$count = $xtpl->read_cfg('count');
http://sinkler.ru/posts/read_configuration_from_xtemplate