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

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

Содержимое:

<!--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());
## Переменная с фильтрами
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++ } %>`

Проект

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

Размещение

SourceForge.net Logo

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

CppCMS needs You


Навигация

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


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