Main  /  Edit version 2  /  Edit version 3  /   /  Users Area

Difference "Templates: Top Level Blocks" ver. 2 versus ver. 3

Content:

## Table Of Contents
- [General Notes](#gn)
- [Namespace or Skin](#ns)
- [Class or Single Page](#cl)
- [Template or Member Function](#tmpl)
## <span id="gn"></span>General notes
Each block begins with its definition and ends with special command `end`.
'end' [ 'namespace' | 'class' | 'template' ]
This command may optionally include block type after it. For example:
<% namespace vary %>
<% class master uses data %>
...
<% end class %>
<% end %>
So we closed `namespace` without block type and `class` with specification.
It may be used as additional checking of order of blocks.
## <span id="ns"></span>namespace
### Syntax:
'namespace' (NAME|'vary')
It is topmost command in every template.
Namespace can be specified by specific name, or using `vary` keyword that mean that its name should be defined
externally during build process using switch `-n`.
### Notes
- If all the skin you create would not share any part with other skin, specify its name, otherwise use `vary`.
- You can't use both `vary` and predefined namespace withing same skin.
## <span id="cl"></span>class
### Syntax:
'class' NAME 'uses' IDENTIFIER ['extends' NAME]
Creates new class that responsible on rendering specific type of content pages. `'uses' IDENTIFIER` specifies the type of the content that this class should render. It actually defines `content` reference member of this type.
Remember this note, in some cases, you would have to access `content` member directly.
You can specify `'extends' NAME` if you want that new created class would inherit from other template class.
### Derivation restrictions
When you create derived class the content of the child should be derived from the content of its parent as well.
For example:
<% class master uses data::master %>
..
<% end class %>
<% class page uses data::page extends master %>
...
<% end class %>
Then, `data::page` _must_ be derived from `data::master`.
_Rationale:_
When you create `master` parent you need provide for it a content as well. It receives its child content, thus it
may work if its child content derived from its parent content.
### Generated Code
The generated code for the above two examples would look like this (approximately):
class master : public base_view {
data::master &content;
master(settings s,data::master cnt) :
base_view(settings),
content(cnt)
{
...
}
...
};
class page : public master {
data::page &content;
page(settings s,data::page cnt) :
master(s,cnt),
content(cnt)
{
...
}
...
};
## <span id="tmpl"></span>template
### Syntax
Definition of template consists of its name, round brackets and optional, comma separated list of parameters:
'template' NAME '(' [ parameter [',' parameter ... ] ] ')'
Where `parameters` is :
IDENTIFIER ['const' ] ['?'] NAME
IDENTIFIER ['const' ] ['&'] NAME
For example:
<% template render() %>
<% template show_list(data::list_t const &list) %>
<% template show_numbers(int x,int y, double z) %>
Note: you can not specify template parameters like `list<int>`. You should define a type for them.
### Generated Code
Each template is translated to virtual member function of the class it defined in. This function
returns `void` and receives defined parameters, thus, `show_list` in the above example would be
translated to:
virtual void show_list(data::list_t const &list)
{
...
}

About

CppCMS is a web development framework for performance demanding applications.

Support This Project

SourceForge.net Logo

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

CppCMS needs You


Navigation

Main Page


Valid CSS | Valid XHTML 1.0