티스토리 툴바


프리마커의 진실

2010/11/25 05:04 from 분류없음
* 프리마커 2.4를 기준으로 한다.

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 은 제외된다. (이들은 모두 기본값이 정의되어 있기 때문)










has_content 를 잘못 사용하는 예

- 필드의 존재 여부만을 판단하기 위해 잘못 사용한 경우
<#assign t = ''>
<#if t?has_content>
       나는 안나와..
 <#else>
      이게 나온다,.
</#if>

- (실제로 나올수 없는 코드이지만.. ) 필드의 논리적인 흐름을 무시하고 사용하는 예
- 기타로 논리적으로 나올수 없는 체인은 has_content 역시 통과시키지 못합니다.!
<#assign str = 's'>
<#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


















has_content 는 귀찮아.

- if  조건문으로 감싸줘야 합니다.
- 언제 어디서나 묻지마 has_content
















귀찮은 has_content 를 쓰지않고 같은 결과 얻어내기

예제 1
<#if a?has_content>
      ${a}
</#if>

-->

${a!}

예제 2
<#assign 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>
<#assign value = a.b.c[0]>
</#if>

-->

<#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)>


여기서 잠깐! default 에 대해서 알아봅시다.

<#assign vgatype = "w">
<#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 이 아닌, '' 입니다.


해서, 원래 의도했던 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 타입을 한꺼번에
모두 리턴해 주기 때문에, 위 펑션이 가능해집니다.


그래서 좀더 정확하게 get 함수를 만든다면,

<#function get val, default>
    <#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







 
저작자 표시
Posted by utsman 트랙백 0 : 댓글 0