Темплейты: Основные принципы (v 1.x)
Базовая структура файла темплейта CppCMS
Собирая темплейты, мы кладем их контент в их собственный skin
. Поэтому, собирая любой темплейт - мы указываем его имя skin'а как команду первого уровня. Каждый skin представлен раздельными namespace'ами в C++. Т.о. имя skin'а - в действительности является именем namespace'а C++.
Второй уровень - view
(класс C++). Каждая view с ее собственным skin'ом представляет собой определенную страницу, которая должна рендериться.
Каждый skin должен осуществлять виртуальную функцию render()
, кроме случаев, когда она уже применялась в его родительском классе.
Каждая view представляет собой отдельный класс, наследуемый из cppcms::base_view
в самом верхнем родителе.
Например:
<% skin purple %> <% view master uses data::master %> <% template render() %> ... <% end template %> <% end view %> <% end skin %>
Все view могут быть организованы в иерархию наследования. Например, возможна следующая иерархия типичного блога:
[master] / \ [page] [summary] / \ / \ [post] [info.] [archive] [recent_posts]
Где master
определяет основное оформление страницы --- тему. page
используется для отображения основной страницы в блоге, на которой может быть post
или info
-- информационные страницы. С другой стороны summary
- представляет собой список последних постов или архив по категориям.
Каждая наследумая view может переопределять свои родительские темплейты, которые в действаительности являются виртуальными функциями.
Синтаксис
HTML и разделение средств управления
Система теемплейтов CppCMS основывается на HTML-страницах с вставленными командами управления потоком между тегами <% %>
.
Каждая команда темплейта начинается с <%
и должна закрываться %>
в одной строке.
Каждая команда темплейта должна закрываться этими "скобками".
Например --- правильный код:
<% if not empty Name %> Hello <% Name %> <% else %> Hello Visitor <% end %>
Неправильно совмещать различные команды. Например так:
Hello <% if not empty name ; name ; else %>Visitor<% end %>
Вы также не должны переносить команду на следующие строки. Следующее неверно:
<% if not empty name %> Not empty <% end %>
Символы внутри команд не должны содержать %
или >
. Их можно добавлять в двойных кавычках по правилам экранирования C++/C. Например:
<% number | intf("<%04x>") %>
Правила описания синтаксиса
Синтаксис описания команд темплейта делается следующим образом:
- Все ключевые слова будут отражаться маленьким регистром в одинарных кавычках. Например 'skin'
- NAME - это последовательность букв латиницы, цифр и подчеркивания, начинающаяся с буквы. Она представляет собой идентификаторы и может быть определена регулярным выражением:
[a-zA-Z][a-zA-Z0-9_]*
. Напримерskin_1
. - VARIABLE - это непустая последовательность идентификаторов (NAMES) разделенных точкой "
.
" или "->
", которая может опционально завершаться()
или начинаться с*
для идентификации результата вызова функции. Пробелы запрещены. Например:data->point.x
,something.else()
*foo.bar
. - STRING - это стандартная строка C++/C со стандартными символами экранирования вроде
"Hello \"World\""
. Замечание: Конкатенация строк типа"Hello " "World"
невозможна - это эквивалент"Hello World"
. - NUMBER - это номер -- последовательность цифр, которая может начинаться с
-
и включать.
. Ее можно определить регулярным выражением:\-?\d+(\.\d*)?
- IDENTIFIER - это последовательность идентификаторов (NAME) разделенных символом
::
. Пробелы запрещены. Например:data::page
- Все символы пунктуации, помещенные в одинарные кавычки - такие как
','
. - Необязательные элементы указываются в квадратных скобках
[]
, а обязательные - используя круглые скобки()
. Опции разделяются символом|
. Нет оганичений на пробелы между словами.
Например:
'view' NAME 'uses' IDENTIFIER ['extends' NAME]
Означает, что допустимы следующие определения:
<% view page uses data::page extends master %> <% view test uses data::test %> <% view test uses data_test %>
, а эти - недопустимы:
<% view 1page uses data::page extends master %> <% view page %> <% view page uses data::page extends other::master %>