Класс для работы с шаблонами phptpl. Зацените!

_RVK_

Новичок
Класс для работы с шаблонами phptpl. Зацените!

Вот сподобился на написание собственного класса. Фичи:
0. Легкий в использовании.
1. Поддержка неограниченной вложенности шаблонов.
2. Возможность динамически менять шаблон, в зависимоти от какого либо условия.
3. Поддержка повторения блоков.
4. Все вложенные шаблоны находятся в отдельных файлах, что позволяет иметь неограниченное количество альтернативных блоков.
5. Файл вложенного блока указывается как атрибут тега, но может быть установленн динамически.

Код: http://uhp.novoch.ru/new/

Пример шаблона:

tpl.html

PHP:
<html>

<head>
  <title>{title}</title>
</head>

<body>
<b>{table tpl=table.html}</b>
</body>

</html>

table.html


PHP:
<table border=1>
{row tpl=row.html}
</table>
Хочется узнать мнение по функциональности, удобству, коду.... ну и вообще ваше мнение :)

И еще. Предложите пожалуйста, задачу, на которой можно было протестировать и сравнить скорость работы. Что то в голову ничего стоящего не приходит....
 

Фанат

oncle terrible
Команда форума
table.html
<table border=1>
{row tpl=row.html}
</table>
хо-хо!
это ж надо было наступить на такие грабли.

парень. ты ПОВЕСИШЬСЯ когда тебе понадобится понадобится добавить или изменить переменную в выводе.
искать, чертыхаясь, среди сотни мелких шаблонов тот, который нужен, и потом обнаружить, что надо искать новый - это и врагу не пожелаешь.

Все онрмальные люди описывают блоки в самом шаблоние.
блок таблицы нафиг не надо вообще отдельно описывать, а блок строки таблицы описывается в самом шаблоне тегами бегин и енд.

-~{}~ 24.06.04 09:26:

и, это.
ты уверен, что тебя сейчас не запинают за нарушение правил?
 

_RVK_

Новичок
Я специально сделал так. Может я не прав но мне кажется так удобнее, и быстрее. Конечно выносить таблицу в отдельный файл глупо, но это лишь пример. Зато такой вариант дает возможность иметь неограниченное количество альтернативных блоков. Для каждой страниц сайта свою центральную чать, а основной болок будет один. Притом шаблоны можно растосовать по папкам.
 

HEm

Сетевой бобер
дизель, у тебя нет своего сайта, где можно вывещивать свои скрипты? (типа запинываю за большой код, который занятые люди читать не будут)
 

_RVK_

Новичок
PHP:
<?php
include_once 'phptpl.class.php';

$tpl = new phptpl('tpl.html','templates/');

$tpl->settag('root->title','Таблица');
$tpl->build();
$tpl->parse();

$j=0;
for ($i=0;$i<5;$i++,$j--)
{
   if ($j==-3) $tpl->build('root->table->row','alt_row.html');
   $tpl->settag('root->table->row->num',$i);
   $tpl->settag('root->table->row->value',$j);
   $tpl->parse('root->table->row');
}
print $tpl->result();

$tpl->clear('root->table->row');

for ($i=0;$i<5;$i++,$j++)
{
   if ($j==-3) $tpl->build('root->table->row','row.html');
   $tpl->settag('root->table->row->num',$i);
   $tpl->settag('root->table->row->value',$j);
   $tpl->parse('root->table->row');
}
print $tpl->result();
?>
Вот корявенький пример работы с классом.

Соответсственно есть еще шаблоны row.html
PHP:
<tr>
  <td>{num}</td>
  <td>{value}</td>
</tr>
и alt_row.html

PHP:
<tr bgcolor=#aaaaaa>
  <td>{num}</td>
  <td>{value}</td>
</tr>
-~{}~ 24.06.04 09:41:

HEm извините, но теперь нет..... Да и код не особо большой, но еще раз сори.
 

_RVK_

Новичок
Фанат может ты и прав. Тогда можно добавить и возможность описания блоков в шаблоне, типа кому как удобнее.

Но я не понял такой вещи. Есть сайт на котором 10 страниц, отличающихся только дизайном центральной части. Шапка, меню одинаковы. Получается что либо в обном файле описывать все 10 блоков, либо по шаблону на каждый. В последнем случае, при смене дизайна, нужно будет править 10 файлов, в моем 1.
 

HEm

Сетевой бобер
для сайта из 10 страниц я бы вообще шаблоны не использовал
 

_RVK_

Новичок
HEm это для примера. Ну будет 100 страниц. Этож еще хуже. Хотя согласен, нужно добавить и так и этак. А каждый пусть юзает как ему удобнее для того или иного случая.
 

_RVK_

Новичок
Фанат ну был тут топик с обсуждением кода класса, так там автор, после каждой правки код постил, и ничего же. Я дико извиняюсь, как уже сказал, больше так не буду и тд и тп....
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Diesel
Но я не понял такой вещи. Есть сайт на котором 10 страниц, отличающихся только дизайном центральной части. Шапка, меню одинаковы. Получается что либо в обном файле описывать все 10 блоков, либо по шаблону на каждый. В последнем случае, при смене дизайна, нужно будет править 10 файлов, в моем 1.
На самом деле делается это двумя способами:
1) Есть 10 [файлов] шаблонов центральной части и 2 шаблона для шапки и подвала, которые подключаются к шаблону центральной части
2) Есть шаблон для "рамки" сайта (шапка и подвал) и в него подключается один из 10 шаблонов для центральной части.

А с таким движком, как верно отметил Фанат, затрахаешься.
 

_RVK_

Новичок
Sad Spirit мнение автора Sigma мне дорого!

Но у меня же то же самое, что ты и описал. Есть 1 шаблон "рамки" и есть 10 для центральной чати. В шаблоне указывается файл по умолчанию, но никто не мешает подгрузить любой свой в скрипте.

-~{}~ 24.06.04 10:54:

Sad Spirit может подскажешь задачу для теста на скорость? Хочется сравнить с другими классами, найти узкие места и оптимизировать...
 

Фанат

oncle terrible
Команда форума
Я дико извиняюсь
надо не дико извиняться, а отредактировать пост, оставив в нем только ССЫЛКУ на код.

-~{}~ 24.06.04 11:06:

У Котерова, кстати, описан еще один оригинальный подход.
Не скрипт грузит шаблон, а шаблон тянет в себя скрипт.
http://dklab.ru/chicken/nablas/16.html
рекомендую
 

fisher

накатила суть
по существу:
1) мне непонятно, зачем preg_match (этим и многие известные движки грешат- потомприходится делать кэш разбора). мне ещё более непонятно, зачем есть foreach внутри которого preg_match. правило хорошего тона - сканируем ОДИН раз. разбираем на лету - а уж как потом, другое дело, хоть через конечные автоматы пресловутые

2) пожалуйста, не надо так смело про "грабли", когда для шаблона-списка такие, например, вещи как шаблон-начало, шаблон-элемент-списка, шаблон-конец и шаблон-пусой-список определеяется блоками. это удобно программисту, что красноречиво доказал Фанат, но может быть неудобно верстальщику. хинт: _называйте_ шаблоны адекватно, и всё будет хорошо. тема удобства поднималась не раз, у всех свои пристрастия, но команде, разрабатывающей десятки больших проектов, разобраться в "продвинутой" вёрстке сложно, что вредит процессу больше.

не по существу:
>>шапка и подвал
тогда уж подвал-чердак, если хэдер-футер не нравится ;)
 

alpine

Новичок
Часто говорят, что достоинства и недостатки всегда компенсируются (читайте — если что-то улучшили, то всегда за счет ухудшения чего-то другого). Вера в этот принцип, воистину, сходна с верой в бога.
(С) http://dklab.ru/chicken/nablas/16.html
 

_RVK_

Новичок
fisher

1) math для того чтобы выделить имя вложенного файла. foreach для того что бы рекурсивно пройти с верху вниз по всем строкам всех файлов и постороить дерево.

2) уже понял. Действительно в некоторых случаях удобнее блоки прописывать в шаблоне. Позже будет сделано 2 варианта блоков.

-~{}~ 24.06.04 11:41:

fisher посмотрел на метод parse и понял что тут действительно можно без preg_match. Спасибо...
 

fisher

накатила суть
2Diesel : вопрос о preg_match ставится в том констексте, что операция эта небыстрая (зависит, конечно от регеспа) и общее число таких операций должно быть минимизировано для парсера шаблонов. проход по "строкам" также не обоснован - куда проще иметь всю строку с телом шаблона, и просканировать её, выделяя токены, последовательно, от начала до конца, один раз, без использования регекспов. наконец, посмотри трезво на то, что у тебя, и то, что уже есть в стандартных репозиториях, зачем изобретать велосипед?
 

_RVK_

Новичок
fisher проход по строкам обоснован. (см. алгоритм) Так как я строю дерево каждый блок это отдельная ветка. Это для того что бы, если мне нужно изменить какой либо блок, мне не приходилось бы парсить все заново, а только одну ветвь.

Я смотрел несколько движков. Мне не понравился ни один. При схожей функциональности, мой получился гораздо меньше по размеру. По скорости незнаю. Пока не тестировал. Притом "изобретение велосипеда" дает опыт. Это немаловажно.
 
Сверху