2008-11-20 10 views
135

Ich habe eine Freemarker-Vorlage, die eine Reihe von Platzhaltern enthält, für die Werte bereitgestellt werden, wenn die Vorlage verarbeitet wird. Ich möchte bedingt Teil der Vorlage enthalten, wenn der Benutzername Variable geliefert wird, so etwas wie:Wie überprüft man, ob eine Variable in einer FreeMarker-Vorlage existiert?

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

jedoch die Freemarker Handbuch scheint darauf hinzudeuten, dass if_exists veraltet ist, aber ich kann nicht einen anderen Weg, dies zu erreichen finden . Natürlich habe ich einfach könnte eine zusätzliche boolean Variable isUserName Bereitstellung und das, dass wie verwenden:

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

Aber wenn es eine Möglichkeit zu überprüfen, ob Benutzername existiert, dann kann ich das Hinzufügen dieser zusätzlichen Variable vermeiden.

Antwort

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

Oder mit dem Standard Freemarker Syntax:

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

, die nicht brechen, wenn username null ist, ist das Ergebnis, wenn:

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

Falls jemand anderes davon abgewiesen wurde, sollte die #if-Syntax von Zeichen umgeben sein, die kleiner als und größer als eckig sind. zum Beispiel: <#if userName ??> – Cameron

+0

Es ist tatsächlich möglich, diese Syntax zu verwenden, also folgte ich nur der Syntax der Frage: siehe http://freemarker.sourceforge.net/docs/dgui_misc_alternativesyntax.html –

+9

Dies nur Überprüfen Sie, ob die Variable existiert. Aber wenn Sie eine leere Zeichenfolge in "userName" haben, wird der <#if userName ??> True zurückgegeben !! Antworten Sie auf dieser Seite unter @ user1546081, um dieses Problem zu beheben. –

55

Auch if_exists Ich denke, war wie verwendet null wäre:

Hi , How are you? 

if_exists ist jetzt veraltet und wurde durch den Standardoperator ersetzt! wie in

Hi ${userName!}, How are you? 

der Standardoperator unterstützt auch einen Standardwert, wie zum Beispiel:

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

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

+12

Freaky-Syntax ... – skaffman

+0

Der Standardwertoperator kann nicht zum Auswerten eines booleschen Werts verwendet werden. Daher kann es nicht in einer "if" -Anweisung wie gewünscht verwendet werden. – Madbreaks

84

Dieses eine bessere Passform zu sein scheint denke, dass viele Leute in der Lage sein möchten zu überprüfen, ob ihre Variable nicht leer ist wie w so als ob es existiert. Ich denke, dass die Überprüfung auf Existenz und Leerheit in vielen Fällen eine gute Idee ist und Ihre Vorlage robuster und weniger anfällig für dumme Fehler macht. Mit anderen Worten, wenn Sie sicherstellen, dass Ihre Variable nicht null und nicht leer ist, bevor Sie sie verwenden, wird Ihre Vorlage flexibler, da Sie entweder eine leere Variable oder eine leere Zeichenfolge hineinwerfen können, und sie wird genauso funktionieren in beiden Fällen.

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

Angenommen, Sie sicherstellen möchten, dass p ist mehr als nur Leerzeichen. Dann könnten Sie es trimmen, bevor Sie überprüfen, ob es has_content ist.

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

UPDATE

Bitte meinen Vorschlag ignorieren - has_content ist alles, was benötigt wird, da es eine NULL-Prüfung zusammen mit dem leeren Check tut. Doing p?? && p?has_content entspricht p?has_content, Sie können also auch einfach has_content verwenden.

+2

Scheint zu prüfen, ob die Variable AND existiert und ob ihr Inhalt nicht null oder leer ist (bezieht sich hier auf leere Strings). –

+4

Sie müssen dies ablehnen, da es technisch falsch ist und zu einem unbeabsichtigten (falsch negativen) Verhalten führen wird, wenn die Variable * existiert * (was op überprüfen wollte), aber leer ist. – Madbreaks

2

I:

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