web-dev-qa-db-ja.com

freemarkerで三項演算子を使用しますか?

私はこのようなことをしたいだけです:

<a href="${ a? 'a.htm' : 'b.htm'}">
39
Jack Hu

Freemarker 2.3.23以降を使用している場合は、 then ビルトインを使用できます。

<a href="${a?then('a.htm','b.html')}" target="${openTarget}">

古いバージョンのfreemarkerを使用している場合は、代わりに string ビルトインを使用できます。

<a href="${a?string('a.htm','b.html')}" target="${openTarget}">

ブール値に適用すると、stringビルトインは三項演算子として機能します。


73
obourgain

このマクロは、三項演算を行うためのより簡単な方法を提供します。

<#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> 

何らかの理由で、非ブール式の場合、名前のないパラメーターの周りに括弧を追加することはできません。これにより、読みやすさがさらに向上する可能性があります。

6
kapex

FreeMarker 2.3.23現在、a?then('a.htm', 'b.htm')を記述できます。 condition?then(whenTrue, whenFalse)condition?string(whenTrue, whenFalse)に対する利点は、非文字列whenTrueおよびwhenFalseで機能し、whenTrueおよびwhenFalse式(どちらのブランチを選択した場合でも)。

3
ddekany

次のように宣言されるカスタム関数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>
2
YetAnotherFrank

補間構文の使用:

「$ {(a?has_content)?string( 'a.htm'、 'b.htm')}」

has_content:STRINGの処理に使用できます(空の文字列の場合はFALSEを返します)

0
desiredeveloper