tplTemplatez - парсер шаблонов.

Name

Новичок
tplTemplatez - парсер шаблонов.

После неудачных попыток поюзать какой либо template был написан свой сообственный.
ИМХО получилось неплохо.
На самом деле это уже третий заход и переделка, надеюсь все учтено.

Главный упор на удобство, может даже где то пострадала производительность, но несильно.
Теги как в php_template (Надеюсь никто не против)

Features:
- Простота и гибкость
- Никаких специальных инструкций в шаблоне
- Никакого кода в шаблоне, только определение блоков
- Возможность скрывать или показывать определенные блоки при определенных условиях (очень гибко, ИМХО)
- Неограниченое кол-во динамических блоков
- Возможность парсить вложеные динамические блоки (циклы)

Source
http://www.ezactive.com/downloads/tplTemplatez.zip
Документация не очень, но снабдил примерами.

Comments are welcome.
 

pachanga

Новичок
Очень интересно...скачал и разбираюсь, пока все нравится, но есть некоторые вопросы, я их чуть позже задам.
Спасибо!
 

Name

Новичок
Пользуйтесь на здоровье. Буду только рад если кому поможет.
 

pachanga

Новичок
Слушай, как думаешь, быть может неотработавшие {template_area} стоит удалять перед выводом?
Т.к. обычно шаблон делается универсальным, и не во всех случаях все зоны заполняются.
Кстати, я пользуюсь не {}, а <!--{}-->
 

sergik_sergik

Guest
элементы формы

У меня есть шаблон (name.tpl) и рнр-файл (name.php), который его обрабатывает (парсит). Так вот когда я делаю сабмит в темплэйте (ну в смысле когда уже страница выведена на экран) и хочу обработать элементы формы тем же рнр-файлом(name.php), то почему то все переменные формы не устанавливаются, а если обрабатывать форму другим рнр-файлом то все нормально. Как сделать чтобы обрабатывался и этим файлом (name.php)?
 

Name

Новичок
> Слушай, как думаешь, быть может неотработавшие {template_area} стоит удалять перед выводом?
Ты имеешь ввиду переменные {var}, и удалять те для которых не нет значения?.
Может и стоит, а может нет.
ИМХО не разбериха какая-то, ли специально не назначил, толи забыл, толи ошибся в имени.
А так сразу видно, что то не то.
Я если не хочу показывать то назначаю 'пусто' для перемменой.
Еще можно блоками, прятать.

> Кстати, я пользуюсь не {}, а <!--{}-->
А зачем?

> sergik_sergik
Не очень. Понял.

В том примере который в архиве.
в dinamic.php в конце файла пишу
print_r($_POST);
После субмита все устанавливаеться, переменные есть.
 

pachanga

Новичок
Понимаешь, код становится "темплейтно-зависимым" что ли... т.е. нам всегда необходимо назначать пустые значения для ненужных полей - по-моему это не очень хорошо.

А <!--{}--> - это маленькая уловка, это же html комментарий, поэтому неотработавшие поля не видно.
Однако, скажем, для аттрибутов это не помогает, типа:
<table <!--{htm_attributes}--> >

Наверное все же лучше удалять?

Быть может стоит завести глобальную константу PHP_DEBUG и смотреть, если она есть и true, то пустые поля не удалять?
 

Name

Новичок
Ну да наверное все таки смысл есть.
Короче пофиксил. Архив обновил.
 

pachanga

Новичок
Спасибо за фиксы!

Вот, смотри, еще вот такой вопрос типа "а правильно ли я думаю, что это должно работать так":

Есть шаблон:
Код:
<tr<tmpl:if_error> bgcolor='#ececec'</tmpl:if_error>>
<td>
	just a test!
</td>

</tr>
<tmpl:if_error>
<tr>
	<td colspan='2'>
	<small style="color:#f00" >{error}</small>
	</td>
</tr>
</tmpl:if_error>
Есть код:
Код:
<?php

require ('../tplTemplatez.php');

$tpl = new tplTemplatez('valid_input.tpl');

$tpl->tplSetNeeded('if_error');
$tpl->tplAssign('error', 'that\'s an error!');
$tpl->tplParse('', 'if_error');

$tpl->tplParse();

$tpl->tplPrint();

?>
Так вот все это дело выводится, по-моему, некорректно. Чего я ожидаю от такого кода, так это вывод блока if_error с назначенным {error}. Быть может я представляю себе работу шаблонного механизма неверно?

P.S
На самом деле я достиг желаемого, но следующим путем

Шаблон:
Код:
<tmpl:input>
<tr<tmpl:if_error> bgcolor='#ececec'</tmpl:if_error>>
<td>
	just a test!
</td>

</tr>
<tmpl:if_error>
<tr>
	<td colspan='2'>
	<small style="color:#f00" >{error}</small>
	</td>
</tr>
</tmpl:if_error>
</tmpl:input>
Код:
Код:
<?php

require ('../tplTemplatez.php');

$tpl = new tplTemplatez('valid_input.tpl');

$tpl->tplSetNeeded('input/if_error');
$tpl->tplAssign('error', 'that\'s an error!');

$tpl->tplParse('', 'input');

$tpl->tplPrint();

?>
Как-то нелогично...или я ошибаюсь?

PPS. Мне кажется, в методе tplParse() стоит поменять аргументы местами - название блока нужно всегда, а вот массив можно и не передавать. Согласись, tplParse('input') изящнее tplParse('', 'input'), с учетом того, что выше был сделан assign.
 

Name

Новичок
Обычно tplParse() вызывают чтоб пропарсит конкретный блок (динамический) или весь template.
Тут нужно уловить разницу между "главными блоками" и "альтернативными".
После вызова класса $tpl = new tplTemplatez('tpl/edit_priv.tpl');
Все найденые блоки считаються альтернативными до тех пор пока мы не вызовем tplParce($array, 'my_block').
После этого 'my_block' становиться одним из "главных" все блоки внутри 'my_block' остаються альтернативными но относятся уже к 'my_block'.

В твоем случае главным блоком являеться весь файл, его мы и парсим. И следовательно if_error - альтернативными.
Код:
<tr<tmpl:if_error> bgcolor='#ececec'</tmpl:if_error>>
<td>just a test!</td>
</tr>

<tmpl:if_error>
<tr>
	<td colspan='2'>
	<small style="color:#f00" >{error}</small>
	</td>
</tr>
</tmpl:if_error>
----------------------------------------
$tpl->tplSetNeeded('/if_error'); 
$tpl->tplAssign('error', "that's an error!");

$tpl->tplParse(); //парсим весь темплайт и обрезаем альтернативные блоки если они не указаны как 'needed'
$tpl->tplPrint();
Не думаю что назначать блоки для атрибутов хорошая идея. Даже не читабельно както.
Играй со значениями для переменной. {bgcolor}

> Мне кажется, в методе tplParse() стоит поменять аргументы местами
Всегда найдеться какой нибудь массив. Особенно если всяких переменных много и они задаються где то, отдельным файлом.
На самом деле все это обдумывалось и не раз.
Сейсчас посмотрел на свои исходники, tplParse($array) встречаеться гораздо чаще чем tplParse('' , 'block')
 

pachanga

Новичок
Спасибо - понял!
Очевидно я забывал ставить слэш:

$tpl->tplSetNeeded('/if_error');

а у меня

$tpl->tplSetNeeded('if_error');

PS. Насчет того, как извратно могу я пользовать шаблон - это дело десятое :)
 

klep

Новичок
Отличный класс, мне понравился.

Только не могу сделать одно штуку:

Есть несколько шаблонов.

$tpl1 = $MyHtml->LoadTemplate('tpl/main1.tpl');
$tpl2 = $MyHtml->LoadTemplate('tpl/main2.tpl');
$tpl3 = $MyHtml->LoadTemplate('tpl/main3.tpl');
$tpl4 = $MyHtml->LoadTemplate('tpl/main4.tpl');


И вот в работе программы в 3 шаблон необходимо вставить внутри таблицы новый шаблон $tpl5 = $MyHtml->LoadTemplate('tpl/main5.tpl');
Не получаеться это сделать, подскажите как это сделать?

И что за второй параметр у конструктора
function tplTemplatez($tplfile, $box = null)
box ?
Это что ? Что нужно туда передовать ?

В заранее спасибо за ответ.
 

zerkms

TDD infected
Команда форума
привет
извиняюсь за некомпетентность в данном вопросе, но возникла необходимость узнать что есть такое шаблоны. почитал форумы по данной теме, увидел данный пост.
я многого ещё не понимаю в механизме работы шаблонов (вернее почти не понимаю ничего), но мне непонятен факт: люди юзают классы шаблонов, хотя вроде как все те же функции встроены в ПХП. я не прошу ответа на поставленные выше вопросы, но есть ли резон использовать указанный в данном обсуждении класс шаблонов или есть смысл искать другие/писать свой??? насколько он хорош для понимания принципов работы с шаблонами?
скачал данные исходники, попробовал код в действии.
при работе одного из примеров, форма была записана вида:
<form action={php_self}
в классе нашёл:
$this->vars['PHP_SELF'] = $_SERVER["PHP_SELF"];
но форма отрабатывает не на себя, а на: http://localhost/{php_self}, в чём проблема??
 

Фанат

oncle terrible
Команда форума
у тебя же одно большими буквами, а другое - маленькими.
 

zerkms

TDD infected
Команда форума
2 fanat:
может это будет нетактично по отношению к автору данного класса, но данная трабла была взята из примеров, которые прилагались к данному классу вместе с описанием, просто я подумал может это уже проблема, которая вызвана моими неумелыми действиями
2 corda:
этот документ я уже с удовольствием прочитал на досуге, но всё равно спасибо за линк.

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

Green Lord

Читатель
Обьясните мне, непонятливому - ЧЕМ не устраивает тот десяток только известных классов/библиотек шаблонов?
 

zerkms

TDD infected
Команда форума
я про то и спрашиваю, есть ли смысл юзать этот класс для понимания и вообще для проектов или стоит заострить внимание на каких то стандартных???
 

corda

Новичок
Хмм... Ну, для понимания вообще любой движок можно порассматривать. Если сильно глубоко хочется, взгляни на Flexy (из PEAR) и на Smarty. А по поводу проектов - что нравится, то и используй.
 
Сверху