## Table Of Contents |
|
- [Variable](#var) |
- [Variable with Filters](#varflt) |
- [Internationalization with `gettext`](#gettext) |
- [Including other Templates](#incl) |
- [Rendering Forms](#forms) |
- [HTML/XHTML Selection](#xhtml) |
- [C++ Code Injection](#cpp) |
<!--toc--> |
|
## <span id="var"></span>Variable |
## Variable |
|
The simplest templates command is showing variable. The syntax is trivial: |
|
NAME |
|
For example, if you want to show a content value `message` just write: |
|
<% message %> |
|
It is actually translated to C++ code: |
|
cout<<escape(message); |
|
Where `escape` template function is defined as |
|
if parameter is std::string |
perform HTML escaping and return it. |
else if parameter is std::tm |
render it to string |
else |
render it using `std::ostringstram`, like cout<<v |
|
Thus, the shown variable can be from any type that can be written to `std::ostream`. |
|
## <span id="varflt"></span>Variable with filters |
## Variable with filters |
|
You can add arbitrary filters to the variable you show. The syntax is following: |
|
VARIABLE [ '|' filter [ '|' filter ] ... ] |
|
Where `filter` is |
|
[ '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 function call 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: |
|
cout<<strftime(content.birthday,"%d/%m/%Y"); |
|
Where `strftime(std::tm const &date,string format)` is a member function of `base_view` class, that every |
view class is derived from it. |
|
You can also concatenate filters using pipe symbol: |
|
<% birthday | strftime("%d %m %Y") | urlencode %> |
|
Would be rendered as: |
|
cout<<urlencode(strftime(content.birthday,"%d/%m/%Y")); |
|
You can specify arbitrary external filters that are defined in `content` class. For example: |
|
namespace data { |
struct page { |
... |
virtual string toupper(string const &); |
... |
}; |
} |
|
Then in template we can specify: |
|
<% class page uses data::page %> |
<% template render() %> |
<% message | escape | ext toupper %> |
<% 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 `boost::function<string(string)>` in order to prevent referring to external symbol. |
|
### Predefined filters |
|
There is a set of filters predefined for you in `base_view` class. |
|
- **`template<typename T> string escape(T const &v)`** |
This filters performs HTML escaping for `std::string`, rendering to string of `std::tm` or converting to string of |
any other "ostream writeable" object. This filter is applied by default if no other filters are given. |
- **`string raw(string s)`** |
Does nothing, returns `s`. It is used for bypassing default filter; |
- **`string intf(int value,string f)`** |
Format integer using `boost::format`. For example: |
|
<% n %> in decimal is <% n | intf("%x") %> in hexadecimal. |
- **`string strftime(std::tm const &time,string format)`** |
Convert `time` to string using strftime(3) function. |
- **`string data(std::tm const &v)`** |
Same as strftime(v,"%Y-%m-%d") -- display ISO date like, 2008-12-32 |
- **`string time(std:;tm const &v)`** |
Same as strftime(v,"%H:%M"), display 24 hours clock like, 21:00 |
- **`string timesec(std::tm const &v)`** |
Same as strftime(v,"%T"), display 24 hours clock like, 21:59:59 |
- **`string urlencode(string const &s)`** |
Encode string `s` for URL. |
|
|
## <span id="gettext"></span>Internationalization with `gettext` |
## Internationalization with `gettext` |
|
### Syntax |
|
'gt' STRING [ 'using' using-options ] |
'ngt' STRING ',' STRING ',' VARIABLE [ 'using' using-options |
|
Where `using-options` is: |
|
display-variable-block [ ',' display-variable-block [ ',' ... ] ] |
|
Where `display-variable-block` is any variable is optional filters as described above. For example: |
|
<% 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 current worker thread. For example: |
|
<% gt "Press the button" %> |
|
Would be translated as "Press the button" in English locale and "Нажмите кнопку" under Russian locale. |
|
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 `boost::format` for such substitutions. |
|
|
`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. |
|
_Notes:_ |
|
1. When you use `ngt` you encouraged to use `using` syntax, because you should provide an actual number to display. |
2. Exceptions are disables for boost::format in context of `gettext`. So you may provide not matching number of parameters -- this is important for plural `ngettext` forms. |
3. You may use `<% if rtl %>` or `<% if not rtl %>` in order to test direction of text. This is actually equivalent to: |
|
<% if (strcmp(gettext("LTR"),"RTL")==0) %> |
|
See `if` statement for further description. |
|
## <span id="incl"></span>Including other templates |
## Including other templates |
|
### Syntax |
|
'include' IDENTIFIER '(' [ parameter [ ',' parameter ...] ] ')' |
|
Where `parameter` is one of VARIABLE, STRING or NUMBER. For example: |
|
<% include title() %> |
<% include parent::foo() %> |
<% include bar(x,"test",-1.0) %> |
|
### Description |
|
This command allows inclusion of other functions in place. You can include existing implementation in parent templates |
in order to extend them. For example: |
|
<% class 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 class %> |
<% class 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 class `sales` with an additional option. |
|
## <span id="forms"></span>Rendering Forms |
## Rendering Forms |
|
### Syntax |
|
'form' ('as_p' | 'as_table' | 'as_ul' | 'as_dl' | 'as_space' ) ['no' 'error'] VARIABLE |
|
Render `cppcms::form`, `widget` or `cppcms::widgetset` with selected delimiter. `no error` disables rendering of error |
marks for invalidated form fields. |
|
'form' 'error' VARIABLE |
|
Render widget error message. Used for custom rendering method for widgets. |
|
'form' 'input' VARIABLE |
|
Render HTML input of given widget. Used for custom rendering of widgets. |
|
### Description |
|
Forms are organized as form object or sets of widgets. Each set can be rendered using different delimiters: |
|
- `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. |
|
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> |
|
Usually when certain field is invalid, error message (or '*') is displayed near problematic widget. If you |
want provide your own messages at your own position, you may specify `no error` and disable automatic error |
messages generation. |
|
You may also render each specific widget in form as you want. You can render only its input filed using: |
|
<% form input some_widget %> |
|
You may generate only error message using: |
|
<% form error some_widget %> |
|
## <span id="xhtml"></span>Selecting HTML/XHTML |
## Selecting HTML/XHTML |
|
You may request generation HTML or XHTML code in forms using following command: |
|
( '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. |
|
<% c++ #include "all_data.h" %> |
<% xhtml %> |
<% namespace vary %> |
<% class 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. |
|
## <span id="cpp"></span>Injecting C++ Code |
## Injecting C++ Code |
|
You can always inject any kind of C++ code using: |
|
"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: |
|
<% a %> + <% b %> = <% c++ cout<<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++ } %>` |
|
|
|