Bir değişkenin FreeMarker şablonunda olup olmadığını nasıl kontrol edebilirim?


175

Şablon işlendiğinde değerleri sağlanan yer tutucuları içeren bir Freemarker şablonum var. Koşullu olarak userName değişkeni sağlanırsa şablonun bir parçası dahil etmek istiyorum, gibi bir şey:

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

Ancak, FreeMarker kılavuzu if_exists onaylanmadığını gösteriyor gibi görünüyor, ancak bunu başarmak için başka bir yol bulamıyorum. Tabii ki, basit bir ek boolean değişkeni isUserName sağlama ve bu gibi kullanabilirsiniz:

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

Ancak userName'in var olup olmadığını kontrol etmenin bir yolu varsa, bu ekstra değişkeni eklemekten kaçınabilirim.

Yanıtlar:


304

Değerin var olup olmadığını kontrol etmek için:

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

Veya standart freemarker sözdizimi ile:

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

Değerin var olup olmadığını ve boş olmadığını kontrol etmek için:

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

1
Başka birinin bununla atılması durumunda, #if sözdiziminin köşeli parantez yerine karakterden daha küçük ve daha büyük olması gerekir. örneğin: <#if kullanıcıAdı ??>
Cameron

Ben sadece soru sözdizimi takip ettin, bu sözdizimini kullanmak aslında mümkündür: bakınız freemarker.sourceforge.net/docs/...
Ulf Lindback

10
Bu sadece var olup olmadığını kontrol eder. Ancak "userName" içinde boş bir String varsa, <#if userName ??> true değerini döndürür !! Bu sorunu çözmek için bu sayfada @ user1546081 yanıtına bakın.
Adrien Be

94

Bu daha uygun görünüyor:

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

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


2
Varlığın var olup olmadığını VE içeriğinin boş olup olmadığını kontrol ediyor gibi görünüyor (buradaki boş Dizelere atıfta bulunarak).
Adrien Be

4
Teknik olarak yanlış olduğundan ve değişken varsa ( op'un kontrol etmek istediği) ancak boşsa istenmeyen (yanlış negatif) davranışa yol açacağı için bunu düşürmek zorundasınız .
Madbreaks

65

Ayrıca eğer if_exists gibi kullanıldığını düşünüyorum :

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

userName boşsa, bu boş olmazsa, sonuç şöyle olur:

Hi , How are you?

if_exists artık kullanımdan kaldırıldı ve yerine varsayılan operatör eklendi! de olduğu gibi

Hi ${userName!}, How are you?

varsayılan operatör ayrıca aşağıdaki gibi bir varsayılan değeri destekler:

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

1
Varsayılan değer operatörü bir boole değerini değerlendirmek için kullanılamaz. Bu nedenle, isteğe bağlı ifolarak bir ifadede kullanılamaz .
Madbreaks

5

Bence birçok insan değişkenlerinin boş olup olmadığını ve var olup olmadığını kontrol etmek istiyor. Varoluşu ve boşluğu kontrol etmenin birçok durumda iyi bir fikir olduğunu ve şablonunuzu daha sağlam ve aptalca hatalara daha az eğilimli hale getirdiğini düşünüyorum. Diğer bir deyişle, değişkeninizin null olmadığından ve kullanmadan önce boş olmadığından emin olursanız, şablonunuz daha esnek hale gelir, çünkü ona null bir değişken veya boş bir dize atayabilirsiniz ve aynı çalışır Her iki durumda da.

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

Diyelim ki bunun pboşluktan daha fazlası olduğundan emin olmak istiyorsunuz . Sonra bunu görmek için işaretlemeden önce bunu Döşeme olabilir has_content.

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

GÜNCELLEME

Lütfen öneriyi dikkate almayın - has_contentboş kontrolle birlikte boş bir kontrol yaptığı için gerekli olan tek şey budur. Yapmak buna p?? && p?has_contenteşdeğerdir p?has_content, bu yüzden sadece kullanabilirsiniz has_content.


2

FreeMarker 2.3.7'den önceki sürümler için

??Eksik değerleri işlemek için kullanamazsınız , eski sözdizimi:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.