Статьи

ДОМ против шаблона

Фредрик Холмстрём недавно опубликовал небольшой шаблонный движок , основанный на DOM-манипуляции. Несмотря на то, что существует множество шаблонизаторов, я считаю этот подход интересным. Концепция достаточно проста; Шаблон анализируется в объектную модель ( DOM ), и затем значения могут быть назначены им через код PHP. Основное отличие от традиционных шаблонизаторов (таких как Smarty ) заключается в том, что сам шаблон не имеет никаких императивов внутри. На самом деле, шаблон даже не нужно записывать в механизм шаблонов, чтобы его использовать — любая разметка может быть использована в качестве источника.

Поскольку шаблон не может содержать никакой логики представления, он заканчивается в отдельном месте (в коде PHP). Это делает разделение между представлением и логикой герметичным, что было главной идеей шаблонных движков в первую очередь. Другое преимущество заключается в том, что, поскольку нет манипуляций на уровне строк, практически невозможно случайно получить нарушения безопасности типа инъекций.

Шаблон может не знать логику представления, но нельзя сказать обратное. Чтобы связать значения с шаблоном, логика представления должна знать о внутренней структуре шаблона. Это означает, что если шаблон изменяется, то же самое должно быть и с логикой представления. Чтобы отделить эту зависимость, нам нужна какая-то абстракция.

К счастью, так получилось, что для этого есть очень удобный механизм; Идентификаторы элементов могут использоваться для адресации центральных узлов в разметке. Однако у них есть довольно раздражающее ограничение (для этого использования), что они должны быть глобально уникальными для документа . Тогда лучшим вариантом будет использование классов (атрибут HTML — я не говорю о классах PHP) для адресации элементов.

Самое замечательное в использовании классов — это то, что они очень ненавязчивы для разметки. Нужно будет добавить классы, но, поскольку они должны будут использовать центральные элементы в разметке, они будут первыми кандидатами на повторное использование в качестве фиксированных точек для правил CSS и для кода Javascript. Вместо того, чтобы быть лишними маркерами в HTML-коде, они активно помогают писать лучшую разметку.

Это звучит хорошо в теории, поэтому, чтобы увидеть, как это работает в реальности, я смоделировал небольшой прототип. Даже с очень ограниченным API, он обладает удивительно хорошей выразительностью:

Простая привязка переменной


$t = new Domling('<p class="hello"></p>');
$t->capture('hello')->bind("Hello World");
echo $t->render();
 
<p class="hello">Hello World</p>

Переключение блока

 
$t = new Domling('<p>Lorem Ipsum</p><p class="message">Hidden message</p>');
$t->capture('message');
echo $t->render();
 
<p>Lorem Ipsum</p>

Положить его обратно в

 
$t = new Domling('<p>Lorem Ipsum</p><p class="message">Hidden message</p>');
$block = $t->capture('message');
$block->bind();
echo $t->render();
 
<p>Lorem Ipsum</p>
<p class="message">Hidden message</p>

И зацикливание на блоке

 
$t = new Domling('<ul class="links"><li class="link"><a class="anchor" href="#">title</a></li></ul>');
$links = array(
  'Sitepoint' => 'http://www.sitepoint.com',
  'Example' => 'http://www.example.org?foo=bar&ding=dong');
foreach ($links as $title => $link) {
  $t->sequence('link', 'links')->bind(array('anchor:href' => $link, 'anchor' => $title));
}
echo $t->render();
 
<ul class="links">
<li class="link"><a class="anchor" href="http://www.sitepoint.com">Sitepoint</a></li>
<li class="link"><a class="anchor" href="http://www.example.org?foo=bar&amp;ding=dong">Example</a></li>
</ul>

Если вам интересно, вы можете получить полный исходный код для приведенных выше примеров здесь: http://php.pastebin.com/f76ba8d70

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