NAME
Konstrukt::Plugin::template - Konstrukt templating engine
SYNOPSIS
<& template src="some.template" &>
<$ field $>will be inserted in the template<$ / $>
<& / &>
DESCRIPTION
This is probably the most important plugin of this framework. It provides a mighty and very easy way of templating. There are two interfaces to this plugin. You may use special tags within your documents that will not annoy a non-programmer and fit seemlessly into the other markup. You may also use a perl-interface that will fit into your perl code (plugins or embedded perl).
Tag interface
Within the Konstrukt-templates (*.template) you define fields that will be replaced by content when using this template:
This is a demotemplate. Some content goes here:
<+$ content / $+>
Within an other file you call the template like this:
Other file's text...
<& template src="demo.template" &>
<$ content $>This is the content that will be inserted into the template.<$ / $>
<& / &>
You may specify default values, if no value for a field is passed:
<+$ content $+>Default content, that may be replaced<+$ / $+>
There is also support for lists. In the template you define one row of the list with some fields.
<table>
<+@ my_list @+> <tr><td><+$ field1 / $+></td><td><+$ field2 / $+></td></tr><+@ / @+>
</table>
You will use the template like this:
<& template src="list.template" &>
<@ my_list @>
<$ field1 $>1<$ / $><$ field2 $>a<$ / $>
<$ field1 $>2<$ / $><$ field2 $>b<$ / $>
<$ field1 $>3<$ / $><$ field2 $>c<$ / $>
<@ / @>
<& / &>
The row will be repeated on usage of the template. The result would look like this:
<table>
<tr><td>1</td><td>a</td></tr>
<tr><td>2</td><td>b</td></tr>
<tr><td>3</td><td>c</td></tr>
</table>
Note that lists of lists are currently not supported.
Perl interface
You may also use a template from your perl code. It will be inserted at the current position in the document where your perl code has been executed. This will be done with the "node" method:
#get a plugin-object
my $template = use_plugin 'template';
#values that should be inserted to the template
my $data = {
field1 => 'value1',
field2 => 'value2'
some_list => [
{ field1 => 'a', field2 => 'b' },
{ field1 => 'c', field2 => 'd' },
...
]
};
#insert the template
$self->add_node($template->node('path/to/some.template', $data));
You may also pass tag nodes as the field's content, so nested templates are possible:
$self->add_node($template->node('some.template', { some_field => $template->node('some_other.template') }));
If you want to pass several nodes as the field's content, you must put them into a field node, which will act like a container:
#create new field node as a container for some other nodes:
my $container = Konstrukt::Parser::Node->new({ type => 'tag', handler_type => '$' });
#add some nodes:
$container->add_child($some_node);
#...
#create template node
$self->add_node($template->node('some.template', { some_field => $container }));
Take a look at </node> (which has been used in the examples above), which explains the passing of template values a bit more.
CONFIGURATION
For some uncommon situations you may control the behaviour of this plugin with these settings:
#this setting controls what to do when you have multiple <$ field $>-definitions:
#0 = overwrite (default). only the last definition will be used
#1 = join. join all values
#2 = ignore. only the first definition will be used
template/join_multiple_fields 0
#this will allow the dynamic generation of <$ field $>'s like this:
#<& template src="some.template" &>
# <$ static_field $>value<$ / $>
# <& perl &>print '<$ dynamic_field $>value<$ / $>'<& / &>
#<& / &>
#usally you shouldn't do this as it will slow down the execution.
#if you want dynamic values, you should use the native perl-interface (L</node>) of this plugin.
#FIXME: additionally this feature doesn't work correctly right now
template/allow_dynamic_field_value_generation 0
SPEED
This plugin needs another modules to clone data structures. It will try to load them in this order:
1) Clone
2) Clone::Any
3) Scalar::Util::Clone
4) Storable
5) Clone::PP
This precedence list is approximateley built to try the module with the best performance first. So you should check, if you've got any of the first modules installed.
METHODS
init
Initialization.
execute_again
Yes, this plugin may return dynamic nodes. E.g. by loading a template containing an perl node.
prepare
Prepare method
Parameters:
$tag - Reference to the tag (and its children) that shall be handled.
execute
Execute method
Parameters:
$tag - Reference to the tag (and its children) that shall be handled.
process
As prepare and execute are almost the same each run will just call this method.
Parameters:
$tag - Reference to the tag (and its children) that shall be handled.
$execute - Should be a true value, when we're in the execute-run
check_preliminary_tags
Traverses the tree and looks for preliminary tags that now may have only plaintext children (as a <+$ variable / $+> might have been replaced by a plaintext node) and thus can be prepared.
Parameters:
$tag - The root tag of the tree to process
scan_for_values
Traverses the tree and creates a handy data structure to easily access the values.
Parameters:
$tag - The root tag of the tree to process
$current - The current list values, which will be merged with the new ones
scan_for_templates
Traverses the tree (prepare-result of the block) and creates a handy data structure to easily access the templates.
Parameters:
$tag- The root tag of the result tree
substitute
Does the template substitution. It will do no parsing, it will just do the substitution on the passed trees.
Parameters:
$template - The hashref which points to the template elements inside the template file.
$values - The hashref which points to the field elements.
$tag - The template tag
set_hints
Traverses the tree and adds a reference to the field values to each plugin tag node inside the template (if not already set). Also adds a hint with the path of the current template, which will be used by the parser to track the correct current directory.
The values will then be accessible through $tag->{template_values}
and $tag->{template_path}
.
Parameters:
$tag - The root tag of the tree to process
$values - Reference to the template values
$path - The absolute path of the template file
node
Return a tag node that will load a template. See "SYNOPSIS" for an example.
Parameters:
$filename - The filename of the template to load
$data - Hash reference with the data to put into the template. Will look like this:
#generic form (see SYNOPSIS): my $data = { fields => { field1 => 'value1', field2 => 'value2' }, lists => { list1 => [ { fields => { field1 => 'a', field2 => 'b' } }, { fields => { field1 => 'c', field2 => 'd' } }, ... ] } }; #short form: #all hash keys that do not point to an hash- or array-reference will be interpreted as a field-value. #all hash keys that point to array references will be interpreted as lists. #so the short form of the example above would look like this: my $data = { field1 => 'value1', field2 => 'value2', list1 => [ { field1 => 'a', field2 => 'b' }, { field1 => 'c', field2 => 'd' }, ... ] } #this will lead to some ambiguities in the short form: # - you cannot define a list and a field with the same name. # - you cannot define fields or lists with the name 'fields' or 'lists' # as they will be interpreted as the container for those.
normalize_input_data
Will convert the input data, that may be passed in a short form, into the generic form.
Will only be used internally by "node".
Parameters:
$data - Hash reference with the data to put into the template
AUTHOR
Copyright 2006 Thomas Wittek (mail at gedankenkonstrukt dot de). All rights reserved.
This document is free software. It is distributed under the same terms as Perl itself.