Эта тема на forum.dklab.ru


Vitas: Пассивные шаблоны (реализация)
Не можете ли подсказать теории о созданни шаблонизатора такого типа:
Начало глобального шаблона.
<!-- begin block -->
Тут идет блок.
<!-- begin subblock -->
Это вложение, их может быть хоть мильон!
<!-- end -->
<!-- end -->
И конец блока.
Я тут пытался что-то сделать да не выходит!
Данный шаблонизатор не может "выдержать" многочисленные вложения и он НЕ учитывает замещение {var} на {value}.
Vitas:
Вот source:
<?php
class templates {
private $trees;
private $blocks;
private $results;
function __construct () {
$this -> results = array ();
}
function load ($name) {
$block = "global";
$this -> trees [$name] = array ("global");
$this -> blocks [$name]["global"] = array (
"body" => "",
"position" => 0,
"relative" => 0,
"length" => 0
);
$lines = file ("templates/" . $name . ".htm");
foreach ($lines as $line) {
$line = rtrim ($line);
$trim = ltrim ($line);
if (substr ($trim, 0, 11) == "<!-- begin ") {
$previous = $this -> blocks [$name][$block];
$block = substr ($trim, 11, -4);
array_push ($this -> trees [$name], $block);
$length = strlen ($previous ["body"]);
$this -> blocks [$name][$block] = array (
"body" => "",
"position" => $previous ["position"] + $length,
"relative" => $length,
"length" => 0
);
} elseif ($trim == "<!-- end -->") {
$number = count ($this -> trees [$name]) - 1;
unset ($this -> trees [$name][$number]);
$block = $this -> trees [$name][$number - 1];
} else {
$this -> blocks [$name][$block]["body"] .= $line . "\n";
}
}
}
function block ($template, $block) {
if (!array_key_exists ($template, $this -> results)) {
$this -> results [$template] = $this -> blocks [$template]["global"]["body"];
}
$_block =& $this -> blocks [$template][$block];
$result =& $this -> results [$template];
$length = strlen ($_block ["body"]);
if ($_block ["length"] != 0) {
$offset = $length;
$start = false;
foreach ($this -> blocks [$template] as $block_name => &$__block) {
if ($block == $block_name) {
$start = true;
continue;
}
if ($start) {
$offset += $__block ["length"];
$__block ["length"] = 0;
}
}
$_block ["position"] += $offset;
}
$result = substr ($result, 0, $_block ["position"]) .
$_block ["body"] .
substr ($result, $_block ["position"]);
$_block ["length"] += $length;
$start = false;
foreach ($this -> blocks [$template] as $block_name => &$__block) {
if ($block == $block_name) {
$start = true;
$last = $block_name;
continue;
}
if ($start) {
$__block ["position"] = $this -> blocks [$template][$block]["position"] + $__block ["relative"];
}
$last = $block_name;
}
}
function result ($template) {
if (!array_key_exists ($template, $this -> results)) {
$this -> results [$template] = $this -> blocks [$template]["global"]["body"];
}
return ($this -> results [$template]);
}
function show () {
echo ("<pre>\n");
print_r ($this -> trees);
print_r ($this -> blocks);
echo ("</pre>\n");
}
}
$templates = new templates;
/* Использование:

Загрузка шаблона:
$templates -> load ("название без .htm");
Блоки:
$templates -> block ("шаблон", "блок");
Результат
echo ($templates -> result ("if,kjy"));

*/
?>
Дмитрий Чечеткин: Re: Пассивные шаблоны (реализация)
Не можете ли подсказать теории о созданни шаблонизатора такого типа:
Начало глобального шаблона.
<!-- begin block -->
Тут идет блок.
<!-- begin subblock -->
Это вложение, их может быть хоть мильон!
<!-- end -->
<!-- end -->
И конец блока.
Я тут пытался что-то сделать да не выходит!
Данный шаблонизатор не может "выдержать" многочисленные вложения и он НЕ учитывает замещение {var} на {value}.

Попробуйте воспользоваться встроенными функциями обработки XML.
Я скоро выложу у себя на сайте шаблонизатор XmlSmarty.
phlinten:
Vitas
уже давно всё придумали за вас
http://sourceforge.net/projects/xtpl
Дмитрий Чечеткин:
А еще в готовых решениях лежит готовый шаблонизатор на XML (XmlSmarty)

Эта тема на forum.dklab.ru