Comment vérifier si une variable existe dans un modèle FreeMarker?

175

J'ai un modèle Freemarker qui contient un tas d'espaces réservés pour lesquels des valeurs sont fournies lorsque le modèle est traité. Je veux inclure conditionnellement une partie du modèle si la variable userName est fournie, quelque chose comme:

[#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 trouve pas d'autre moyen d'y parvenir. Bien sûr, je pourrais simplement fournir une variable booléenne supplémentaire isUserName et l'utiliser comme ceci:

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

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

Dónal
la source

Réponses:

304

Pour vérifier si la valeur existe:

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

Ou avec la syntaxe standard du freemarker:

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

Pour vérifier si la valeur existe et n'est pas vide:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
la source
1
Au cas où quelqu'un d'autre serait égaré par cela, la syntaxe #if devrait être entourée de caractères inférieurs et supérieurs à plutôt que de crochets. par exemple: <#if userName ??>
Cameron
Il est en fait possible d'utiliser cette syntaxe, j'ai donc juste suivi la syntaxe de la question: voir freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Cela vérifie uniquement si le var existe. Mais si vous avez une chaîne vide dans "userName", le <#if userName ??> retournera true !! Consultez la réponse @ user1546081 sur cette page pour résoudre ce problème.
Adrien Be
94

Celui-ci semble être un meilleur ajustement:

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

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

user1546081
la source
2
Semble vérifier si le var existe ET si son contenu n'est pas nul ou vide (se référant aux chaînes vides ici).
Adrien Be
4
Je dois voter contre cela car c'est techniquement incorrect et entraînera un comportement involontaire (faux négatif) si la variable existe (ce que l'op voulait vérifier) ​​mais est vide.
Madbreaks
65

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

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

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

Hi , How are you?

if_exists est désormais obsolète et a été remplacé par l'opérateur par défaut! un péché

Hi ${userName!}, How are you?

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

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
la source
1
L'opérateur de valeur par défaut ne peut pas être utilisé pour évaluer une valeur booléenne. En tant que tel, il ne peut pas être utilisé dans une ifinstruction comme op demandé.
Madbreaks
5

Je pense que beaucoup de gens veulent pouvoir vérifier si leur variable n'est pas vide ainsi que si elle existe. Je pense que vérifier l'existence et le vide est une bonne idée dans de nombreux cas, et rend votre modèle plus robuste et moins sujet aux erreurs stupides. En d'autres termes, si vous vérifiez que votre variable n'est pas nulle ET non vide avant de l'utiliser, votre modèle devient plus flexible, car vous pouvez y jeter 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 ce pn'est pas seulement un espace blanc. Ensuite, vous pouvez le couper avant de vérifier si c'est le cas has_content.

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

METTRE À JOUR

Veuillez ignorer ma suggestion - has_contentc'est tout ce qui est nécessaire, car il effectue une vérification nulle avec la vérification vide. Faire p?? && p?has_contentest équivalent à p?has_content, donc vous pouvez tout aussi bien utiliser has_content.

Jake Toronto
la source
2

Pour les versions antérieures à FreeMarker 2.3.7

Vous ne pouvez pas utiliser ??pour gérer les valeurs manquantes, l'ancienne syntaxe est:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Petter Friberg
la source