<!--toc--> |
|
## Основные замечания |
|
Каждый блок начинавется с его определения и заканчивается командой `end`. |
|
'end' [ 'skin' | 'view' | 'template' ] |
|
Эта команда может опционально включать после себя тип блока. Например: |
|
<% skin myskin %> |
<% view master uses data %> |
... |
<% end view %> |
<% end %> |
|
Т.о. мы закрыли `skin` без типа блока и `view` со спецификацией. |
Т.о. мы закрыли `skin` без типа блока и `view` с его указанием. |
Это может использоваться как дополнительная проверка последовательности блоков. |
|
|
## skin |
|
### Синтаксис: |
### Синтаксис |
|
'skin' [NAME] |
|
Это самая верхняя команда каждого темплейта. |
`skin` может обозначаться специфичным именем или оно может отсутствовать, означая, что оно должно быть определено внешне в процессе сборки с использованием ключа `-s`. |
|
### Примечания |
|
- Если все созданные Вами skin'ы не собираются разделять любую часть с другим skin'ом, укажите его имя, иначе - опустите его и передайте в ключе. |
- Если вы передаете имя skin'а в ключе `-s` оно должно совпадать с именем skin'а, которое используется в команде skin. |
- Вы не можете использовать более одного имени skin'а в одной и той же компиляции `cppcms_tmpl_cc`. |
|
|
**Например:** |
|
Правильный пример 1: |
|
foo.tmpl: |
<% skin foo %> |
... |
<% end %> |
|
cppcms_tmpl_cc foo.tmpl -s foo |
|
Правильный пример 2: |
|
|
foo.tmpl: |
<% skin foo %> |
... |
<% end %> |
|
cppcms_tmpl_cc foo.tmpl |
|
Правильный пример 3: |
|
|
foo.tmpl: |
<% skin %> |
... |
<% end %> |
|
cppcms_tmpl_cc foo.tmpl -s foo |
|
|
Правильный пример 4: |
|
|
foo.tmpl: |
<% skin %> |
... |
<% end %> |
bar.tmpl: |
<% skin foo %> |
... |
<% end %> |
|
|
cppcms_tmpl_cc foo.tmpl bar.tmpl -s foo |
|
Неправильно - два различных skin'а в одной и той же компиляции: |
|
foo.tmpl: |
<% skin foo %> |
... |
<% end %> |
bar.tmpl |
<% skin bar %> |
... |
<% end %> |
|
cppcms_tmpl_cc foo.tmpl bar.tmpl |
|
Неправильно - неизвестное имя skin'а: |
|
foo.tmpl: |
<% skin %> |
... |
<% end %> |
|
cppcms_tmpl_cc foo.tmpl foo.tmpl |
|
|
|
## view |
|
### Синтаксис: |
### Синтаксис |
|
'view' NAME 'uses' IDENTIFIER ['extends' NAME] |
|
Создает новую view (класс C++) отвечающую за рендеринг содержимого страниц специфичного типа. `'uses' IDENTIFIER` определяет тип содержимого (какой-то объект наследуемый из `cppcms::base_content`) который должна рендерить эта view. В действительности, она определяет ссылочный элемент (reference member - прим.пер.) `content` этого типа. |
|
Запомните это примечание, в некоторых случаях, Вам потребуется напрямую обращаться к элементу `content`. |
|
Вы можете указать `'extends' NAME`, если требуется, чтобы новая создаваемая view наследовала другую view. |
|
### Ограничения наследования |
|
Когда Вы создаете наследуемую view, содержимое потомка также должно наследоваться из содержимого ее родителя. |
Например: |
|
<% view master uses data::master %> |
.. |
<% end view %> |
<% view page uses data::page extends master %> |
... |
<% end view %> |
|
Впоследствии, `data::page` _должен_ наследоваться из `data::master`. |
|
_Объяснение:_ |
|
Когда Вы создаете родителя `master`, Вам также и необходимо обеспечить для него содержимое. Он получает содержимое своего потомка, потому и может работать, т.к. содержимое потомка наследовалось из содержимого его родителя. |
|
### Сгенерированный код |
|
Сгенерированный код для двух описанных выше примеров выглядит примерно так: |
|
struct master :public cppcms::base_view |
{ |
data::master &content; |
master(std::ostream &_s,data::master &_content): |
cppcms::base_view(_s), |
content(_content) |
{ |
} |
... |
}; // end of class master |
struct page :public master |
{ |
data::page &content; |
page(std::ostream &_s,data::page &_content): |
master(_s,_content), |
content(_content) |
{ |
} |
... |
}; // end of class page |
|
## template |
|
### Синтаксис |
|
Определение темплейта состоит из его имени, круглых скобок и опционально - списка параметров, разделенных запятой: |
|
'template' NAME '(' [ parameter [',' parameter ... ] ] ')' |
|
, где `parameters` - это: |
|
IDENTIFIER ['const' ] ['&'] NAME |
|
Например: |
|
<% template render() %> |
<% template show_list(data::list_t const &list) %> |
<% template show_numbers(int x,int y, double z) %> |
|
Примечание: Вы не можете указывать параметры темплейта в виде `list<int>`, а должны определить тип для них. |
|
### Сгенерированный код |
|
Каждый темплейт транслируется в виртупльную функцию члена класса, в котором он наследуется. Эта функция возвращает `void` и получает определенные параметры. Т.о., `show_list` в вышеописанном примере будет транслирована в: |
|
virtual void show_list(data::list_t const &list) |
{ |
... |
} |
|
|
|