<!--toc--> |
|
## Переменная |
|
Простейшая команда темплейта - отобразить переменную. Синтаксис тривиален: |
|
VARIABLE |
|
Например, если необходимо отобразить содержимое значения `message`, достаточно написать: |
|
<% message %> |
|
Это, в действительности, транслируется в следующий код C++: |
|
out()<<cppcms::filters::escape(content.message); |
|
, где функция `escape` записывает в поток переменную-член содержимого `message` и экранирует специальные HTML-символы `<`, `>`, `&`, `"` в их HTML представление - такое как `<` |
|
Если необходимо получить значение какого-либо свойства,достаточно написать: |
Если необходимо получить значение какого-либо свойства, достаточно написать: |
|
<% some_property() %> |
|
, которое транслируется в: |
|
out()<<cppcms::filters::escape(content.some_property()); |
|
|
## Переменная с фильтрами |
|
You can add arbitrary filters to the variable you show. The syntax is following: |
Вы можете добавить произвольные фильтры отображаемой переменной. Синтаксис следующий: |
|
VARIABLE [ '|' filter [ '|' filter ] ... ] |
|
Where `filter` is |
, где `filter`: |
|
[ 'ext' ] NAME [ '(' ( VARIABLE | STRING | NUMBER ) [ ',' ( VARIABLE | STRING | NUMBER ) ] ... ] |
|
### Description |
### Описание |
|
If no filters, are given the variable is automatically escaped, but if you provide any filter they are used instead |
of escaping. |
Если фильтры не указаны - переменная экранируется автоматичски, но если указаны - они будут использованы вместо экранирования. |
|
Each variable is actually a creation or call |
of special filter object with given parameters, |
where first parameter is the "filtered" variable and |
others are filter parameters. For example: |
Каждая переменная - в действительности создание или вызов специального объекта фильтра с указанными параметрами, где первый параметр - "фильтруемая" переменная, а другие - параметры фильтра. Например: |
|
<% birthday | strftime("%d/%m/%Y") %> |
|
Is translated into: |
Транслируется в: |
|
out()<<cppcms::filters::strftime(content.birthday,"%d/%m/%Y"); |
|
You can also concatenate filters using pipe symbol: |
Вы также можете конкатенировать фильтры, используя символ `|`: |
|
<% birthday | strftime("%d %m %Y") | urlencode %> |
|
Would be rendered as: |
Будет рендериться как: |
out()<<cppcms::filters::urlencode(cppcms::filters::strftime(content.birthday,"%d/%m/%Y")); |
|
There is a set of filters predefined available for you, see [cppcms::filters](/cppcms_ref_v0_99_1/namespacecppcms_1_1filters.html) namespace reference. |
Доступно множество предопределенных фильтров, см. ссылку на namespace [cppcms::filters](/cppcms_ref_v0_99_1/namespacecppcms_1_1filters.html). |
|
One of the filters that are worth to notice is `raw` filter |
that allows write an output variable as-is without |
HTML escaping. |
Один из фильтров, о котором стоит упомянуть - фильтр `raw`, позволяющий записать выходную переменную в чистом виде без HTML-экранирования. |
|
<% ready_html | raw %> |
|
The `read_html` variable would be written as-is to output |
stream without escaping HTML symbols like `<`. |
Переменная `ready_html` будет записана в выходной поток в чистом виде без экранирования HTML-символов, таких как `<`. |
|
You can specify arbitrary external filters that are defined in `content` class. For example: |
Вы можете указать произвольные внешние фильтры, определенные в классе `content`. Например: |
|
namespace data { |
struct page { |
... |
virtual string bbcode(string const &); |
... |
}; |
} |
|
Then in template we can specify: |
Затем, в темплейте можно указать: |
|
<% class page uses data::page %> |
<% template render() %> |
<% message | ext bbcode %> |
<% end %> |
<% end %> |
|
__Note:__ Under Windows platform, dynamically loaded libraries (dll) do not allow undefined symbols. |
Thus, if you want to support Windows, you should create your filters as virtual functions or |
callbacks like `booster::function<>` in order to prevent referring to external symbol. |
__Примечание:__ В платформе Windows динамически подгружаемые библиотеки (dll) не допускают неизвестные символы. |
Поэтому, если необходима поддержка Windows, необходимо создать Ваши фильтры как виртуальные функции или обратные вызовы - типа `booster::function<>` чтобы предотвратить ссылочность на внешние символы. |
|
## Internationalization |
## Интернационализация |
|
### Syntax |
### Синтаксис |
|
'gt' STRING [ 'using' using-options ] |
'ngt' STRING ',' STRING ',' VARIABLE [ 'using' using-options |
|
Where `using-options` is: |
, где `using-options`: |
|
display-variable-block [ ',' display-variable-block [ ',' ... ] ] |
|
Where `display-variable-block` is any variable is optional filters as described above. For example: |
Где `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 %> |
|
### Description |
### Описание |
|
`gt` -- `gettext` translates given string according to locale defined in the output stream. For example: |
`gt` -- `gettext` переводит данную строку в соответствии с локалью, определенной в выводимом потоке. Например: |
|
<% gt "Press the button" %> |
|
Would be translated as "Press the button" in English locale and "Нажмите кнопку" under Russian locale. |
Будет переведено как "Press the button" в English-локали и "Нажмите кнопку" - в Russian-локали. |
|
You can specify additional parameters using `using` option. You provide a list of comma separated values |
as you would display a variable. You can use any other filters as usual. "{1}", "{2}" etc, specify the order of |
input variables. It uses [`booster::locale::format`](/cppcms_ref_v0_99_1/classbooster_1_1locale_1_1basic__format.html) or [`cppcms::locale::format`](/cppcms_ref_v0_99_1/classcppcms_1_1locale_1_1basic__format.html) for such substitutions (according to localization backend |
CppCMS compiled with.) |
Можно указать дополнительные параметры, используя опцию `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` translate plural form for given integer. Where first parameter is single form, second plural and the |
third should be the variable is used. |
`ngt` -- `ngettext` переводит множественную форму данного целого, где первый параметр - единственное число, второй - множественное и третий должен быть используемой переменной. |
|
_Notes:_ |
_Примечание:_ |
|
1. When you use `ngt` you encouraged to use `using` syntax, because you should provide an actual number to display. |
3. You may use `<% if rtl %>` or `<% if not rtl %>` in order to test direction of text. This is actually equivalent to: |
1. При использовании `ngt` предполагается использование синтаксиса `using`, потому что необходимо обеспечить отображение действительного числа. |
3. Для проверки направления текста можно использовать `<% if rtl %>` или `<% if not rtl %>`. В действительности, это эквивалент: |
|
<% if (cppcms::locale::gettext("LTR",out().getloc())=="RTL") %> |
|
See `if` statement for further description. |
Описание оператора `if` см. в дальнейшем тексте. |
|
## Including other templates |
## Подключение других темплейтов |
|
### Syntax |
### Синтаксис |
|
'include' IDENTIFIER '(' [ parameter [ ',' parameter ...] ] ')' |
|
Where `parameter` is one of VARIABLE, STRING or NUMBER. For example: |
, где `parameter` - одно из VARIABLE, STRING или NUMBER. Например: |
|
<% include title() %> |
<% include parent::foo() %> |
<% include bar(x,"test",-1.0) %> |
|
### Description |
### Описание |
|
This command allows inclusion of other templates in place (actually calling other member functions.) You can include existing implementation in parent views |
in order to extend them. For example: |
Эта команда позволяет включить в это место другие темплейты (в действительности вызывая другие функции-члены). Вы можете включить существующие реализации в родительские 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 %> |
|
The above code extends menu for view `sales` with an additional option. |
Этот код расширяет menu, добавляя в него view `sales` с дополнительными опциями. |
|
## Rendering Forms |
## Рендеринг форм |
|
### Syntax |
### Синтаксис |
|
'form' ('as_p' | 'as_table' | 'as_ul' | 'as_dl' | 'as_space' | 'input' | 'begin' | 'end' ) VARIABLE |
|
`as_*` flags allow you to render `cppcms::form`, with |
specific delimiters, when `input`, `begin` and `end` flags |
allow you to render single part of the widget. |
флаги `as_*` позволяют рендерить `cppcms::form` со специфичными разделителями, в то время как флаги `input`, `begin` и `end` - позволяют рендерить отдельную часть widget'а. |
|
### Description |
### Описание |
|
Forms are organized as form object or sets of widgets. Each set can be rendered using different delimiters: |
Формы организованы как объект формы или набор widget'ов. Каждый набор может рендериться с использованием различных разделителей: |
|
- `as_p` -- use HTML paragraphs. |
- `as_table` -- use table. _Note_: `<table>...</table>` tags are not added user should specify them. |
- `as_ul` -- as list (using `<li>..</li>`). `<ul>..</ul>` are not specified. |
- `as_dl` -- as definition list. `<dl>` tags are not specified, `<dt>..</dt>` and `<dd>..</dd>` are used. |
- `as_space` -- put blanks between elements. |
- `as_p` -- используя HTML-параграфы. |
- `as_table` -- используя таблицы. _Примечание_: теги `<table>...</table>` не добавляются, пользователь должен указать их. |
- `as_ul` -- как список (используя `<li>..</li>`). `<ul>..</ul>` - не определяются. |
- `as_dl` -- как определяемый список. `<dl>`-тэги не определяются, используются `<dt>..</dt>` и `<dd>..</dd>`. |
- `as_space` -- вставляет пробелы между элементами. |
|
For example: |
Например: |
|
<table> |
<% form as_table form.fields %> |
</table> |
<p><% form as_space form.submit_buttons %></p> |
|
May be rendered as: |
Может отрендериться как: |
|
<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> |
|
Sometimes you want to perform custom rendering |
of widgets that is not predefined by this list. |
In such case you may render only `<input ...>` field |
of the widget but calling |
|
Иногда, необходимо выполнить произвольный рендеринг widget'ов, не предопределенный из этого списка. |
В этом случае можно рендерить только поле `<input ...>` вызывая |
<% form input some_button %> |
|
Which would be rendered like this: |
, который отрендериться в виде: |
|
<input type="submit" name="_3" value="Press" /> |
|
Note, `input` does not strictly means that it is limited |
for widgets using HTML `input` tag, it works for for |
any other widget just limited to actual content rendering |
without "help" messages, for example, for widget |
`cppcms::widgets::textarea` it would be `<textarea ...>some text</textarea>` |
Заметьте, `input` - не означает строгое ограничение для widget'ов, использующих HTML-тег `input`, он работает в любых других widget'ах, ограниченных только фактическим рендерингом содержимого без "help"-сообщений. Например, для widget'а |
`cppcms::widgets::textarea` это будет `<textarea ...>some text</textarea>` |
|
Sometimes you need even more fine grained access |
to widget rendering parts, for example you may |
want to add some attributes to the widget in the view. |
Иногда, необходим более точный доступ к визуализируемым частям widget'а, например, необходимо добавить некоторые атрибуты для widget'а в view. |
|
You may render `begin` or `end` part of the widget, such that you can insert HTML attributes between them or even JavaScript. |
Вы можете рендерить `begin` или `end` часть widget'а так, что можно будет вставить между ними HTML-атрибуты или даже JavaScript: |
|
<% form begin some_button %> onclick="return foo()" <% form end some_button %> |
|
Which would be rendered as |
Который рендериться как |
|
<input type="submit" name="_3" onclick="return foo()" value="Press" /> |
|
|
For generation of custom HTML for widgets you can |
always use widget properties directly: |
Для генерации произвольного HTML для widget'ов, всегда можно использовать свойства widget'а напрямую: |
|
<input type="submit" name="<% button.name() %>" value="Press" /> ( <% button.help() %> ) |
|
See: [`cppcms::widgets` namespace](/cppcms_ref_v0_99_1/namespacecppcms_1_1widgets.html) for documentation of |
each specific widget properties. |
См.: [`cppcms::widgets` namespace](/cppcms_ref_v0_99_1/namespacecppcms_1_1widgets.html) для описания специфичных свойств widget'а. |
|
|
|
## Selecting HTML/XHTML |
|
You may request generation HTML or XHTML code in forms using following command: |
Вы можете запросить генерацию HTML- или XHTML-кода в формах, используя следующую команду: |
|
( 'xhtml' | 'html' ) |
|
Note, this command has global effect on all template without connection to specific class. You should include it |
in the topmost class of your view. |
Заметьте, эта команда распространяется глобально на весь темплейт не соединяясь с определенным классом. Вы должны включить ее в самый верхний класс Вашего 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"> |
|
Currently, this option affects only forms code generation. |
На данный момент, эта опция влияет только на генерацию кода форм. |
|
## Injecting C++ Code |
## Встраивание кода C++ |
|
You can always inject any kind of C++ code using: |
Вы всегда можете встроить любой C++-код, используя: |
|
"c++" any-c++-statement |
|
For example: |
Например: |
|
<% c++ #include "all_content.h" %> |
|
__Notes:__ |
__Примечания:__ |
|
1. If you want to refer to content variables in your code, do not forget to use `content` member of your class. For example: |
1. Если хотите ссылаться в коде на переменные содержимого темплейта, не забудьте использовать `content` член класса. Например: |
|
<% a %> + <% b %> = <% c++ out()<<content.a+content.b; %> |
2. Generally you should not use C++ code in template, use it if it is absolutely necessary. |
3. If you want use special conditions prefer specialized if statement over `<% c++ if() { %>...<% c++ } %>` |
|
|
2. Вообще, использовать С++-код в темплейте нежелательно. Используйте его только в крайней необходимости. |
3. Если необходимо использовать специальные условия, предпочтительнее использовать специальный оператор if, чем `<% c++ if() { %>...<% c++ } %>` |
|