2008-11-20 9 views
135

J'ai un modèle Freemarker qui contient un ensemble d'espaces réservés pour lesquels des valeurs sont fournies lors du traitement du modèle. Je veux conditionnellement partie du modèle si la variable userName est fourni, quelque chose comme:Comment vérifier si une variable existe dans un modèle FreeMarker?

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

Cependant, le manuel FreeMarker semble indiquer que if_exists est obsolète, mais je ne peux pas trouver un autre moyen d'y parvenir . Bien sûr, je pourrais simplement fournir une isUserName variable booléenne supplémentaire et l'utiliser comme ceci:

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

Mais s'il y a un moyen de vérifier si existe userName je peux éviter d'ajouter cette variable supplémentaire.

Répondre

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

Ou avec la syntaxe standard freemarker:

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

Dans le cas où quelqu'un d'autre aurait été éjecté par cela, la syntaxe #if devrait être entourée de moins de et plus grand que les caractères plutôt que les crochets. par exemple: <#if userName ??> – Cameron

+0

Il est réellement possible d'utiliser cette syntaxe, donc je viens de suivre la syntaxe de la question: voir http://freemarker.sourceforge.net/docs/dgui_misc_alternativesyntax.html –

+9

Ceci seulement Vérifiez si la var existe. Mais si vous avez une chaîne vide dans "userName", le <#if userName ??> retournera vrai !! Voir @ user1546081 réponse sur cette page pour résoudre ce problème. –

55

Je pense aussi if_exists a été utilisé comme:

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

qui ne cassera pas si userName est nulle, le résultat si null serait:

Hi , How are you? 

if_exists est maintenant obsolète et a été remplacé par l'opérateur par défaut! comme dans

Hi ${userName!}, How are you? 

l'opérateur par défaut prend également en charge une valeur par défaut, tels que:

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

Syntaxe freaky ... – skaffman

+0

L'opérateur de valeur par défaut ne peut pas être utilisé pour évaluer un booléen. En tant que tel, il ne peut pas être utilisé dans une instruction 'if' comme op demandé. – Madbreaks

84

Celui-ci semble être un meilleur ajustement:

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

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

+2

Semble vérifier si la var existe ET si son contenu n'est pas nul ou vide (en référence aux chaînes vides ici). –

+4

Avoir à downvote cela parce qu'il est techniquement incorrect et conduira à un comportement involontaire (faux négatifs) si la variable * existe * (ce que l'op voulait vérifier) ​​mais est vide. – Madbreaks

2

I pense que beaucoup de gens veulent être en mesure de vérifier si leur variable n'est pas vide comme w ell comme si elle existe. Je pense que la vérification de l'existence et du vide est une bonne idée dans beaucoup de cas, et rend votre modèle plus robuste et moins sujet aux erreurs idiotes. En d'autres termes, si vous vérifiez que votre variable n'est pas vide et non vide avant de l'utiliser, votre modèle devient plus flexible, car vous pouvez y insérer une variable nulle ou une chaîne vide, et cela fonctionnera de la même manière dans tous les cas.

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

Disons que vous voulez vous assurer que p est plus qu'un simple espace. Ensuite, vous pouvez le couper avant de vérifier pour voir si has_content.

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

MISE À JOUR

S'il vous plaît ignorer ma suggestion - has_content est tout ce qui est nécessaire, comme il le fait un chèque nul avec le chèque vide. Faire p?? && p?has_content est équivalent à p?has_content, donc vous pouvez aussi bien utiliser has_content.

Questions connexes