- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 
                        // (c) Template Optimizer
// (c) Template Compiler
// skin/news.tpl
/*<?php
die ('<br /><br />Template Parser: <b>Access locked</b>');
?>*/
$value0 = '
';
if ( $this->get_tpl_tag ('USER.ACCESS') == '1' )
{
	$value0 .= '
	';
	$this->set_tpl_tag ('ACTION', 'new_add');
	$value0 .= '
	';
	$this->set_tpl_tag ('SUBMIT', 'Добавить');
	$value0 .= '
	';
	$this->set_tpl_tag ('CAPTION', 'Добавить новость');
	$value0 .= '
	' . $this->file_include ('content.tpl') . '
';
}
$value0 .= '
';
$this->open_local (array ('NEW'));
if ( is_array ($this->get_tpl_tag ('NEWS')) )
foreach ( $this->get_tpl_tag ('NEWS') as $this->tags['NEW'] )
{
	$value0 .= '
	<table class="news" width="100%">
		<tr>
			<th>
				<h2>' . $this->get_tpl_tag ('NEW.TITLE') . '</h2>
			</th>
			<th align="right">
				<span class="gensmall">' . $this->get_tpl_tag ('NEW.TIME') . ' </span>
				';
	if ( $this->get_tpl_tag ('USER.ACCESS') == '1' )
	{
		$value0 .= '
					<a href="admin.php?action=new_edit&new=' . $this->get_tpl_tag ('NEW.ID') . '"><img src="' . $this->root_dir . '/images/rename.gif" alt="Редактировать" title="Редактировать" style="vertical-align: middle; border: none;" /></a>
					<a href="admin.php?action=new_delete&new=' . $this->get_tpl_tag ('NEW.ID') . '" onclick="return confirm (\'Удалить новость за ' . $this->get_tpl_tag ('NEW.TIME') . '?\');"><img src="' . $this->root_dir . '/images/delete.gif" alt="Удалить" title="Удалить" style="vertical-align: middle; border: none;" />
				';
	}
	$value0 .= '
			</th>
		</tr>
		<tr>
			<td colspan="2">
				' . $this->get_tpl_tag ('NEW.BODY') . '
			</td>
		</tr>
	</table>
';
}
$this->close_local();
$value0 .= '
';
$this->set_tpl_tag ('_ALIGN_', 'LEFT');
$value0 .= '
' . $this->file_include ('pagebar.tpl');
                                 
        
            Вот такой "говнокод" выдает мой шаблонизатор после компилирования шаблона.
В данном примере это блок новостей.
        
        
Вот код самого шаблона news.tpl, откомпилированный код которого я привел:
Поиском регекспами с заменой, или же пошаговый разбор лексем, или ещё как-то? Если не секрет, конечно.
Я, думаю, примерно смогу представить :)
сама идея делать шаблонизатор на пыхе смешит.
Меня, к примеру, бесит код php в перемешку с html тегами. Подобный шаблон гораздо более читабельный, особенно, если под него подсветку синтаксиса настроить.
Да и код менее читабельный со вставками php, чем при использовании шаблонных тегов.
ну так в смарти тоже можно вставлять пхп код если не ошибаюсь. зато помимо пхп синтаксиса нужно учить еще и синтаксис обрубка, а потом по пол часа курить маны в каждой нетипичной ситуации чтобы придумать очередной хак и сделать таки то, что на пхп пишется за секунду с закрытыми глазами.
Смарти-подобные, чей код есть почти тот же пых, а исходник превращается в кашу - имхо, фтопку
1. Писать свой.
2. Использовать готовый.
3. Не использовать шаблонизатор, а вставлять в html php код.
2-й вариант не подошел, по причине того, что ничего удовлетворительного (имхо) не обнаружил.
3-й вариант меня не устраивает по многим причинам.
Остается 1-й :)
P.S. Забыл еще вариант с xslt указать. Тоже не устраивает...
2. Не стоит в шаблоны (что есть чисто дизайнерская функция) передавать логику.
Вот примерно набросал, как бы тот же шаблон news.tpl выглядел бы с php вставками:
Вот какая бяка выходит. К тому же появляется доступ туда, куда, по идеи, шаблоны доступа иметь не должны. Да и с переменными непонятки.
2. не стоит. Пишите в шаблонах только вью. Или на php без логики никак?
Вы сами говорите что нужна только вью, и сами же вбиваете локализацию и логику (if) и вшиваете URLы (admin.php) да еще и верстаете несемантично, и еще зачем-то по таблице делаете на каждую новость:)
Причем делаете это и в шаблоне и в php.
Всю проверку на права пользователя нужно делать не в шаблоне
зы: у news нет единственного числа.
1. В данном случае ни какого смарти нет, как писал, мой шаблонизатор ни как не смарти, тем более, что он уже старее даже смарти.
Читабельность тегов {TAG} для меня выше, чем <?=$tag?>
2. Да, можно писать без логики, но а если не только я буду шаблоны править, ведь можно нагородить черт знает чего туда...
> Вы сами говорите что нужна только вью, и сами же вбиваете локализацию и логику (if) и вшиваете URLы (admin.php)
Эта логика ни как не связана с обработкой данных на php, т.е. php выдает набор шаблонных тегов (в том числе и массивов), в шаблоне это все выводится нужным образом. Речь шла про то, что не должно быть доступа из шаблона ни к каким переменным php, ни к БД. А есть ведь такие, кто в php шаблоны вставляет запросы к БД (видел такое).
> да еще и верстаете несемантично, и еще зачем-то по таблице делаете на каждую новость:)
Здесь речь не о верстке, это был пример, который первый под руку попался. В данном случае я готовый HTML закинул в шаблон, что и нужно было заказчику. Мне наплевать, сколько у него там таблиц на 1 новость... :)
> <?}?>
Ну вот такие конструкции мне и не нравятся. Тем более, что желательно было бы записать <?php }?>, т.к. не везде сокращенная запись включена.
> Всю проверку на права пользователя нужно делать не в шаблоне
Да, но выводить кнопочки админа надо в шаблоне же :) Проверка делается именно в php, шаблон лишь выводит или нет элементы управления админа, в зависимости от тех прав, что определил скрипт php.
В противном случае придется или отдельный шаблон делать под эти элементы управления или, что еще хуже, генерировать их прямо в скрипте, тем самым лишая возможность подстроить их под дизайн скина.
Заменить все <? на <?php все <?= на <?php echo это прибавит читабельности убрать
<?php }?> потому что не нужно используйте endforeach это тоже добавляет к читабельности.
а вот за это style="vertical-align: middle; border: none;" руки отрывать нах. чтоб не повадно было.
<?php foreach ():?>
HTML
<?php endforeach;?>
И там тд тд для if есть альтернативный синтаксис
какая разница писать {} как в smarty или <?php ?>
Единственное накидать класс который грузит файл шаблона куда накидываются переменные впоследствии, шаблон будет таким же php файлом, и не будет лишнего слоя в виде вашего парсера
При использовании компилируемого шаблонизатора проблема снижения производительности практически исчезает, зато можно использовать тот синтаксис для шаблонов, который больше нравится.