FreeMarkerテンプレートに変数が存在するかどうかを確認するにはどうすればよいですか?


175

テンプレートの処理時に値が提供される一連のプレースホルダーを含むFreemarkerテンプレートがあります。次のように、userName変数が指定されている場合は、条件付きでテンプレートの一部を含めます。

[#if_exists userName]
  Hi ${userName}, How are you?
[/#if_exists]

ただし、FreeMarkerのマニュアルにはif_existsが廃止されていることが示されているようですが、これを実現する別の方法を見つけることができません。もちろん、追加のブール変数isUserNameを提供して、次のように使用することもできます。

[#if isUserName]
  Hi ${userName}, How are you?
[/#if]

しかし、userNameが存在するかどうかを確認する方法がある場合は、この追加の変数を追加することを回避できます。

回答:


304

値が存在するかどうかを確認するには:

[#if userName??]
   Hi ${userName}, How are you?
[/#if]

または、標準のフリーマーカー構文:

<#if userName??>
   Hi ${userName}, How are you?
</#if>

値が存在し、空でないかどうかを確認するには:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>

1
これによって他の誰かが脱落した場合、#if構文は角括弧ではなく小なり記号と大なり記号で囲む必要があります。たとえば、<#if userName ??>
Cameron

私は質問の構文に従ってこの構文を使用することが実際に可能である:参照freemarker.sourceforge.net/docs/...
ウルフLindback

10
これは、varが存在するかどうかを確認するだけです。ただし、「userName」に空の文字列がある場合、<#if userName ??>はtrueを返します。この問題に対処するには、このページの@ user1546081回答を参照してください。
Adrien Be

94

これはもっと良いようです:

<#if userName?has_content>
... do something
</#if>

http://freemarker.sourceforge.net/docs/ref_builtins_expert.html


2
varが存在するかどうか、およびその内容がnullまたは空でないかどうかを確認するようです(ここでは空の文字列を参照)。
Adrien Be

4
これは技術的に不正確であり、変数は存在するが(チェックする必要のある操作)変数が空の場合、意図しない(偽陰性)動作につながるため、これに反対票を投じる必要があります。
Madbreaks 2014年

65

また、if_existsは次のように使用されたと思います:

Hi ${userName?if_exists}, How are you?

これは、userNameがnullの場合は壊れません。nullの場合の結果は次のようになります。

Hi , How are you?

if_existsは廃止され、デフォルトの演算子に置き換えられました。のように

Hi ${userName!}, How are you?

デフォルトの演算子は、次のようなデフォルト値もサポートしています。

Hi ${userName!"John Doe"}, How are you?

1
デフォルト値演算子を使用してブール値を評価することはできません。そのため、ifopが要求したとおりにステートメントで使用することはできません。
Madbreaks 2014年

5

多くの人が、変数が空でないかどうか、また変数が存在するかどうかを確認できるようにしたいと考えています。多くの場合、存在と空さを確認することは良いアイデアであり、テンプレートをより堅牢にし、愚かなエラーを起こしにくくすると思います。つまり、使用する前に変数がnullでも空でもないことを確認すると、テンプレートはより柔軟になります。これは、null変数または空の文字列をそれにスローすることができ、同じように機能するためです。どちらの場合にも。

<#if p?? && p?has_content>1</#if>

pそれが空白だけではないことを確認したいとしましょう。次に、それを確認する前にトリミングすることができますhas_content

<#if p?? && p?trim?has_content>1</#if>

更新

私の提案has_contentは無視してください- 空のチェックとともにnullチェックを行うので、必要なのはこれだけです。することp?? && p?has_contentはと同等なp?has_contentので、そのまま使用することもできますhas_content


2

FreeMarker 2.3.7より前のバージョンの場合

??欠損値の処理には使用できません。古い構文は次のとおりです。

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.