Synopsis
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
Where:
-
value
,refValue1
, etc.: Expressions evaluates to scalars of the same type.
The break
-s and default
are optional.
Description
The usage of this directive is not recommended, as it's
error-prone because of the fall-through behavior. Use elseif
-s
instead unless you want to exploit the fall-through behavior.
Switch is used to choose a fragment of template depending on the value of an expression:
<#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>
Inside the switch
must be one or more
<#case value>
,
and after all such case
tags optionally one
<#default>
. When FM reaches the
switch
directive, it chooses a
case
directive where
refValue
equals with
value
and continues
the processing of the template there. If there is no
case
directive with appropriate value then it
continues processing at the default
directive if
that exists, otherwise it continues the processing after the end-tag
of switch
. And now comes the confusing thing:
when it has chosen a case
directive, it will
continue the processing there, and will go ahead until it reaches a
break
directive. That is, it will not
automatically leave the switch
directive when it
reaches another case
directive or the
<#default>
tag. Example:
<#switch x> <#case 1> 1 <#case 2> 2 <#default> d </#switch>
If x
is 1, then it will print 1 2 d; if
x
is 2 then it will print 2 d; if
x
is 3 then it will print d. This is the
mentioned fall-through behavior. The break
tag
instructs FM to immediately skip past the switch
end-tag.