Темплейты: Блоки верхнего уровня (v 1.x)
Основные замечания
Каждый блок начинавется с его определения и заканчивается командой end
.
'end' [ 'skin' | 'view' | 'template' ]
Эта команда может опционально включать после себя тип блока. Например:
<% skin myskin %> <% view master uses data %> ... <% end view %> <% end %>
Т.о. мы закрыли 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) { ... }