Движок шаблонов
См. также: Создание ШкурОписание
Движок шаблонов в НПЖ достаточно развит (авторы утверждают, что он так же крут, как Smarty), т.к., являясь частью движка Manifesto, использовался для построения большого числа сайтов. В дальнейшем движок Manifesto послужил основой для движка Rocket, составной частью которого стал движок шаблонов RocketTE, основанный на рассматриваемом д.ш., но значительно переработанный, также в части синтаксиса. Т.о. движок шаблонов в НПЖ представляет собой в известной степени legacy code. Шаблоны используются в контексте шкуры (это важно понимать!)
Если управление передано модулю, то модуль может создавать собственный экземпляр TemplateEngine, с помощью которого будут парситься шаблоны, находящиеся в каталогах модуля. При этом общие шаблоны НПЖ по-прежнему парсятся с помощью
$rh->tpl.
Структура каталогов
Для обработки шаблонов используются
- Движок (базовый класс /core/classes/TemplateEngine.php)
- Собственно шаблоны (html-файлы, находятся в папках /npj/themes/название_шкуры/templates)
Основы синтаксиса
Синтаксис д.ш. где-то описан более подробно, возможно создателями. Здесь указываю только те конструкции, которые использую сам.
Этот кусок в html! Поправить форматтер
<style type="text/css">div { } p#templ1 {background:#dcdcdc; color: black; font-size:110%; margin:0; padding:0 0 5px 0;} p#templ2 {background:#a9a9a9; color: black; font-size:110%; margin:0; padding:0 0 5px 0;}</style>
<p id="templ1">
Unknown action "@template.html" – включить файл template.html в тело шаблона. (Примечание! при наличии вложенных папок внутри папки templates, путь следует указывать от ее корня, даже если ссылающийся файл находится в одном каталоге с файлом, который включается)</p>
<p id="templ2">
Unknown action "&js:myscript" – включить файл со скриптом из каталога js</p>
<p id="templ1">
Unknown action "Variable" – при парсинге вместо этой конструкции подставляется значение переменной</p>
<p id="templ2">
Unknown action "??Variable" ...
Unknown action "??!Variable" ...
Unknown action "??/Variable" – аналогично if (isset(Variable)) { ... } else { ... } – парсит только отдельные фрагменты шаблона в зависимости от наличия переменной.</p>
<p id="templ1">
Unknown action "?Variable" ...
Unknown action "?/" – сокращенная форма записи</p>
<p id="templ2">
Unknown action "#Magic" – вызвать «мэджик» (если необходимо, чтобы мэджик вывел какое-то значение в шаблон, он должен сделать это явно с помощью echo/print, иначе мэджик ничего в шаблон не выводит. Еще один вариант, когда мэджик вызвает функцию парсинга некоторого подшаблона или другого шаблона, тогда распарсенный фрагмент будет доступен в контексте шаблонов и может быть включен в выводимую страницу)</p>
<p id="templ1">
Unknown action "TEMPLATE:TemplateName" ...
Unknown action "/TEMPLATE:TemplateName" – подшаблонка (допускаются вложенные конструкции)</p>
- Переменные становятся доступными из шаблона после вызова функции ($rh->)$tpl->Assign(«Variable», value); на уровне обработки данных (включая «мэджики»).
- Шаблоны парсятся при вызове функции ($rh->)$tpl->Parse(«tamplate.html:TemplateName"); где template.html соответствует файлу шаблона в папке templates, а выражение TemplateName – подшаблону, начало которого указано в файле шаблона с помощью конструкции Formatter «highlight/vti» not found
Инициализация
В конструкторе
$rh одним из последних создается объект
$rh->tpl = &new TemplateEngine(&$this);
Порядок парсинга шаблонов
Первым парсится шаблон html.html. Помимо него в каталоге templates могут располагаться файлы record.html, record.comments.html и другие. Все они должны включаться в шаблон html.html напрямую или через вызов «мэджика» (например, таким образом: <? echo $tpl->Parse(«layout/sidebar.html:Guest"); ?>
Статы
«Статы», как их называют создатели НПЖ в комментариях к коду, это переменные, доступные из шаблона страницы, в которых хранятся данные о загруженной странице. Задаются они в методе UtilitySkin::AssignRecordStats(). В родных шкурах этот метод вызывается в мэджике (tpl_magic) Path, что имхо очень неправильно, т.к. этот мэджик выводит пермалинк, а инициализация «статов» оказывается побочным эффектом (причем далеко не очевидным – поди найди, где это, если заранее не знаешь). «Статы» же могут использоваться и дальше – и используются. Поэтому в своих шкурах я выношу инициализацию статов в отдельный мэджик.
Вот какие они бывают:
- Record.Stats.Address – адрес загруженной страницы
-
- Record.Stats.Security – доступ
- Record.Stats.Security.Icon
- Record.Stats.Security.IsPublic
-
- Record.Stats.Journal0 – пользователь
- Record.Stats.Journal1 – сообщество (?)
- Record.Stats.Journal2 – рабочая группа
-
- Record.Stats.ChangedByName – имя (точнее, user_name) редактировавшего последним
- Record.Stats.ChangedBy – очевидно, id
- Record.Stats.ChangedDT – timestamp последней редакции
- Link:Record.Stats.ChangedBy – ссылка на журнал последнего редактировавшего
-
- Record.Stats.Type – ?
- Record.Stats.TypeName
-
- Record.Stats.Ref
TemplateEngine в Manifesto и RocketTE
Про Template Engine в Rocket (т.н. RocketTE) читать
здесь.
О синтаксисе разметки шаблонов в Rockette см.
здесь (ссылка, которая в тексте про ракету, не работает).