Skip to main content
Skip table of contents

Writing templates with Apache FreeMarker

The step following the execution of the query is the generation of the display. The language used to write templates in Elements Connect is Apache FreeMarker, version 2.3.30.  It is a powerful templating language developed and maintained by Apache. 

Practical examples

Depending on the field type - Select list (single choice or multiple choices) or Read only - the template does not work the same way. Read some practical examples on how to write templates in Elements Connect for Select list and Read only items.


Apache FreeMarker directives

Here is a (non-exhaustive) Apache FreeMarker reference manual 

List

It is common to deal with lists in a template. The most frequent use case is the resultSet  variable in case of a multi values result set with a read only Connected item.

Official FreeMarker documentation pages related to lists:

You'll find below the most common functions and built-ins.

Iterate over a list

Iterate over a list named "sequence". Official documentation
In Elements Connect, the resultSet  variable, available in the template of a "Text - Read only" Connected item using a database datasource is a list.

For "Text - Read only" Connected items using a REST API datasource, the data variable can be used. 

CODE
<#list sequence as item>
	<!-- Part repeated for each item -->
<#else>
    <!-- Part executed when there are 0 items -->
</#list>

Filter a list

Built in to filter a list. Official documentation

XML
<#assign xs = [1, -2, 3, 4, -5]>
Positives:
<#list xs?filter(x -> x > 0) as x>${x} </#list>
Negatives:
<#list xs?filter(x -> x < 0) as x>${x} </#list>

Output

XML
Positives:
1 3 4 
Negatives:
-2 -5 

Sort a list

Built in to sort a list. Official documentation

XML
<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} </#list>

Output

XML
aardvark Barbara beetroot whale zeppelin

String

In the developers' world, a String is used to store text. It is certainly the most common and most useful type on Earth. Read the official documentation and check the selection below.

contains

Returns if the substring specified as the parameter to this built-in occurs in the string.

XML
<#if "Elements Connect"?contains("onne")>It contains "onne"</#if>

Output

XML
It contains "onne"

length

Return the number of characters in a string.

XML
${"Elements Connect"?length} chars

Output

XML
16 chars

starts_with

Returns true  if the String contains the specified substring.

XML
<#if "Elements Connect"?starts_with("El")>Starts with 'El'</#if>
XML
Starts with 'El'

Numbers

We can do some things with numbers, like counting for example. Read the official documentation and check the selection below.

abs

Returns the absolute value of a number

XML
{-42?abs} is the meaning of life

Output

XML
42 is the meaning of life

string

Convert a number to a string and apply the formating. Official documentation.

XML
<#assign x=42>
${x}
${x?string}  <#-- the same as ${x} -->
${x?string.number}
${x?string.currency}
${x?string.percent}
${x?string.computer}

Output

XML
42
42
42
$42.00
4,200%
42

Dates

After String and Number, Date is certainly the 3rd most popular data type. With date, we can store important information like birthdays, the start of holidays or payday. Read the official documentation and check the selection below.

Comparing dates

XML
<#-- We assume date1 and date2 are date-time values --> 
<#if date1 > date2>
	date1 is after date2
<#else>
	date1 is before date2
<#/if>

<#-- Compare to the current date --> 
<#if date1 > .now?date>
	date1 is in the future
<#else>
	date1 is in the past
<#/if>

Conditions

if, else, elseif

"Life is like a box of chocolate you never know what you're going to get" the same goes for templates: sometimes it's green, sometimes it's red. Let's see how we can have conditions in our templates. Read the official documentation.

XML
<#assign price = 66>

<#if (price > 100)>
	Price is above 100
<#elseif (price >= 50)>
	Price is between 50 and 100
<#else>
	Price is below 50
</#if>

Output

XML
Price is between 50 and 100

switch, case, default, break

The switch/case directives offer a more advanced control flow than the if / else. Official documentation.

XML
<#switch animal.size>
  <#case "small">
     This will be processed if it is small
     <#break>
  <#case "medium">
     This will be processed if it is medium
     <#break>
  <#case "large">
     This will be processed if it is large
     <#break>
  <#default>
     This will be processed if it is neither
</#switch

Check if a variable exists / is not empty

To check if the value exists:

XML
<#if row.type??>
   Type: ${row.type}
</#if>

To check if a value exists and is not empty:

XML
<#if row.type?has_content>
   Type: ${row.type}
</#if>

Variables

When dealing with complex structures, it can be helpful to store information in local variables. Here is how it can be done:

CODE
<!-- Assign the first element of a list to a variable -->
<#assign first = someList[0]>

<!-- Assign a string -->
<#assign color = "yellow">

<!-- Assign a sequence -->
<#assign seq = ["foo", "bar", "baz"]>

Official documentation

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.