Wie überprüfe ich, ob eine Variable in einer FreeMarker-Vorlage vorhanden ist?

175

Ich habe eine Freemarker-Vorlage, die eine Reihe von Platzhaltern enthält, für die Werte angegeben werden, wenn die Vorlage verarbeitet wird. Ich möchte einen Teil der Vorlage bedingt einschließen, wenn die Variable userName angegeben wird, etwa:

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

Das FreeMarker-Handbuch scheint jedoch darauf hinzuweisen, dass if_exists veraltet ist, aber ich kann keinen anderen Weg finden, um dies zu erreichen. Natürlich könnte ich einfach eine zusätzliche boolesche Variable isUserName bereitstellen und diese wie folgt verwenden:

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

Wenn es jedoch eine Möglichkeit gibt, zu überprüfen, ob Benutzername vorhanden ist, kann ich das Hinzufügen dieser zusätzlichen Variablen vermeiden.

Dónal
quelle

Antworten:

302

So überprüfen Sie, ob der Wert vorhanden ist:

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

Oder mit der Standard-Freemarker-Syntax:

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

So überprüfen Sie, ob der Wert vorhanden und nicht leer ist:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
quelle
1
Falls jemand anderes davon abgehalten wurde, sollte die # if-Syntax von weniger als und mehr als Zeichen und nicht von Klammern umgeben sein. Zum Beispiel: <#if userName ??>
Cameron
Es ist tatsächlich möglich, diese Syntax zu verwenden, daher habe ich gerade die Syntax der Frage befolgt: siehe freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Dies prüft nur, ob die Variable existiert. Wenn Sie jedoch einen leeren String in "userName" haben, gibt der <#if userName ??> true zurück !! Siehe @ user1546081 Antwort auf dieser Seite, um dieses Problem zu beheben.
Adrien Be
94

Dieser scheint besser zu passen:

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

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

user1546081
quelle
2
Scheint zu überprüfen, ob die Variable existiert UND ob ihr Inhalt nicht null oder leer ist (siehe leere Zeichenfolgen hier).
Adrien Be
4
Sie müssen dies ablehnen, da es technisch nicht korrekt ist und zu unbeabsichtigtem (falsch negativem) Verhalten führt, wenn die Variable vorhanden ist (worauf op prüfen wollte), aber leer ist.
Madbreaks
65

Ich denke auch, dass if_exists wie folgt verwendet wurde:

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

Dies wird nicht unterbrochen, wenn userName null ist. Das Ergebnis, wenn null wäre, 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, z.

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
quelle
1
Der Standardwertoperator kann nicht zur Auswertung eines Booleschen Werts verwendet werden. Als solches kann es nicht ifwie gewünscht in einer Anweisung verwendet werden.
Madbreaks
5

Ich denke, viele Leute wollen in der Lage sein zu überprüfen, ob ihre Variable nicht leer ist oder ob sie existiert. Ich denke, dass die Überprüfung auf Existenz und Leere 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 überprüfen, ob Ihre Variable nicht null UND nicht leer ist, bevor Sie sie verwenden, wird Ihre Vorlage flexibler, da Sie entweder eine Nullvariable oder eine leere Zeichenfolge hineinwerfen können und sie genauso funktioniert in beiden Fällen.

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

Angenommen, Sie möchten sicherstellen, dass dies pmehr als nur Leerzeichen sind. Dann können Sie es zuschneiden, bevor Sie prüfen, ob es vorhanden ist has_content.

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

AKTUALISIEREN

Bitte ignorieren Sie meinen Vorschlag - has_contentist alles, was benötigt wird, da es eine Nullprüfung zusammen mit der leeren Prüfung durchführt. Tun p?? && p?has_contentist gleichbedeutend mit p?has_content, also können Sie es auch einfach verwenden has_content.

Jake Toronto
quelle
2

Für Versionen vor FreeMarker 2.3.7

Sie können nicht verwenden ??, um fehlende Werte zu behandeln. Die alte Syntax lautet:

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