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.

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>

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


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?

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.


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.