189 votes

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

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 de 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, alors je peux éviter d'ajouter cette variable supplémentaire.

331voto

Ulf Lindback Points 5235

Pour vérifier si la valeur existe :

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

Ou avec la syntaxe standard de 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>

1 votes

Au cas où quelqu'un d'autre aurait été déconcerté par cela, la syntaxe #if devrait être entourée de caractères moins que et plus que plutôt que de crochets. par exemple : <#if nomutilisateur??>

0 votes

Il est en fait possible d'utiliser cette syntaxe, j'ai donc suivi la syntaxe de la question : voir freemarker.sourceforge.net/docs/

10 votes

Cette méthode ne vérifie que si la variable existe. Mais si vous avez une chaîne vide dans "userName", le <#if userName??> retournera true ! !! Voir la réponse de @user1546081 sur cette page pour résoudre ce problème.

102voto

user1546081 Points 439

Celui-ci semble mieux adapté :

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

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

2 votes

Semble vérifier si la variable existe ET si son contenu n'est pas nul ou vide (on parle ici de chaînes vides).

5 votes

Je dois rétrograder parce que c'est techniquement incorrect et que cela conduira à un comportement involontaire (faux négatif) si la variable existe (ce que l'op voulait vérifier) mais il est vide.

69voto

Ulf Lindback Points 5235

Je pense également que si_existe a été utilisé comme :

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

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

Hi , How are you?

if_exists est désormais 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, comme par exemple :

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

1 votes

L'opérateur de valeur par défaut ne peut pas être utilisé pour évaluer un booléen. Il ne peut donc pas être utilisé dans un if comme l'a demandé l'op.

0 votes

Bonjour, existe-t-il un moyen de faire ${userName!?size} sans l'instruction "if" ? Et ${user !.userName!?size}

6voto

Jake Toronto Points 355

Je pense que beaucoup de gens veulent pouvoir vérifier si leur variable n'est pas vide ou si elle existe. Je pense que la vérification de l'existence et de la vacuité est une bonne idée dans de nombreux cas, et qu'elle rend votre modèle plus robuste et moins sujet à des erreurs stupides. En d'autres termes, si vous vérifiez que votre variable n'est pas nulle ET qu'elle n'est pas vide avant de l'utiliser, alors votre modèle devient plus flexible, parce que vous pouvez y jeter une variable nulle ou une chaîne vide, et il fonctionnera de la même manière dans les deux cas.

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

Supposons que vous souhaitiez vous assurer que p est plus qu'un simple espace blanc. Vous pourriez alors l'élaguer avant de vérifier s'il s'agit d'un has_content .

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

MISE À JOUR

Veuillez ignorer ma suggestion has_content est tout ce qu'il faut, car il vérifie la présence de null en même temps que celle de empty. Faire p?? && p?has_content est équivalent à p?has_content Vous pouvez donc tout aussi bien utiliser has_content .

4voto

Petter Friberg Points 14931

Pour les versions antérieures à FreeMarker 2.3.7

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X