Темплейты: Основные принципы (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 %>
