私はちょうどこのようなことをしたい:
<a href="${ a? 'a.htm' : 'b.htm'}">
2.3.23 より前の古いバージョンの Freemarker を使用している場合は、三項演算を行う簡単な方法を提供するこのマクロを使用できます。
<#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>
なんらかの理由で、名前のないパラメーターがブール式でない場合、括弧を追加することはできません。これにより、可読性がさらに向上する可能性があります。
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>
FreeMarker 2.3.23 以降では、 と書くことができますa?then('a.htm', 'b.htm')
。condition?then(whenTrue, whenFalse)
overの利点はcondition?string(whenTrue, whenFalse)
、文字列以外の and に対して機能することwhenTrue
と、 and式whenFalse
の 1 つだけを評価することです(どちらの分岐が選択されても)。whenTrue
whenFalse