Jak sprawdzić, czy zmienna istnieje w szablonie FreeMarker?

175

Mam szablon Freemarker, który zawiera kilka symboli zastępczych, dla których wartości są dostarczane podczas przetwarzania szablonu. Chcę warunkowo dołączyć część szablonu, jeśli podano zmienną userName, na przykład:

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

Jednak podręcznik FreeMarker wydaje się wskazywać, że if_exists jest przestarzałe, ale nie mogę znaleźć innego sposobu, aby to osiągnąć. Oczywiście mógłbym po prostu podać dodatkową zmienną logiczną isUserName i użyć jej w ten sposób:

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

Ale jeśli istnieje sposób sprawdzenia, czy nazwa użytkownika istnieje, mogę uniknąć dodawania tej dodatkowej zmiennej.

Dónal
źródło

Odpowiedzi:

304

Aby sprawdzić, czy wartość istnieje:

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

Lub ze standardową składnią freemarkera:

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

Aby sprawdzić, czy wartość istnieje i nie jest pusta:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
źródło
1
Na wypadek, gdyby ktokolwiek inny został przez to odrzucony, składnia #if powinna być otoczona znakami mniej niż i większymi niż znakami zamiast nawiasów. na przykład: <#if userName ??>
Cameron
To jest rzeczywiście możliwe, aby korzystać z tej składni, więc po prostu po składni pytanie: patrz freemarker.sourceforge.net/docs/...
Ulf Lindbäck
10
To tylko sprawdza, czy zmienna istnieje. Ale jeśli masz pusty ciąg w „userName”, <#if userName ??> zwróci wartość true !! Zobacz odpowiedź @ user1546081 na tej stronie, aby rozwiązać ten problem.
Adrien Be
94

Ten wydaje się lepiej pasować:

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

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

user1546081
źródło
2
Wydaje się, że sprawdza, czy zmienna istnieje ORAZ czy jej zawartość nie jest zerowa lub pusta (odnosi się do pustych ciągów znaków tutaj).
Adrien Be
4
Muszę to odrzucić, ponieważ jest to technicznie niepoprawne i doprowadzi do niezamierzonego (fałszywie negatywnego) zachowania, jeśli zmienna istnieje (co chciał sprawdzić op), ale jest pusta.
Madbreaks
65

Myślę też, że if_exists zostało użyte tak:

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

która nie ulegnie zerwaniu, jeśli nazwa_użytkownika ma wartość null, wynikiem, jeśli null byłby:

Hi , How are you?

if_exists jest teraz przestarzałe i zostało zastąpione operatorem domyślnym! jak w

Hi ${userName!}, How are you?

operator domyślny obsługuje również wartości domyślne, takie jak:

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
źródło
1
Operator wartości domyślnej nie może służyć do obliczania wartości logicznej. W związku z tym nie można go użyć w ifoświadczeniu zgodnie z żądaniem op.
Madbreaks
5

Myślę, że wiele osób chce mieć możliwość sprawdzenia, czy ich zmienna nie jest pusta, a także czy istnieje. Myślę, że sprawdzanie istnienia i pustki jest dobrym pomysłem w wielu przypadkach i sprawia, że ​​twój szablon jest bardziej niezawodny i mniej podatny na głupie błędy. Innymi słowy, jeśli upewnisz się, że zmienna nie ma wartości null ORAZ nie jest pusta przed jej użyciem, Twój szablon stanie się bardziej elastyczny, ponieważ możesz wrzucić do niego zmienną zerową lub pusty ciąg i będzie działać tak samo W obu przypadkach.

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

Powiedzmy, że chcesz się upewnić, że pto coś więcej niż tylko białe znaki. Następnie możesz go przyciąć przed sprawdzeniem, czy jest has_content.

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

AKTUALIZACJA

Proszę zignorować moją sugestię - has_contentto wszystko, co jest potrzebne, ponieważ wykonuje sprawdzenie zerowe wraz z pustym czekiem. Działanie p?? && p?has_contentjest równoważne z p?has_content, więc równie dobrze możesz po prostu użyć has_content.

Jake Toronto
źródło
2

W przypadku wersji wcześniejszych niż FreeMarker 2.3.7

Nie możesz użyć ??do obsługi brakujących wartości, stara składnia to:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Petter Friberg
źródło