ConfiForms has a lot of various field types to help you with building your data forms. And it has a very sophisticated system to retrieve the values stored, including accessing rich objects such as Page, User and other referenced Records when used together with "smart fields"
...
Warning |
---|
Make sure the [entry.myfield] is actually stored the way you see it, as sometimes Confluence editor injects some "invisible to user" blocks of HTML, such as spans... and the text becomes actually something like [entry.<span>myfield</span>] which makes it not to work correctly with ConfiForms parser. The easiest way to see that text is clean is by looking at storage format of the page (using Tools menu and then clicking on "View Storage format" or by installing a free add-on from Atlassian which enables you to see raw storage format directly in the Confluence editor - https://marketplace.atlassian.com/plugins/com.atlassian.confluence.plugins.editor.confluence-source-editor/server/overview)
Please also see this: https://wiki.vertuna.com/display/CONFIFORMS/ConfiForms+FAQ#ConfiFormsFAQ-WhyintheeditorIgetautolinksinsteadof[entry.field_name]notations |
Accessing ConfiForms fields
Info |
---|
See what fields are available on ConfiForms CLOUD - Differences between ConfiForms server/data center and ConfiForms cloud |
Warning | ||
---|---|---|
| ||
Please see the fields list that is available on ConfiForms cloud if you are looking for the documentation on accessing field properties in ConfiForms cloud Differences between ConfiForms server/data center and ConfiForms cloud |
Accessing ConfiForms fields
Here is the table showing you how to reference field values for different field types. Here is the table showing you how to reference field values for different field types. Our field name is: "myfield"
Field type | Accessing in ConfiForms Field macro | Accessing though [entry.] notation | Using in filters | Sorting | Remarks | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Text | myfield | [entry.myfield] | myfield:*test myfield:test* myfield:*test* myfield:* | as text | |||||||||||||||||||||||||||||||||||||||||||
Action Button | myfield | N/A | N/A | N/A | N/A | ||||||||||||||||||||||||||||||||||||||||||
Autolink | myfield | [entry.myfield] | same as text field | as text | only dynamic part is taken when shown as [entry.] notation | ||||||||||||||||||||||||||||||||||||||||||
Autonumber | myfield | [entry.myfield] | same as text field | as text | autonumber with previx | ||||||||||||||||||||||||||||||||||||||||||
Autopage | myfield | See page type | See page type | See page type | See page type | ||||||||||||||||||||||||||||||||||||||||||
Calculated | myfield | [entry.myfield] | Same as numeric field | as number | non-numeric values are set as 0 in sorting | ||||||||||||||||||||||||||||||||||||||||||
Captcha | myfield | N/A | N/A | N/A | N/A | ||||||||||||||||||||||||||||||||||||||||||
Checkbox | myfield myfield.label | [entry.myfield] [entry.myfield.label] | myfield:true myfield:false | Returns true or false By using .label you can access checkbox field label you set | |||||||||||||||||||||||||||||||||||||||||||
Checkbox group | myfield myfield.label | [entry.myfield] [entry.myfield.label] | myfield:*fieldvalue* to ensure it is matched | as text | |||||||||||||||||||||||||||||||||||||||||||
Comment
| myfield | [entry.myfield] | Same as numeric field | as number | |||||||||||||||||||||||||||||||||||||||||||
Date | myfield myfield.timestamp | [entry.myfield] [entry.myfield.timestamp] | Same as numeric field | as number | timestamp value Date and Datetime field types allow the following metaparams to be given as input [now], [tomorrow], [yesterday], [today], [today]-days(n), [datetimeyyyyMMdd HH:mm], [dateyyyyMMdd] Basically, same as in ConfiForms Filters | ||||||||||||||||||||||||||||||||||||||||||
| mycommentfield.user mycommentfield.timestamp mycommentfield.content
| ||||||||||||||||||||||||||||||||||||||||||||||
Currency | myfield | [entry.myfield] | Same as numeric field | as number | |||||||||||||||||||||||||||||||||||||||||||
DateDatetime | myfield myfield.timestamp | [entry.myfield] [entry.myfield.timestamp] | Same as numeric field | as number | timestamp value See above Date and Datetime field types allow the following metaparams to be given as input [now], [tomorrow], [yesterday], [today], [today]-days(n), [datetimeyyyyMMdd HH:mm], [dateyyyyMMdd] Basically, same as in ConfiForms Filters | ||||||||||||||||||||||||||||||||||||||||||
Datetime | myfield myfield.timestamp | Datetime interval | myfield myfield.startDateFormatted myfield.endDateFormatted myfield.startDate myfield.endDate myfield.asPeriodFormatted | [entry.myfield] [entry.myfield.startDateFormattedtimestamp][entry. | Same as numeric field | as number | timestamp value See above | ||||||||||||||||||||||||||||||||||||||||
Datetime interval | myfield myfield.startDateFormatted myfield.endDateFormatted [entry. myfield.startDate [entry. myfield.endDate myfield.startDate .timestamp myfield.endDate conditions as in numeric field | as number by start date | timestamp value | DB dropdown | myfield myfield.id myfield.label | see remarks -> | Same as normal dropdown | DB multi-select | myfield | see remarks -> | Same as normal multi-select | DB radio group | myfield | see remarks -> | Same as normal radio group | DB checkbox | myfield | see remarks -> | Same as normal checkbox | ||||||||||||||||||||||||||||
Drawing canvas | myfield | N/A | N/A | N/A | internal format is returned | ||||||||||||||||||||||||||||||||||||||||||
.timestamp myfield.asPeriodFormatted myfield.interval - returns interval in minutes between start and end dates
myfield.periodInSeconds myfield.periodInMinutes myfield.periodInHours myfield.periodInDays myfield.periodInWorkDays | Dropdown | myfield myfield.id myfield.label | [entry.myfield] [entry.myfield.idstartDateFormatted] [entry.myfield.labelendDateFormatted] | myfield:ID myfield.label:LABEL | as text | Each dropdown choice has ID and LABEL[entry.myfield.startDate] [entry.myfield.endDate] returns ID | Dynamic Dropdown | [entry.myfield.startDate.timestamp] myfield myfield.id myfield.label [entry.myfield.endDate.timestamp] [entry.myfield.idasPeriodFormatted] [entry.myfield.labelinterval] | myfield:*fieldvalue* to ensure it is matched | as text |
[entry.myfield.periodInSeconds] returns ID | Dynamic Multilabel | [entry.myfield.periodInMinutes] myfield myfield.id myfield.label [entry.myfield.periodInHours] [entry.myfield.idperiodInDays] [entry.myfield.labelperiodInWorkDays] | myfield.startDate: myfield :*fieldvalue* to ensure it is matched | as text | Each choice has ID and LABEL [entry.myfield] returns ID | Enroll button | myfield | N/A | N/A | N/A | ||||||||||||||||||||||||||
File | myfield | [entry.myfield] - will show as link | same as text, see remarks | as text | only attachment/file name is in search | ||||||||||||||||||||||||||||||||||||||||||
Formula | myfield | [entry.myfield] | same as numeric field | as number | non-numeric values are set as 0 in sorting | ||||||||||||||||||||||||||||||||||||||||||
.endDate: conditions as in numeric field | as number by start date | timestamp value | |||||||||||||||||||||||||||||||||||||||||||||
DB dropdown | myfield myfield.id myfield.label | see remarks -> | Same as normal dropdown | ||||||||||||||||||||||||||||||||||||||||||||
DB multi-select | myfield | see remarks -> | Same as normal multi-select | ||||||||||||||||||||||||||||||||||||||||||||
DB radio group | myfield | see remarks -> | Same as normal radio group | ||||||||||||||||||||||||||||||||||||||||||||
DB checkbox | myfield | see remarks -> | Same as normal checkbox | ||||||||||||||||||||||||||||||||||||||||||||
Drawing canvas | myfield | N/A | N/A | N/A | internal format is returned | ||||||||||||||||||||||||||||||||||||||||||
Dropdown | myfield myfield.id myfield.label | Html | myfield | [entry.myfield] | same as text type | as text | Insight | myfield myfield.attributes.objectTypeAttribute(objectTypeAttributeId=46).objectAttributeValues.value | [entry.myfield] [entry.myfield.attributes.objectTypeAttribute(objectTypeAttributeId=46).objectAttributeValues.value] See more details here: Accessing JSON structures. The tutorial is for ConfiDoc plugin but is perfectly validfor ConfiForms (easpecially from teh perspective of accessing the Insight object attributes) | Link | id] [entry.myfield.label] | myfield:ID myfield.label:LABEL | as text | Each dropdown choice has ID and LABEL myfield[entry.myfield] | same as text type | as text | Hidden | returns ID | |||||||||||||||||||||||||||||
Dynamic Dropdown | myfield myfield.id myfield.label myfield | [entry.myfield] | same as text type | as text | Masked Text | myfield | [entry.myfield ] | same as text type | as text | Multi Select | myfield .id] [entry.myfield.label] | same as dropdown (ID and LABEL properties) | as text | Numeric field | myfield:*fieldvalue* to ensure it is matched | as text | Each dropdown choice has ID and LABEL myfield[entry.myfield] | myfield:>= myfield:> myfield:<= myfield:< myfield: | as number | returns ID | |||||||||||||||||||||||||||
Dynamic Multilabel | myfield myfield.id myfield.label | [entry.myfield] [entry.myfield.id] [entry.myfield.label] | myfield:*fieldvalue* to ensure it is matched | as text | Each choice has ID and LABEL [entry.myfield] returns ID | ||||||||||||||||||||||||||||||||||||||||||
Enroll button | myfield | N/A | N/A | N/A | |||||||||||||||||||||||||||||||||||||||||||
File | myfield | [entry.myfield] - will show as link | same as text, see remarks | as text | only attachment/file name is in search | ||||||||||||||||||||||||||||||||||||||||||
Formula | myfield | [entry.myfield] | same as numeric field | as number | non-numeric values are set as 0 in sorting | ||||||||||||||||||||||||||||||||||||||||||
Html | myfield | JIRA issue | myfield myfield.key myfield.title myfield.summary (same as title) myfield.description myfield.link myfield.status
Any JIRA field which is provided via JIRA REST API For example: myfield.fields.assignee.emailAddress myfield.fields.reporter.displayName See also: Using Field Definition Rule to request data from JIRA and set it to ConfiForms fields | [entry.myfield] [entry.myfield.key] [entry.myfield.title]
| same as text type | as text | |||||||||||||||||||||||||||||||||||||||||
Insight | myfield myfield.attributes.objectTypeAttribute(objectTypeAttributeId=46).objectAttributeValues.value[entry.myfield.summary] (same as title) | [entry.myfield.description] [entry.myfield.link] [entry.myfield.status] .attributes.objectTypeAttribute(objectTypeAttributeId=46).objectAttributeValues.value]
See more details here: Accessing JSON structures. The tutorial is for ConfiDoc plugin but is perfectly validfor ConfiForms (easpecially from teh perspective of accessing the Insight object attributes) | |||||||||||||||||||||||||||||||||||||||||||||
Link | myfield | [entry.myfield] | same as text typesame as text type and only by key | as text | |||||||||||||||||||||||||||||||||||||||||||
Hidden | myfield | JQL | myfeld myfeld.jql myfeld.count | [entry.myfield][entry.myfield.jql | same as text type | as text | |||||||||||||||||||||||||||||||||||||||||
Masked Text | myfield] | [entry.myfield.count] | Renders as link to JIRA with number of matching issues 2 additional properties available: jql and count | same as text type | as text | ||||||||||||||||||||||||||||||||||||||||||
Multi Select | myfield | Page/Blog post | myfield myfield.* - see remarks | [entry.myfield] | [entry.myfield.*] - see remarks | same as text, for properties list see remarksdropdown (ID and LABEL properties) | as text, by default pageIdall properties of AbstractPage class (see Confluence API docs) Examples: | ||||||||||||||||||||||||||||||||||||||||
method in class | How to access | ||||||||||||||||||||||||||||||||||||||||||||||
getSpaceKey() | myfield.spaceKey | ||||||||||||||||||||||||||||||||||||||||||||||
getCreatorName() | myfield.creatorName | ||||||||||||||||||||||||||||||||||||||||||||||
getVersion() | myfield.version | ||||||||||||||||||||||||||||||||||||||||||||||
getCreationDate() | myfield.creationDate | ... any other get method from Page class | Password | myfield | [entry.myfield] | same as text type | as text | Radio group | [entry.myfield] [entry.myfield.id] [entry.myfield.label] | myfield:ID myfield.label:LABEL | as text | Each choice has ID and LABEL [entry.myfield] returns ID | Readonly | myfield | [entry.myfield] | same as text type | as text | Section | myfield | N/A | N/A | N/A | |||||||||||||||||||||||||
Simple Date | myfield | [entry.myfield] | Same as numeric field | as number | timestamp value | ||||||||||||||||||||||||||||||||||||||||||
Smart Classifier | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | Depends on a field referenced. If [entry.myfield] or just "myfield" is referenced then in most cases it acts as text. But with "smart fields" you reference a record in another form and that means through this reference you can get ANY field of that record, including other smart fields. That said, you can build quite a property graph to get any value, which is lazy loaded for you | depends on a field referenced | Properties you can access totally depend on a structure of the record in the form you reference. You can access ANY field value through this notation, including other smart fields which will be lazy loaded for you. Example:
| ||||||||||||||||||||||||||||||||||||||||||
Numeric field | myfield | [entry.myfield] | myfield:>= myfield:> myfield:<= myfield:< myfield: | as number | |||||||||||||||||||||||||||||||||||||||||||
JIRA issue | myfield myfield.key myfield.title myfield.summary (same as title) myfield.description myfield.link myfield.status
Any JIRA field which is provided via JIRA REST API For example: myfield.fields.assignee.emailAddress myfield.fields.reporter.displayName See also: Using Field Definition Rule to request data from JIRA and set it to ConfiForms fields
myfield.exists - returns true or false to verify if the value stored in this field corresponds to Jira issue | [entry.myfield] [entry.myfield.key] [entry.myfield.title]
[entry.myfield.summary] (same as title) [entry.myfield.description] [entry.myfield.link] [entry.myfield.status] | same as text type and only by key | as text | |||||||||||||||||||||||||||||||||||||||||||
JQL | myfeld myfeld.jql myfeld.count | [entry.myfield] [entry.myfield.jql] [entry.myfield.count] | Renders as link to JIRA with number of matching issues 2 additional properties available: jql and count | ||||||||||||||||||||||||||||||||||||||||||||
Page/Blog post | myfield myfield.* | Smart Dropdown | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||||||||||||||||||||||||||||
Smart Multiselect | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||||||||||||||||||||||||||||||
Smart Checkbox | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||||||||||||||||||||||||||||||
same as text, for properties list see remarks | as text, by default pageId | all properties of AbstractPage class (see Confluence API docs). For cloud see https://developer.atlassian.com/cloud/confluence/rest/api-group-content/#api-wiki-rest-api-content-get Examples:
| |||||||||||||||||||||||||||||||||||||||||||||
Password | myfield | [entry.myfield] | same as text type | as text | |||||||||||||||||||||||||||||||||||||||||||
Radio group | myfield myfield.id myfield.label
| Smart Radio buttons | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*id] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | Status | [entry.myfield.label] | myfield:ID myfield.label:LABEL | as text | Each choice has ID and LABEL myfield myfield.id myfield.label [entry.myfield] [entry.myfield.id]returns ID | |||||||||||||||||||||||||||||||||||
Readonly | myfield | [entry.myfield.label] | same as text type | Same as dropdown field, with IDs and LABELs. But has predefined values for IDs (depending on a colour) | as text | See remarks for dropdown field | as text | ||||||||||||||||||||||||||||||||||||||||
Section | myfield | N/A | N/A | N/A | |||||||||||||||||||||||||||||||||||||||||||
Simple DateTextarea | myfield | [entry.myfield] | same Same as text typenumeric field | as textnumber | timestamp value | ||||||||||||||||||||||||||||||||||||||||||
Smart ClassifierUser | myfield myfield.username myfield.fullName myfield.picture myfield.email myfield.lastName myfield.firstName [entry.myfield] [entry.myfield.username] * - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | Depends on a field referenced. If [entry.myfield.fullName] [entry.myfield.picture] [entry.myfield.email] [entry.myfield.lastName] [entry.myfield.firstName] | same as text type, but you can query for field properties: myfield: myfield.username: myfield.fullName: myfield.picture: myfield.email: myfield.lastName: myfield.firstName: | as text, see remarks | ] or just "myfield" is referenced then in most cases it acts as text. But with "smart fields" you reference a record in another form and that means through this reference you can get ANY field of that record, including other smart fields. That said, you can build quite a property graph to get any value, which is lazy loaded for you | depends on a field referenced | Properties you can access totally depend on a structure of the record in the form you reference. You can access ANY field value through this notation, including other smart fields which will be lazy loaded for you. Example:
| |||||||||||||||||||||||||||||||||||||||
Smart Dropdown | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||||||||||||||||||||||||||||||
Smart Multiselect | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||||||||||||||||||||||||||||||
Smart Checkbox | myfield myfield.* - see remarks | [entry.myfield | sorting is by username field lastName and firstName are synthetic properties, which we try to extract from a given fullName. We consider las word as lastName and what is given before is taken as firstName. This solution does not work for the whole world, but this is the best option we can offer you at the moment | User (multiselect) | myfield | [entry.myfield] [entry.myfield.asUserFullNames] [entry.myfield.asUserEmails*]* - see remarks | Same as User | as text | You can show user full names in a list, or emails or (when no helper function is used) as list of usernames | ||||||||||||||||||||||||||||||||||||||
Voting control | myfield | N/A | N/A | N/A | N/A | Webservice backed fields |
Code Block |
---|
[
{
id: 1,
name: "Alex",
sn: "E123"
},
{
id: 2,
name: "Vlad",
sn: "C100"
}
] |
You can map the structures of an array to be used as options for the web services backed fields in ConfiForms
Assuming your field is called "myfield"
then to access the properties you will need to put the following expressions
Code Block |
---|
myfield.id
myfield.name
myfield.sn |
There is also a synthetic property called "label" for the field what you use as "label" in your web services backed field
Important note: when your web service returns a structure with ID and you map another field to be used as ID then original data will not be accessible, as mapping overrides it.
Accessing through [entry.] notation can be used in ListView, in PlainView, in CalendarView and in IFTTT macro body, as well as when referencing ConfiForms record fields in macro parameters
See also Virtual functions to help you with formatting values in the format you want
Warning |
---|
Accessing values using Velocity syntax is deprecated and not supported in 100% of cases. Please try to accomplish what you have to do using [entry.] notation |
Additional values available in the context
See Smart Classifier | depends on a field referenced | See Smart Classifier | |||||||||||||||||
Smart Radio buttons | myfield myfield.* - see remarks | [entry.myfield] [entry.myfield.*] - see remarks | See Smart Classifier | depends on a field referenced | See Smart Classifier | ||||||||||||||
Status | myfield myfield.id myfield.label | [entry.myfield] [entry.myfield.id] [entry.myfield.label] | Same as dropdown field, with IDs and LABELs. But has predefined values for IDs (depending on a colour) | as text | See remarks for dropdown field | ||||||||||||||
Textarea | myfield | [entry.myfield] | same as text type | as text | |||||||||||||||
User | myfield myfield.username myfield.fullName myfield.picture myfield.email myfield.lastName myfield.firstName myfield.key myfield.accountId | [entry.myfield] [entry.myfield.username] [entry.myfield.fullName] [entry.myfield.picture] [entry.myfield.email] [entry.myfield.lastName] [entry.myfield.firstName] | same as text type, but you can query for field properties: myfield: myfield.username: myfield.fullName: myfield.picture: myfield.email: myfield.lastName: myfield.firstName: | as text, see remarks | sorting is by username field lastName and firstName are synthetic properties, which we try to extract from a given fullName. We consider las word as lastName and what is given before is taken as firstName. This solution does not work for the whole world, but this is the best option we can offer you at the moment | ||||||||||||||
User (multiselect) | myfield | [entry.myfield] [entry.myfield.asUserFullNames] [entry.myfield.asUserEmails] * - see remarks | Same as User | as text | You can show user full names in a list, or emails or (when no helper function is used) as list of usernames | ||||||||||||||
Voting control | myfield | N/A | N/A | N/A | N/A | ||||||||||||||
Webservice backed fields | As with "JIRA issue" fields you can access ANY property returned by the web service for the option you map with the field. For example:
You can map the structures of an array to be used as options for the web services backed fields in ConfiForms Assuming your field is called "myfield" then to access the properties you will need to put the following expressions
There is also a synthetic property called "label" for the field what you use as "label" in your web services backed field Important note: when your web service returns a structure with ID and you map another field to be used as ID then original data will not be accessible, as mapping overrides it. | ||||||||||||||||||
WYSIWYG simple editor | myfield | [entry.myfield] | same as text type | as text |
Accessing through [entry.] notation can be used in ListView, in PlainView, in CalendarView and in IFTTT macro body, as well as when referencing ConfiForms record fields in macro parameters
See also Virtual functions to help you with formatting values in the format you want
Warning |
---|
Accessing values using Velocity syntax is deprecated and not supported in 100% of cases. Please try to accomplish what you have to do using [entry.] notation |
Additional values available in the context
Panel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Panel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Variable | [owner
current record owner (ownedBy field) or Anonymous (when user is "Anonymous") |
[now] | Current timestamp. NB! Not evaluated to the value when in pre-sets and stays as [now] which results ALWAYS in current date. Use [entry._now] for the value
current user's full name | | Deprecated, use
current timestamp, which can be converted to date using Virtual functions or used for comparison against other date/datetime fields | Datetime
current page id (present in most cases, but not always) | Page
form's page id | Page | [entry._today] | current timestamp (for date, without time) | Date | [entry._count] | number of records in the dataset | Numeric | [entry._total] | total number of records in the dataset | Numeric | [entry._formName] | Name of the form is now available in the context
When used with ConfiForms TableViewMerger macro you have access to the following variables
When ConfiForms IFTTT macro is processed it does temporarily make these variable accessible Available in
|
See also
Configuring ConfiForms IFTTT actions and rules
Important note about IFTTT macros with macro bodies which are evaluated as velocity templates - there is additional context variables available
...