จะตรวจสอบว่าตัวแปรมีอยู่ในเทมเพลต FreeMarker ได้อย่างไร?


175

ฉันมีเทมเพลต Freemarker ซึ่งมีตัวแทนตัวยึดมากมายซึ่งค่าจะได้รับเมื่อประมวลผลแม่แบบ ฉันต้องการรวมเป็นส่วนหนึ่งของแม่แบบตามเงื่อนไขหากมีการให้ตัวแปรชื่อผู้ใช้สิ่งที่ชอบ:

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

อย่างไรก็ตามคู่มือ FreeMarker ดูเหมือนจะบ่งบอกว่า if_exists เลิกใช้แล้ว แต่ฉันไม่สามารถหาวิธีอื่นเพื่อให้ได้สิ่งนี้ แน่นอนฉันสามารถให้ตัวแปรบูลีน isUserName อย่างง่าย ๆ และใช้สิ่งนี้:

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

แต่ถ้ามีวิธีตรวจสอบว่ามีชื่อผู้ใช้อยู่หรือไม่ฉันสามารถหลีกเลี่ยงการเพิ่มตัวแปรพิเศษนี้ได้

คำตอบ:


304

วิธีตรวจสอบว่ามีค่าอยู่หรือไม่:

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

หรือด้วยไวยากรณ์ freemarker มาตรฐาน:

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

ในการตรวจสอบว่ามีค่าอยู่หรือไม่และว่างเปล่า:

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

1
ในกรณีที่คนอื่นถูกโยนออกมาโดยสิ่งนี้ไวยากรณ์ #if ควรล้อมรอบด้วยอักขระที่น้อยกว่าและมากกว่าอักขระมากกว่าวงเล็บเหลี่ยม ตัวอย่างเช่น: <#if userName ??>
Cameron

เป็นไปได้จริงที่จะใช้ไวยากรณ์นี้ดังนั้นฉันเพิ่งตามไวยากรณ์ของคำถาม: ดูfreemarker.sourceforge.net/docs/…
Ulf Lindback

10
นี้จะตรวจสอบว่า var อยู่ แต่ถ้าคุณมีสตริงว่างใน "ชื่อผู้ใช้", <# ชื่อผู้ใช้ ??> จะกลับมาจริง !! ดู @ user1546081 คำตอบในหน้านี้เพื่อแก้ไขปัญหานี้
Adrien เป็น

94

ดูเหมือนว่าแบบนี้จะดีกว่า:

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

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


2
ดูเหมือนว่าจะตรวจสอบว่ามี var และถ้าเนื้อหานั้นไม่ว่างเปล่าหรือเปล่า (อ้างอิงจากสตริงว่างที่นี่)
Adrien เป็น

4
ต้อง downvote นี้เพราะมันไม่ถูกต้องทางเทคนิคและจะนำไปสู่พฤติกรรมที่ไม่ตั้งใจ (false negative) หากตัวแปรนั้นมีอยู่ (สิ่งที่ op ต้องการตรวจสอบ) แต่ว่างเปล่า
Madbreaks

65

นอกจากนี้ฉันคิดว่ามีการใช้if_existsเช่น:

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

ซึ่งจะไม่แตกถ้าชื่อผู้ใช้เป็นโมฆะผลลัพธ์ถ้าเป็นโมฆะจะเป็น:

Hi , How are you?

if_exists เลิกใช้แล้วและถูกแทนที่ด้วยโอเปอเรเตอร์เริ่มต้น! เช่นเดียวกับใน

Hi ${userName!}, How are you?

ผู้ประกอบการเริ่มต้นยังรองรับค่าเริ่มต้นเช่น:

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

1
ตัวดำเนินการค่าเริ่มต้นไม่สามารถใช้ประเมินค่าบูลีนได้ ดังนั้นจึงไม่สามารถใช้ในifคำสั่งตามที่ร้องขอได้
Madbreaks

5

ฉันคิดว่าผู้คนจำนวนมากต้องการที่จะสามารถตรวจสอบเพื่อดูว่าตัวแปรของพวกเขาไม่ว่างเปล่าเช่นเดียวกับถ้ามันมีอยู่ ฉันคิดว่าการตรวจสอบการมีอยู่และความว่างเปล่าเป็นความคิดที่ดีในหลาย ๆ กรณีและทำให้แม่แบบของคุณแข็งแกร่งขึ้นและมีแนวโน้มที่จะเกิดข้อผิดพลาดโง่น้อยลง กล่าวอีกนัยหนึ่งถ้าคุณตรวจสอบให้แน่ใจว่าตัวแปรของคุณไม่ใช่โมฆะและไม่ว่างเปล่าก่อนที่จะใช้เทมเพลตของคุณจะมีความยืดหยุ่นมากขึ้นเนื่องจากคุณสามารถโยนตัวแปรว่างหรือสตริงว่างลงในนั้นและจะทำงานเหมือนเดิม ในทั้งสองกรณี

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

สมมติว่าคุณต้องการตรวจสอบให้แน่ใจว่าpมันเป็นมากกว่าช่องว่าง has_contentจากนั้นคุณสามารถตัดมันก่อนการตรวจสอบเพื่อดูว่า

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

UPDATE

โปรดเพิกเฉยต่อข้อเสนอแนะของฉัน - has_contentเป็นสิ่งที่จำเป็นทั้งหมดเช่นเดียวกับการตรวจสอบว่างเปล่าพร้อมกับการตรวจสอบที่ว่างเปล่า ทำp?? && p?has_contentเทียบเท่ากับดังนั้นคุณอาจได้เป็นอย่างดีเพียงแค่การใช้งานp?has_contenthas_content


2

สำหรับรุ่นก่อนหน้า FreeMarker 2.3.7

คุณไม่สามารถใช้??เพื่อจัดการค่าที่หายไปไวยากรณ์เก่าคือ:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.