* 프리마커 2.4를 기준으로 한다.
has_content
has_content 가 하는 일
- null 체크. (해당 필드의 존재 여부 체크)
- 필드 내의 값이 empty 인지 체크
has_content 를 풀어보면
- 변수가 실제로 존재하는지 체크 (exists, if_exists 가 하는 일과 동일)
- 필드 내의 값이 empty 인지 체크
-- 프리마커가 의미하는 empty 란?
has_content 를 잘못 사용하는 예
- 필드의 존재 여부만을 판단하기 위해 잘못 사용한 경우
- (실제로 나올수 없는 코드이지만.. ) 필드의 논리적인 흐름을 무시하고 사용하는 예
- 기타로 논리적으로 나올수 없는 체인은 has_content 역시 통과시키지 못합니다.!
무조건 has_content 를 쓸 필요가 없다는 것을 우리는 압니다.
- 우리는 모두 똑같아
has_content 는 귀찮아.
- if 조건문으로 감싸줘야 합니다.
- 언제 어디서나 묻지마 has_content
귀찮은 has_content 를 쓰지않고 같은 결과 얻어내기
예제 1
예제 2
2개 이상의 depth를 가진 필드를 체크하고 싶다면? 괄호를 치세요
! 를 사용할때, 필드가 존재하지 않을때의 대체 값을 지정할 수 있어요.
여기서 잠깐! default 에 대해서 알아봅시다.
default 가 내가 생각했던 그 default 가 아니었다!
default 는 missing value 의 대체 값만을 넣어주는 역할만 합니다.
그 예로
해서, 원래 의도했던 default 함수를 만들어 보면,
그래서 좀더 정확하게 get 함수를 만든다면,
기타 패턴들
소숫점 조절하기
has_content
has_content 가 하는 일
- null 체크. (해당 필드의 존재 여부 체크)
- 필드 내의 값이 empty 인지 체크
has_content 를 풀어보면
- 변수가 실제로 존재하는지 체크 (exists, if_exists 가 하는 일과 동일)
- 필드 내의 값이 empty 인지 체크
-- 프리마커가 의미하는 empty 란?
단순하게, size == 0 또는 length == 0 인것을 empty 로 판단.
empty 체크의 대상은 string, sequence, hash, collection 만이고,
date, number, boolean 은 제외된다. (이들은 모두 기본값이 정의되어 있기 때문)
empty 체크의 대상은 string, sequence, hash, collection 만이고,
date, number, boolean 은 제외된다. (이들은 모두 기본값이 정의되어 있기 때문)
has_content 를 잘못 사용하는 예
- 필드의 존재 여부만을 판단하기 위해 잘못 사용한 경우
<#assign t = ''>
<#if t?has_content>
나는 안나와..
<#else>
이게 나온다,.
</#if>
<#if t?has_content>
나는 안나와..
<#else>
이게 나온다,.
</#if>
- (실제로 나올수 없는 코드이지만.. ) 필드의 논리적인 흐름을 무시하고 사용하는 예
- 기타로 논리적으로 나올수 없는 체인은 has_content 역시 통과시키지 못합니다.!
<#assign str = 's'>
<#if str.b?has_content>
kkkkkkk
</#if>
<#if str.b?has_content>
kkkkkkk
</#if>
무조건 has_content 를 쓸 필요가 없다는 것을 우리는 압니다.
- 우리는 모두 똑같아
value?has_content
==
value!?size > 0
==
value!?length > 0
==
value?exists?length > 0
==
value?if_exists?length > 0
==
value!?size > 0
==
value!?length > 0
==
value?exists?length > 0
==
value?if_exists?length > 0
has_content 는 귀찮아.
- if 조건문으로 감싸줘야 합니다.
- 언제 어디서나 묻지마 has_content
귀찮은 has_content 를 쓰지않고 같은 결과 얻어내기
예제 1
<#if a?has_content>
${a}
</#if>
-->
${a!}
${a}
</#if>
-->
${a!}
예제 2
<#assign a = ''>
<#if server.a?has_content>
<#assign a = server.a>
</#if>
-->
<#assign a = server.a!>
<#if server.a?has_content>
<#assign a = server.a>
</#if>
-->
<#assign a = server.a!>
2개 이상의 depth를 가진 필드를 체크하고 싶다면? 괄호를 치세요
<#assign value = ''>
<#if a?has_content && a.b?has_content && a.b.c?has_content && a.b.c[0]?has_content>
</#if>
-->
<#assign value = (a.b.c[0])!>
<#if a?has_content && a.b?has_content && a.b.c?has_content && a.b.c[0]?has_content>
<#assign value = a.b.c[0]>
-->
<#assign value = (a.b.c[0])!>
! 를 사용할때, 필드가 존재하지 않을때의 대체 값을 지정할 수 있어요.
<#assign val = (a.b.c.d.e.f.g.h[0])!'HELLO~'>
<#assign val = (a.b.c.d.e.f.g.h[0])!{'title': '하이'}>
<#assign val = (a.b.c.d.e.f.g.h[0])![1, 2, 3, 4, 5]>
<#assign val = (a.b.c.d.e.f.g.h[0])!(item.weight * itemCount + 10)>
<#assign val = (a.b.c.d.e.f.g.h[0])!{'title': '하이'}>
<#assign val = (a.b.c.d.e.f.g.h[0])![1, 2, 3, 4, 5]>
<#assign val = (a.b.c.d.e.f.g.h[0])!(item.weight * itemCount + 10)>
여기서 잠깐! default 에 대해서 알아봅시다.
<#assign vgatype = "w">
<#if param.vgatype?has_content && param.vgatype[0]?default("w")=="h">
<#assign vgatype = "h">
</#if>
<#if param.vgatype?has_content && param.vgatype[0]?default("w")=="h">
<#assign vgatype = "h">
</#if>
default 가 내가 생각했던 그 default 가 아니었다!
default 는 missing value 의 대체 값만을 넣어주는 역할만 합니다.
그 예로
<#assign val = ''>
<#assign val = val?default('UTSMAN')>
결과는 UTSMAN 이 아닌, '' 입니다.
<#assign val = val?default('UTSMAN')>
결과는 UTSMAN 이 아닌, '' 입니다.
해서, 원래 의도했던 default 함수를 만들어 보면,
<#function get val, default>
<#if val?has_content>
<#return val>
<#else>
<#return default>
</#if>
</#function>
<#assign val = get(val!, 'UTSMAN')>
string, sequence, hash, collection 에서 사용 가능합니다.
number, date, boolean 'default' 가 필요없는 애들이라 제외해도 된다고 생각합니다.
has_content 가 위의 타입을 length 와 size 로 알아서 체크해주고,
! .. 즉 not exists 일때, 프리마커가 필드를 string, sequence, hash, collection 타입을 한꺼번에
모두 리턴해 주기 때문에, 위 펑션이 가능해집니다.
<#if val?has_content>
<#return val>
<#else>
<#return default>
</#if>
</#function>
<#assign val = get(val!, 'UTSMAN')>
string, sequence, hash, collection 에서 사용 가능합니다.
number, date, boolean 'default' 가 필요없는 애들이라 제외해도 된다고 생각합니다.
has_content 가 위의 타입을 length 와 size 로 알아서 체크해주고,
! .. 즉 not exists 일때, 프리마커가 필드를 string, sequence, hash, collection 타입을 한꺼번에
모두 리턴해 주기 때문에, 위 펑션이 가능해집니다.
그래서 좀더 정확하게 get 함수를 만든다면,
<#function get val, default>
<#if val?is_string>
<#return val?length > 0>
<#elseif val?is_sequence>
<#return val?size > 0>
.....
</#function>
와 같이 할수 있습니다.
<#if val?is_string>
<#return val?length > 0>
<#elseif val?is_sequence>
<#return val?size > 0>
.....
</#function>
와 같이 할수 있습니다.
기타 패턴들
소숫점 조절하기
<#assign val = '12345.6789'>
#{val?number; M2} //소숫점 2자리 반올림
-->
12345.68
#{val?number; M2} //소숫점 2자리 반올림
-->
12345.68