Вот и я сделал template engine. Начинал не с нуля, а с исходников от phpbb.
Переделал компилировщик (теперь он генерит нормальный php), добавил такую функциональность, как , .
С динамическими блоками и обычными вариаблами работает, как раньше с ИФами и инклудами так:
main_tpl.tpl
<!-- IF isset({var:IS_ADMIN}) -->
<!-- INCLUDE SOME_ADMIN_BOX -->
<!-- ELSEIF some_php_function({var:ANY_VARIABLE}) < .... {var:TRALI_VALI} etc PHP -->
<!-- BEGIN block1 -->
<!-- IF isset({var:block1.VALUE}) -->
//всякий хипер текст маркап лэнгвич
<!-- ENDIF -->
<!-- END block1 -->
<!-- ENDIF -->
include.tpl
//всякий хипер текст маркап лэнгвич
php.php
<?php
$template = new Template($default_skin_dir, $default_lang_dir);
$template->set_filenames(array(\'MAIN_TPL\' => \'main_tpl\'));
if(авторизован, как админ)
{
$template->assign_vars(array(\'IS_ADMIN\' => TRUE);
$template->set_filenames(array(\'SOME_ADMIN_BOX_HANDLE\' => \'blocks/include\'));
$template->assign_include(\'SOME_ADMIN_BOX\', \'SOME_ADMIN_BOX_HANDLE\', 1);
}
else if(другие условия)
{
$template->assign_block_vars(\'block1\', array(\'VALUE\' => \'какой-нибудь валуй\'));
}
$template->pparse(\'MAIN_TPL\');
?>
Т.е. в ИФах можно использовать пхп-код и значения {var:IS_ADMIN} или в блоках {var:block1.VALUE} для различных
condititons. Они задаются тем же assign_vars, но не добавляется =.
Теперь о технологии парсинга. Тот же eval или require_once при кэшировании.
При использовании инфа берётся из нескольких tpl, они все становятся одним uncompiled_code
с помощью str_replace-ов. Притом конфликтов с вложенностью нет, т.к.
assign_include(\' [str:some variable in tpls]\', \' [str:handle of file content]\', \' [int: level of replacing]\');
Т.е. level того шаблона в котором меньше, чем у того, в котором контент для .
В общем создаётся шаблон, потом один раз прогоняется compile-ом и eval-ится.
С кэшированием такого нет. так и инклудит файлы. Т.к. у разных страниц сайта мошгут быть разные подключения. Зашивать железно или
перекэшировать каждый раз нехорошо. А с несколькими require_once нормально.
Ещё фича этих инклудов:
$template->assign_include(\'SOME_ADMIN_BOX\', \'SOME_ADMIN_BOX_HANDLE\', 1);
$template->assign_include(\'SOME_ADMIN_BOX\', \'SOME_ADMIN_BOX_HANDLE_2\', 1);
будет инклудить в один 2 файла. Мне, например, это удобно для создания side-boxов (меню, ниже опрос, ниже баннер).
На локалке работает гораздо быстрее, чем раньше.
Есть ли у вас пожелания/замечания/критика? Я нормальный
Орать, что обиделся не буду
Кстати, кодил это где-то неделю, а продумывал где-то ... две.
http://kirill-gar.fromru.com/template.zip