Шаблонизатор VMX::Template/Старая PHP версия

Материал из YourcmcWiki
Перейти к: навигация, поиск

Данный документ сохранён по историческим причинам. Можно порадоваться тому, что я писал в 18 лет. Код сей радости: http://svn.yourcmc.ru/viewvc.py/vitaphoto/archive/template-2006-09-13.php

Написано 2006-09-13.

Прекрасный движок шаблонов

Здесь вы не увидите того безобразия, которое творят Index.Generate и Index.Compile.

Почему безобразия?

Потому что в результате использования I.GC вы не получите настоящего разделения дизайна, движка и базы данных. Не говоря уже о том, что структура баз данных, используемых скриптами, генерируемыми I.GC — примитивна настолько, что если производительность остаётся на уровне — значит, вам просто повезло. Конечно, и там есть возможность исполнять произвольные SQL запросы…

Что вы увидите здесь?

Здесь вы увидите позаимствованный из форума phpBB движок шаблонов. Однако достаточно сильно мутировавший. Кстати, источником синтаксиса шаблонов является не phpBB, а PHPLib: «The interface was originally inspired by PHPLib templates, and the template file formats are quite similar» — данные строки вы можете прочесть, открыв template.php в текстовом редакторе.

Синтаксис этих шаблонов прост и понятен настолько, что их может составлять человек, совсем не имеющий отношения к PHP-программированию. Конечно, лучше, чтобы эти навыки у него присутствовали. Однако с template.PHP они стали необязательны.

Документации в самом файле template.php вы не найдёте. Однако, краткая информация и комментарии к коду, а также, что немаловажно, к параметрам класса, там есть.

Идея

Идея движка шаблонов template.php в том, что скрипты, осуществляющие взаимодействие с базой данных и выводящие веб-страницы, не должны задумываться об HTML-коде страницы. Ну, или практически не должны. Такое разделение способствует хорошей структуре кода, всего веб-приложения, а также позволяет минимизировать сложность смены дизайна.

ТО ЕСТЬ, мы имеем разделение веб-приложения на 3 части:

  • Движок (скрипты)
  • Дизайн (шаблоны)
  • Данных (База данных. Например, MySQL)

Стоит отметить, что даже при разработке сложных систем, когда Апач (Apache) заменяется на Томкат (Tomcat), PHP заменяется на JSP и сервлеты (servlets), а MySQL на Oracle — данная модель разделения остаётся в силе. Правда, называется уже по-другому и куда более заумно :) однако, сейчас мы не будем останавливаться на таких деталях.

Техническая сторона вопроса

Итак, скриптовый движок сайта выводит данные в шаблон. Как он это делает? Очень просто. С помощью двух средств: подстановок и блоков. Подстановка — это просто сопоставление некоторой строки некоторому имени «переменной». Эти «переменные» подставляются во время генерации страницы вместо строк вида «{VARIABLE}».

Но, спросите вы, как же организовать циклический и условный вывод информации?

В template.php для этого принята очень простая и красивая схема: блоки.

Каждый блок:

  • имеет имя.
  • начинается строкой <!-- BEGIN block --> и заканчивается строкой <!-- END block -->, где block — имя блока.
  • содержит подстановки — в коде шаблона внутри блока block, т.е между его началом и концом, {block.VARIABLE} заменится на значение подстановки VARIABLE текущей итерации блока.
  • может содержать вложенные блоки.
  • повторится в выходном HTML коде ровно столько раз, сколько итераций блока задаст скрипт при подготовке страницы к выводу.

Таким образом, циклический вывод реализуется просто как задание необходимого числа итераций блоку, а условный — как либо задание 1 итерации блоку, либо не_задании ни одной итерации.

Блоки могут быть вложенные. На каждой итерации своего родительского блока вложенный блок, разумеется, может иметь разное наполнение.

Но ведь символы { и } станет невозможно использовать! — скажете вы. Но окажетесь неправы. На это есть две причины:

Первая причина. template.php предназначен для генерации HTML кода, а в HTML есть возможность вместо любого символа написать т. н. «entity» &#NNN; где NNN — десятичный Unicode-код этого символа. То есть, вместо { вы можете спокойно писать { — и получите свою скобку целой и невредимой.

Вторая причина. Синтаксис подстановки строго определён. Каждое имя блока и имя переменной может содержать только латинские символы от a до z, от A до Z, цифры и знак подчёркивания. Следовательно, если, например, между скобками присутствует хотя бы один пробел — подстановкой это уже считаться не будет.

Внесённые изменения

Если рассматривать template.PHP в том исполнении, в котором он представлен в коде форума phpBB, его возможности очень ограничены. Строго говоря, кроме подстановок и блоков, там больше ничего и нет.

Однако задумаемся над следующим вопросом: что будет, если нам понадобится разбить все итерации блока на несколько частей, что требуется, к примеру, при выводе информации в несколько колонок? Правильно. Без помощи скриптов это сделать нельзя.

Но в данную версию включена команда <!-- BEGIN block MOD div mod -->, которая обрабатывает в цикле не все итерации блока block, а все, номер которых по модулю div равны mod.

Ещё одним существенным недостатком phpBB-шной версии template.php являлся тот факт, что <!-- BEGIN ... --> и <!-- END ... --> должны были всегда располагаться на отдельных строках каждая. В данной версии команды могут находиться даже на одной строке.

Команда <!-- INCLUDE filename --> полезна тем, кто любит структуру во всём, даже в шаблонах. Однако не стоит ей злоупотреблять — производительность от её использования только снижается…

Чрезвычайно полезна возможность включения прозрачного кэширования компилированного кода шаблонов. Ведь данный движок работает так: сначала происходит компиляция шаблона в PHP-код, а потом этот код выполняется интерпретатором PHP. Компиляция происходит при каждом обновлении страницы, что, конечно, сильно влияет на производительность системы в целом. Кэширование компилированного кода позволяет решить эту проблему. Производится оно прозрачно, достаточно лишь задать рабочую директорию для кэша.

Единственное замечание: так как одной версии одного шаблона соответствует один файл в кэше, при внесении изменений в шаблоны кэш увеличивается, следовательно, если ваша система постоянно развивается — время от времени кэш желательно очищать. Нет, он, скорее всего, не займёт даже десяти мегабайт, но для порядка…

Итак, выше перечислены основные исправления, внесённые в оригинальную версию. Остальные, я надеюсь, вы увидите в руководстве по использованию template.PHP, которое я намерен в скором времени написать…

Очень краткий обзор управляющих команд

{VAR}
подстановка корневой переменной VAR
<!-- INCLUDE filename -->
дословное включение файла «filename»
<!-- BEGIN блок1 -->
обработать в цикле все итерации блока «блок1»
<!-- BEGIN блок1 AT <начало>[ <количество>] -->
обработать в цикле <количество> (или все оставшиеся если <количество> не задано) итераций блока «блок1»
<!-- BEGIN блок1 MOD <делитель> <остаток> -->
обработать в цикле все итерации блока «блок1», номера которых по модулю <делитель> равны <остаток>
<!-- END блок1 -->
конец блока.
<!-- BEGIN ... --> и <!-- END ... --> могут быть расположены на одной строке.
{блок1.блок2.и_так_далее.VAR}
подстановка переменной VAR блока «блок1.блок2.и_так_далее»
{и_так_далее.#}
номер текущей итерации блока «блок1.блок2.и_так_далее», если «и_так_далее» сейчас вложен в «блок1.блок2»
{блок1.блок2.и_так_далее.VAR|VAR2}
подстановка переменной VAR, а если она не задана — то VAR2 блока «блок1.блок2.и_так_далее»
Комментарии
<!--# Комментарий уровня шаблона, не попадающий в выходной HTML файл #-->