Темплейты: Блоки верхнего уровня (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)
{
...
}
