私はこのようなことをしたいだけです:
<a href="${ a? 'a.htm' : 'b.htm'}">
このマクロは、三項演算を行うためのより簡単な方法を提供します。
<#macro if if then else=""><#if if>${then}<#else>${else}</#if></#macro>
使い方は簡単で、見た目もとても読みやすいです。
<@if someBoolean "yes" "no"/>
組み込みディレクティブのように@if
ではなく#if
であることに注意してください。次に例を示します。
<!-- `else` is optional -->
<@if someBoolean "someBoolean is true"/>
<!-- expressions -->
<@if (someBoolean||otherBoolean) "hello,"+user.name 1+2+3 />
<!-- with parameter names -->
<@if someBoolean then="yes" else="no" />
<!-- first in list? -->
<#list seq as x>
<@if (x_index==0) "first" "not first"/>
<#list>
何らかの理由で、非ブール式の場合、名前のないパラメーターの周りに括弧を追加することはできません。これにより、読みやすさがさらに向上する可能性があります。
FreeMarker 2.3.23現在、a?then('a.htm', 'b.htm')
を記述できます。 condition?then(whenTrue, whenFalse)
のcondition?string(whenTrue, whenFalse)
に対する利点は、非文字列whenTrue
およびwhenFalse
で機能し、whenTrue
およびwhenFalse
式(どちらのブランチを選択した場合でも)。
次のように宣言されるカスタム関数if
を定義できます。
<#function if cond then else="">
<#if cond>
<#return then>
<#else>
<#return else>
</#if>
</#function>
この関数は、任意の${...}
式で使用できます。コードは次のようになります。
<a href="${if(a, 'a.htm', 'b.htm')}">
@kapepとは対照的に、マクロではなく関数を使用する必要があると思います。マクロは(テキスト)出力を生成しますが、関数は変数に割り当てることができる値を返しますが、出力にも書き込むことができるため、関数の使用はより柔軟になります。さらに、関数を適用する方法は、三項演算子を使用することにより近くなります。これは、ディレクティブとしてではなく、${...}
式内でも使用されます。
たとえば、条件付きリンクターゲットを複数回必要とする場合、ローカル変数に割り当てることは理にかなっています。
<#assign targetUrl=if(a, 'a.htm', 'b.htm')/>
<a href="${targetUrl}">link 1</a>
...
<a href="${targetUrl}">link 2</a>
マクロの代わりに関数を使用すると、@ kapepの例は次のようになります。
<!-- `else` is optional -->
${if(someBoolean, "someBoolean is true")}
<!-- expressions -->
${if(someBoolean||otherBoolean, "hello,"+user.name, 1+2+3)}
<!-- with parameter names: not possible with functions,
but also not really helpful -->
<!-- first in list? -->
<#list seq as x>
${if(x_index==0, "first", "not first")}
<#list>
補間構文の使用:
「$ {(a?has_content)?string( 'a.htm'、 'b.htm')}」
has_content:STRINGの処理に使用できます(空の文字列の場合はFALSEを返します)