Variable usage
Template variables must be referenced using dollar ($) notation, for example: $my_variable, $object_array, etc. An eZ Publish template variable is case sensitive. In other words, $lollipop is not the same variable as $LolliPop. Template variables can be created by the system (from PHP code) or by the author of the template (from within template code). Regardless of where a variable was created, it can be changed using the "set" function. Some templates have preset variables, for example, the main template (pagelayout) provides access to a collection of variables.
Creating and destroying variables
All variables used in a template must be declared and defined by the "def" function (short for define) before they can be used. A variable exists until the "undef" function (short for undefine) is used in order to destroy it. A previously declared variable will be automatically destroyed at the end of the template file in which it was created. The following example demonstrates the most basic use of the "def" and "undef" functions.
{def $temperature=32} {$temperature} {undef}
The output of the example will be "32". After the {undef} function is called, the $temperature variable will not be available. Both the "def" and the "undef" function can be used with multiple variables at the same time. In addition, the "undef" function can be used without any parameters. When called without parameters the "undef" function automatically destroys all variables that were previously created within the template. The following example demonstrates how the "def" and "undef" functions can be used to create and destroy multiple variables at the same time.
{def $weather='warm' $celsius=32 $fahrenheit=90} The weather is {$weather}: {$celsius} C / {$fahrenheit} F <br /> {undef $celsius $fahrenheit} The weather is still {$weather}. <br /> {undef}
The output of this example will be:
The weather is warm: 32 C / 90 F
The weather is still warm.
In the example above, the "def" function is used to create three new variables: $temperature, $celsius and $fahrenheit. The "undef" function is used twice. The first time, it is used to destroy the $celsius and $fahrenheit variables. The second is time it is called without parameters and thus the remaining variables (in this case only $temperature) will be destroyed. For more information, please refer to the documentation page of the "def" and "undef" functions.
Changing the contents of variables
The contents/value of a variable can be changed at any time using the "set" function. Please note that this function can be used to change the value of any variable, regardless of if it was created by the system or inside a template. No warning will be given if a system variable is changed. The "set" function can be used to change the value of any variable regardless of the variable's current type and the type of the new value. In other words, this function is capable of changing the type of a variable. The "set" function can not be used to change the value of an element/attribute of an array, hash or an object. In fact, the elements/attributes of arrays, hashes and objects can not be changed from within template code. The following example demonstrates the usage of the "set" function.
{def $weather='warm'} The weather is {$weather}. <br /> {set $weather='cold'} The weather is {$weather}. {undef}
The output of the example will be:
The weather is warm.
The weather is cold.
Just like the "def" and "undef" functions, the "set" function can work with multiple variables at the same time. For more information, please refer to the documentation page of the "set" function.
Changing the contents of global variables
Global variables are changed just like a regular variable, but in this case we will need to use the scope parameter to declare it a global variable. For more information, please refer to the documentation page of the "set" template function.
{def $color='red'} Before: My car is {$color}. {set scope=global $color='blue'} After: My car is {$color}.
The output of the example will be:
Before: My car is red.
After: My car is blue.
The $color global variable in the previous example will be treated as a global variable, but will not be view cache safe. Please note that only the $persistent_variable global variable is view cache safe.
Global variables can also be defined using the operators ezpagedata_set(), ezpagedata_append() or ezpagedata(), which will require ezwebin to be installed. The eZ Website Interface extension is already included by default in eZ Flow and eZ Demo packages, but not with plain_site.
Accessing array elements
The elements of a simple/vector array can only be accessed using numerical indexes. This method is called "index look-up". The elements of an associative array can be accessed by using the key identifiers. This method is called "identifier lookup". The following example demonstrates the different lookup methods.
Index look-up
Index look-up is carried out by appending a period/dot and an index number to the name of a simple/vector or associative array. Index look-up may also be carried out by appending a matching pair of brackets that encapsulate the desired index value. The following example demonstrates how to access the elements of a simple array using index look-up. Please note the different syntax (dot and brackets).
{def $sentence=array( 'Life', 'is', 'very', 'good!' )} The 1st element is: {$sentence.0} <br /> The 2nd element is: {$sentence.1} <br /> The 3rd element is: {$sentence[2]} <br /> The 4th element is: {$sentence[3]} <br /> {undef}
The code above will output the following:
The 1st element is: Life
The 2nd element is: is
The 3rd element is: very
The 4th element is: good!
Identifier look-up
Identifier look-up can be carried out by appending a period/dot and an identifier name to the name of an associative array. Identifier look-up may also be carried out by appending a matching pair of brackets that encapsulate the desired index value. The following example demonstrates how to access the elements of an associative array using the identifier look-up method. Notice the different syntax (use of dot and brackets).
{def $sentence=hash( 'first', 'Life', 'second', 'is', 'third', 'very', 'fourth', 'good!' )} The 1st element is: {$sentence.first} <br /> The 2nd element is: {$sentence.second} <br /> The 3rd element is: {$sentence[third]} <br /> The 4th element is: {$sentence[fourth]} <br /> {undef}
The following output will be produced:
The 1st element is: Life
The 2nd element is: is
The 3rd element is: very
The 4th element is: good!
Accessing object attributes
The attributes of an object can only be accessed using the attributes' identifiers. An identifier is just the name of an attribute (similar to the keys of an associative array). The following example demonstrates how the different attributes of a node object can be accessed from within a template.
The ID of the node: {$node.node_id} <br /> The ID of the object encapsulated by the node: {$node.object.id} <br /> The name of the object: {$node.object.name} <br /> First time the object was published: {$node.object.published|l10n( shortdate )} <br />
If the $node variable contains a node that has ID number 44 and encapsulates object number 13 named "Birthday" published on the first of April in 2003, the following output will be produced:
The ID of the node: 44
The ID of the object encapsulated by the node: 13
The name of the object: Birthday
First time the object was published: 01/04/2003
Balazs Halasy (14/09/2010 11:25 am)
Ricardo Correia (25/01/2013 4:19 pm)
Comments
Array inspection
Thursday 29 June 2006 6:22:43 am
Michał
Re: Array inspection
Tuesday 08 August 2006 7:43:23 am
Lars
Re: Array inspection
Wednesday 14 February 2007 8:01:34 am
Markus
{def $somearray=...}
{def $length=$somearray|get_type()}
{for 0 to $length as $counter}
{$somearray[$counter]}
{/for}
{undef}
This is more helpful if you want to access the neighbour elements of the actual element, for example. If you do not need a counte, "foreach" is easier to use.
Set won`t always work; the Scope parameter
Monday 22 January 2007 12:45:09 pm
Kjartan
This won`t update the var:
{def $myVar = "one"}
{if (#some test that evaluates to true")}
{set $myVar = "two"}
This however, will:
{def $myVar = "one"}
{if (#some test that evaluates to true")}
{set $myVar = "two" scope="root"}
See this page for more info: http://ez.no/doc/ez_publish/techn...nce/template_functions/variables/set
Hope this saves someone a little time and frustration...
Cheers,
Kjartan
How to modify an array element??
Monday 19 November 2007 10:57:38 am
Adrien
Making a 'set' on an array element destroy the whole array.
Why there is no cross-link between "/reference/template_operators/arrays/array" and /templates/the_template_language/variable_usage?
Re: How to modify an array element??
Monday 19 November 2007 11:21:51 am
Adrien
{set $counts = $counts|insert($i,inc($counts[$i]))|remove(inc($i))}
Huge, isn't it?
Re: Re: How to modify an array element??
Monday 19 November 2007 1:33:32 pm
Adrien
$myArray[$i]++
{set $myArray = $myArray|insert($i,inc($myArray[$i]))|remove(inc($i))}
Re: Re: Re: How to modify an array element??
Thursday 29 April 2010 12:16:46 pm
Allan