Главная  /  Правка версии 3  /  Правка версии 4  /   /  Область пользователей

Отличия "Темплейты: Команды рендеринга (v 1.x)" вер. 3 сравн. вер. 4

Содержимое:

<!--toc-->
## Переменная
Простейшая команда темплейта - отобразить переменную. Синтаксис тривиален:
VARIABLE
Например, если необходимо отобразить содержимое значения `message`, достаточно написать:
<% message %>
Это, в действительности, транслируется в следующий код C++:
out()<<cppcms::filters::escape(content.message);
, где функция `escape` записывает в поток переменную-член содержимого `message` и экранирует специальные HTML-символы `<`, `>`, `&`, `"` в их HTML представление - такое как `&lt;`
Если необходимо получить значение какого-либо свойства, достаточно написать:
<% some_property() %>
, которое транслируется в:
out()<<cppcms::filters::escape(content.some_property());
## Переменная с фильтрами
Вы можете добавить произвольные фильтры отображаемой переменной. Синтаксис следующий:
VARIABLE [ '|' filter [ '|' filter ] ... ]
, где `filter`:
[ 'ext' ] NAME [ '(' ( VARIABLE | STRING | NUMBER ) [ ',' ( VARIABLE | STRING | NUMBER ) ] ... ]
### Описание
Если фильтры не указаны - переменная экранируется автоматичски, но если указаны - они будут использованы вместо экранирования.
Каждая переменная - в действительности создание или вызов специального объекта фильтра с указанными параметрами, где первый параметр - "фильтруемая" переменная, а другие - параметры фильтра. Например:
<% birthday | strftime("%d/%m/%Y") %>
Транслируется в:
out()<<cppcms::filters::strftime(content.birthday,"%d/%m/%Y");
Вы также можете конкатенировать фильтры, используя символ `|`:
<% birthday | strftime("%d %m %Y") | urlencode %>
Будет рендериться как:
out()<<cppcms::filters::urlencode(cppcms::filters::strftime(content.birthday,"%d/%m/%Y"));
Доступно множество предопределенных фильтров, см. ссылку на namespace [cppcms::filters](/cppcms_ref_v0_99_1/namespacecppcms_1_1filters.html).
Один из фильтров, о котором стоит упомянуть - фильтр `raw`, позволяющий записать выходную переменную в чистом виде без HTML-экранирования.
<% ready_html | raw %>
Переменная `ready_html` будет записана в выходной поток в чистом виде без экранирования HTML-символов, таких как `<`.
Вы можете указать произвольные внешние фильтры, определенные в классе `content`. Например:
namespace data {
struct page {
...
virtual string bbcode(string const &);
...
};
}
Затем, в темплейте можно указать:
<% class page uses data::page %>
<% template render() %>
<% message | ext bbcode %>
<% end %>
<% end %>
__Примечание:__ В платформе Windows динамически подгружаемые библиотеки (dll) не допускают неизвестные символы.
Поэтому, если необходима поддержка Windows, необходимо создать Ваши фильтры как виртуальные функции или обратные вызовы - типа `booster::function<>` чтобы предотвратить ссылочность на внешние символы.
## Интернационализация
### Синтаксис
'gt' STRING [ 'using' using-options ]
'ngt' STRING ',' STRING ',' VARIABLE [ 'using' using-options
, где `using-options`:
display-variable-block [ ',' display-variable-block [ ',' ... ] ]
Где `display-variable-block` - любая переменная из опциональных фильтров, описанных выше. Например:
<% gt "Press the button" %>
<% gt "Hello Dear {1}, we are glad to see you!" using name %>
<% gt "Hello <a href=\"{1}\">{2}</a> you have {3}" using link | urlencode , name , something %>
<% ngt "You have one apple","You have {2} apples",n using n %>
### Описание
`gt` -- `gettext` переводит данную строку в соответствии с локалью, определенной в выводимом потоке. Например:
<% gt "Press the button" %>
Будет переведено как "Press the button" в English-локали и "Нажмите кнопку" - в Russian-локали.
Можно указать дополнительные параметры, используя опцию `using`. Можно передать список, разделенный запятой, в том виде, в котором собирались отображаться переменные. Как обычно, можно использовать любые другие фильтры. "{1}", "{2}" и т.д., определяя очередность входных переменных. Для таких замен используется [`booster::locale::format`](/cppcms_ref_v0_99_1/classbooster_1_1locale_1_1basic__format.html) или [`cppcms::locale::format`](/cppcms_ref_v0_99_1/classcppcms_1_1locale_1_1basic__format.html) (в соответствии с backend'ом локализации, с которым компилировался CppCMS).
`ngt` -- `ngettext` переводит множественную форму данного целого, где первый параметр - единственное число, второй - множественное и третий должен быть используемой переменной.
_Примечание:_
1. При использовании `ngt` предполагается использование синтаксиса `using`, потому что необходимо обеспечить отображение действительного числа.
3. Для проверки направления текста можно использовать `<% if rtl %>` или `<% if not rtl %>`. В действительности, это эквивалент:
<% if (cppcms::locale::gettext("LTR",out().getloc())=="RTL") %>
Описание оператора `if` см. в дальнейшем тексте.
## Подключение других темплейтов
### Синтаксис
'include' IDENTIFIER '(' [ parameter [ ',' parameter ...] ] ')'
, где `parameter` - одно из VARIABLE, STRING или NUMBER. Например:
<% include title() %>
<% include parent::foo() %>
<% include bar(x,"test",-1.0) %>
### Описание
Эта команда позволяет включить в это место другие темплейты (в действительности вызывая другие функции-члены). Вы можете включить существующие реализации в родительские view для их расширения. Например:
<% view master uses data::master %>
<% template menu() %>
<li><a href="#1">Main</a></li>
<li><a href="#2">Products</a></li>
<% end template %>
<% template render() %>
<ul><% include menu() %></ul>
<% end template %>
<% end view %>
<% view sales uses data::sales extends master %>
<% template menu() %>
<% include master::menu() %>
<li><a href="#3">Orders</a></li>
<% end %>
<% end %>
Этот код расширяет menu, добавляя в него view `sales` с дополнительными опциями.
## Рендеринг форм
### Синтаксис
'form' ('as_p' | 'as_table' | 'as_ul' | 'as_dl' | 'as_space' | 'input' | 'begin' | 'end' ) VARIABLE
флаги `as_*` позволяют рендерить `cppcms::form` со специфичными разделителями, в то время как флаги `input`, `begin` и `end` - позволяют рендерить отдельную часть widget'а.
### Описание
Формы организованы как объект формы или набор widget'ов. Каждый набор может рендериться с использованием различных разделителей:
- `as_p` -- используя HTML-параграфы.
- `as_table` -- используя таблицы. _Примечание_: теги `<table>...</table>` не добавляются, пользователь должен указать их.
- `as_ul` -- как список (используя `<li>..</li>`). `<ul>..</ul>` - не определяются.
- `as_dl` -- как определяемый список. `<dl>`-тэги не определяются, используются `<dt>..</dt>` и `<dd>..</dd>`.
- `as_space` -- вставляет пробелы между элементами.
Например:
<table>
<% form as_table form.fields %>
</table>
<p><% form as_space form.submit_buttons %></p>
Может отрендериться как:
<table>
<tr><th>User Name:</th><td><input ... /></td></tr>
<tr><th>Password: </th><td><input ... /></td></tr>
</table>
<p><input ... value="Login" /> <input ... value="Forgot Password" /></p>
Иногда, необходимо выполнить произвольный рендеринг widget'ов, не предопределенный из этого списка.
В этом случае можно рендерить только поле `<input ...>` вызывая
<% form input some_button %>
, который отрендериться в виде:
<input type="submit" name="_3" value="Press" />
Заметьте, `input` - не означает строгое ограничение для widget'ов, использующих HTML-тег `input`, он работает в любых других widget'ах, ограниченных только фактическим рендерингом содержимого без "help"-сообщений. Например, для widget'а
`cppcms::widgets::textarea` это будет `<textarea ...>some text</textarea>`
Иногда, необходим более точный доступ к визуализируемым частям widget'а, например, необходимо добавить некоторые атрибуты для widget'а в view.
Вы можете рендерить `begin` или `end` часть widget'а так, что можно будет вставить между ними HTML-атрибуты или даже JavaScript:
<% form begin some_button %> onclick="return foo()" <% form end some_button %>
Который рендериться как
<input type="submit" name="_3" onclick="return foo()" value="Press" />
Для генерации произвольного HTML для widget'ов, всегда можно использовать свойства widget'а напрямую:
<input type="submit" name="<% button.name() %>" value="Press" /> ( <% button.help() %> )
См.: [`cppcms::widgets` namespace](/cppcms_ref_v0_99_1/namespacecppcms_1_1widgets.html) для описания специфичных свойств widget'а.
## Selecting HTML/XHTML
## Выбор генерации HTML/XHTML
Вы можете запросить генерацию HTML- или XHTML-кода в формах, используя следующую команду:
( 'xhtml' | 'html' )
Заметьте, эта команда распространяется глобально на весь темплейт не соединяясь с определенным классом. Вы должны включить ее в самый верхний класс Вашего view.
<% c++ #include "all_data.h" %>
<% xhtml %>
<% skin %>
<% view master uses data::master %>
<% template render() %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
На данный момент, эта опция влияет только на генерацию кода форм.
## Встраивание кода C++
Вы всегда можете встроить любой C++-код, используя:
"c++" any-c++-statement
Например:
<% c++ #include "all_content.h" %>
__Примечания:__
1. Если хотите ссылаться в коде на переменные содержимого темплейта, не забудьте использовать `content` член класса. Например:
<% a %> + <% b %> = <% c++ out()<<content.a+content.b; %>
2. Вообще, использовать С++-код в темплейте нежелательно. Используйте его только в крайней необходимости.
3. Если необходимо использовать специальные условия, предпочтительнее использовать специальный оператор if, чем `<% c++ if() { %>...<% c++ } %>`

Проект

CppCMS является основой веб-разработки для выполнения ресурсоемких приложений.

Размещение

SourceForge.net Logo

Поддержать проект

CppCMS needs You


Навигация

Главная страница


Валидация CSS | Валидация XHTML 1.0