Личный сайт Андрея Сабинина

Сайт не обновляется с начала 2011 года, так как у меня на это нет ни времени, ни желания.

Заглавная / Архив блога о разработке / Разработка / О шаблонизаторах. Часть вторая
 
 

Умер человек. Но что тут особенного? Ежеминутно умирают тысячи людей. Так свидетельствует статистика. В этом тоже нет ничего особенного. Но для того, кто умирал, его смерть была самым важным, более важным, чем весь земной шар, который неизменно продолжал вращаться.

Эрих Мария Ремарк, «Триумфальная арка».

 

О шаблонизаторах. Часть вторая

sap, 16-го апреля 2008 года в 19:10

Обращаю ваше внимание на то, что эта запись является архивной. Ей уже больше 4 лет. Это означает, во-первых, то, что мое мнение по поднятым в ней вопросам могло измениться (хотя, конечно, не обязательно), а во-вторых, то, что я не испытываю никакого желания эти вопросы обсуждать, и поэтому комментарии и оценки я отключил.


В первой части статьи «О шаблонизаторах» мы убедились в том, что использование большинства популярных шаблонизаторов значительно ухудшает быстродействие; кроме того не дает достаточной гибкости даже для не очень сложных случаев. Что же тогда использовать?

Ответ на этот вопрос — нативные шаблоны. Это шаблоны в духе все той же концепции MVC, но не использующие никаких псевдоязыков и не транслирующие код назад на PHP. Потому что шаблон пишется сразу на PHP, и задачей шаблонизатора остается только собрать все переменные и подключить шаблон. Весить такой шаблонизатор будет буквально пару килобайт, а работать будет в 2-3 раза (!) быстрее того же Smarty.

Я, лично для себя, написал такой шаблонизатор. Он называется STemp, и именно он используется в моих разработках. Я, конечно, не буду утверждать, что этот шаблонизатор уникален и неповторим — напротив, я уверен, что многие разработчики создавали для себя аналогичные вещи. Для ознакомления (и использования) вы можете скачать STemp, здесь же я приведу пример его использования. Задачу возьмем ту же самую, на которой мы рассматривали недостатки Smarty — нужно вывести неизвестное число фотографий в несколько рядов, по три фотографии в каждом. На входе — массив с данными.

$stemp = new STemp ();
$stemp->assign ("photos"$photos);

Как видно из примера, инициализация шаблонизатора и передача переменных в шаблон ничем не отличаются от Smarty. В шаблоне же будет следующий код:

<?if ($this->photos):?>
<table border="0" align="center" width="100%">
  <?for ($j 0$j count ($this->photos); $j+=3):?>
  <tr>
    <?for ($i j$i 3$i++):?>
    <td align="center">
      <a href="/photo/<?=$this->photos[$i]['id']?>">
      <img src="/preview/<?=$this->photos[$i]['id']?>"
      border="0" alt="<?=$this->photos[$i]['title']?>">
      </a> <br />
      <a href="/photo/<?=$this->photos[$i]['id']?>">
      <?=$this->photos[$i]['title']?> </a>
    </td>
    <?endfor?>
  </tr>
  <?endfor?>
</table>
<?endif?>

Получилось проще и удобнее, чем на Smarty. А для верстальщика, не знающего PHP, этот код, на мой взгляд, даже понятней чем код шаблона Smarty (это к тому, что поклонники Smarty утверждают, что их шаблоны гораздо проще для восприятия, чем нативные шаблоны. Как говорится, почувствуйте разницу — что понятнее — два цикла, не засоряющие html-код или какие-то {if $i lt 3} и {assign var="i" value=$i+1}). Что касается быстродействия - то оно улучшится в обещаные 2-3 раза, можете проверить.

Это, в принципе, все, что я хотел рассказать. Этой статьей я не преследую цель агитировать всех разработчиков использовать нативные шаблоны. Я всего лишь показываю разницу между этими подходами. Если после всего сказанного вы продолжаете считать, что Smarty лучше (удобнее, понятнее, быстрее :-) нативных шаблонов — используйте на здоровье. Но в таком случае я бы посоветовал вам задуматься о собственной профпригодности.

Также, если вас заинтересовала данная тема, предлагаю ознакомиться со следующими ссылками:

О шаблонных механизмах на форуме «ПЫХА.РУ»
Прощай Smarty, или простой шаблонизатор в блоге «LARIN.in»
Шаблоны в PHP для чайников на «Spectator.ru»

 −4
+6 

siger, 7-го октября 2008 года в 16:48

Вообще-то, прежде чем писать подобные статьи, неплохо было бы разобраться в предметной области...

Что такое Smarty

- Smarty - это компилирующий обработчик шаблонов.
- Шаблоны компилируются только один раз.
- Перекомпилируются только те шаблоны, которые изменились.

Smarty не транслирует PHP код, он его компилит(!!!)

Для управления компиляцией в классе Smarty есть такие переменные: $force_compile

Вывод: RTFM!

siger, 7-го октября 2008 года в 22:39

Одна из уникальных возможностей Smarty - компилирование шаблонов. Это означает, что Smarty читает файлы шаблонов и создает PHP-код на их основе. Код создаётся один раз и потом только выполняется. Поэтому нет необходимости в медленной обработке файл шаблона для каждого запроса. Каждый шаблон может пользоваться всеми преимуществами таких компиляторов PHP и кэшируюших решений, как eAccelerator, ionCube, mmCache, Zend Accelerator и прочих.

sap, 7-го октября 2008 года в 23:11

Да, шаблоны компилируются, я знаю. А вы когда-нибудь смотрели откомпилированный код? Видели насколько он неоптимизирован и полон излишеств?

siger, 8-го октября 2008 года в 15:06

Если сравнивать код вашего шаблона (с использованием вашего шаблонизатора) и скомпилированого шаблона Smarty, то разница в основном вот такая:

- в вашем шаблоне:
<?=$this->photos[$i]['id']?>

- в шаблоне Smarty:
<?php echo $this->_tpl_vars['v']['id']; ?>

По-моему, это не критично...

sap, 8-го октября 2008 года в 15:58

Посмотрите в первой части, там приведен код откомпилированного шаблона для данного случая.