Template_

템플릿언더바(Template Underscore) 템플릿 태그에 대해 설명합니다.

주석

Template_ 공식 메뉴얼 : https://tpl.xtac.net/tutorial1

템플릿 태그

템플릿 태그는 템플릿 파일내에서 템플릿엔진이 해석할 위치를 표시합니다. 해석할 내용이 변수이든 제어명령이든 관계없이 { } , <!--{ } , { }--> , <!--{ }--> 모두가 유효한 템플릿 태그입니다.

템플릿 파일을 브라우저나 위지윅 에디터로 열었을 때, 바르게 보일 수 있도록 편리한대로 자유롭게 선택하여 사용할 수 있습니다.

하위템플릿 인클루드

명령어 의미 사용법
# 하위템플릿파일 인클루드 {# file_id }
  • 인클루드 예제

    * body.htm
    
    <table>
    <tr><td> {# left} </td><td> {# main} </td></tr>
    </table>
    
    * left.htm (#left)
    
    { link }
    
    * intro/intro.htm (#main)
    
    <table>
        <tr><td> xtac.net </td><td> <div>fine..thanks</div> </td></tr>
    </table>
    
    >> output
    <table>
        <tr><td>banana</td><td>yellow</td></tr>
        <tr><td>apple</td><td>red</td></tr>
    </table>
    

하위 템플릿파일 내에도 이 명령어를 사용할 수 있습니다.

루프

명령어 의미 사용법
@ 루프의 시작 {@ loop_id}
: 루프가 돌지 않았을 때 출력 (옵션) {:}
/ 루프의 끝 {/}
  • 루프 예제

    * index.htm
    
    <table>
        <tr><td colspan=2> {title} </td></tr>
        <tr><td> exponent </td><td> 2^exponent </td></tr>
        <!--{@ row}-->
        <tr><td> {row.exponent} </td><td> {row.power} </td></tr>
        <!--{/}-->
    </table>
    
    >> output
    
    <table>
        <tr><td colspan=2> power of 2 </td></tr>
        <tr><td> exponent </td><td> 2^exponent </td></tr>
        <tr><td> 1 </td><td> 2 </td></tr>
        <tr><td> 2 </td><td> 4 </td></tr>
        <tr><td> 3 </td><td> 8 </td></tr>
    </table>
    
  • 중첩 루프 예제

    * index.htm
    
    <table>
        <!--{@ group }-->
        <tr>
            <td> group: { group.name }</td>
            <td> item:
            <!--{@ item}-->
                {group.name}-{item.name}({item.num})
            <!--{:}-->
                -- if no item, print this --
            <!--{/}-->
            </td>
        </tr>
        <!--{/}-->
    </table>
    
    >> output
    
    <table>
        <tr>
            <td> group: sport</td>
            <td> item:
                sport-pingpong(5)
                sport-running(16)
            </td>
        </tr>
        <tr>
            <td> group: book</td>
            <td> item:
                -- if no item, print this --
            </td>
        </tr>
        <tr>
            <td> group: fruit</td>
            <td> item:
                fruit-apple(63)
            </td>
        </tr>
    </table>
    

템플릿태그내에 공백은 자유롭게 삽입할 수 있습니다. 상위루프의 변수는 추가적인 할당없이 중첩루프내에서도 사용할 수 있으며 일반템플릿변수는 템플릿 전체에서 유효합니다.

최상위루프의 변수이면 { .name }, 중첩루프의 변수면 { ..name } 과 같이 루프 아이디를 생략하고 루프변수를 짧게 표시할 수 있습니다. 이 때, 점의 개수는 중첩의 깊이를 나타냅니다.

<table>
<!--{@ group }-->
<tr>
    <td> group: {.name}</td>
    <td> item:
    <!--{@ item}-->
        {.name}-{..name}({..num})
    <!--{:}-->
        -- if no item, print this --
    <!--{/}-->
    </td>
</tr>
<!--{/}-->
</table>

루프 - 예약변수

예약변수 설명
index_ 0 부터 시작, 루프가 반복할 때 1 씩 증가
size_ 루프의 전체 반복 회수

size_ 는 해당루프 밖에서도 사용할 수 있습니다. 해당루프 밖에서 사용할 때는 {.size_} 처럼 루프아이디를 생략할 수는 없습니다.

* index.htm

<div>num of list: { list.size_ }</div>
<!--{@ list}-->
<div>{ list.index_ + start }th. { list.title }</div>
<!--{/}-->

>> output

<div>num of list: 3</div>
<div>10th. I Wish..</div>
<div>11th. Love Revolution 21</div>
<div>12th. The Peace</div>
예약변수 설명
key_ 루프로 할당된 배열의 키
value_ 루프로 할당된 배열의 값
* index.htm

<!--{@ fruit}-->
<div>{fruit.index_} - {fruit.key_} - {fruit.value_}</div>
<!--{/}-->
<div>num of fruit: {fruit.size_}</div>

>> output

<div>0 - apple - red</div>
<div>1 - banana - yellow</div>
<div>2 - 30 - unknown</div>
<div>num of list: 3</div>

루프 - 표현식

아래와 같이 루프명령어 뒤에 루프아이디 대신 표현식을 사용할 수 있습니다.

{@ P.myObj->getList() }
{@ range(1, list.estimation) }

루프아이디가 없기 때문에 해당루프의 변수는 루프아이디를 생략하는 형태만 가능하고 루프밖에서의 size_ 사용은 가능하지 않습니다.

아래 세 가지 중첩루프는 모두 같습니다.

{@ outer } {@ inner } {inner.var} {/} {/}
{@ outer } {@ .inner } {..var} {/} {/}
{@ outer } {@ outer.inner } {..var} {/} {/}

첫번째 inner 는 루프아이디이고, .innerouter.inner 는 표현식입니다.

  • key_ , value_ 를 이용한 중첩루프 예제
* getSomeList() 함수 데이타

array(
    'fruit' => array('apple', 'orange', 'pear'),
    'sport' => array('runging', 'pingpong'),
    'number'=> array(5, 100, 3, 65),
);


* index.htm

<table>
<!--{@ getSomeList()}-->
<tr><td>{.key_}</td><td>{@.value_}{..value_}, {/}</td></tr>
<!--{/}-->
</table>


>> output

<table>
<tr><td>fruit</td><td>apple, orange, pear,</td></tr>
<tr><td>sport</td><td>running, pingpong,</td></tr>
<tr><td>number</td><td>5, 100, 3, 65,</td></tr>
</table>

분기

if

문맥에 의해, : 은 분기의 else if, else 또는 루프의 else 로, / 은 루프나 분기의 종결문으로 해석됩니다.

명령어 의미 사용법
? if {? expression }
: elseif, else (옵션) {: expression }, {:}
/ endif {/}
  • 분기 예제

    * index.htm (fruit 값이 'banana')
    
    <!--{? fruit=='apple' || person=='santa' }-->
    <div> red </div>
    <!--{: fruit=='banana' }-->
    <div> yellow </div>
    <!--{: fruit=='orange' }-->
    <div> orange </div>
    <!--{:}-->
    <div> unknown </div>
    <!--{/}-->
    
    >> output
    
    <div> yellow </div>
    
  • 루프-분기 중첩 예제

    * index.htm
    
    <!--{@ page}-->
        <!--{? page.key_ == current }-->
            [ { page.key_ } ]
        <!--{:}-->
            <a href='{ page.value_ }'>[ { page.key_ } ]</a>
        <!--{/}-->
    <!--{:}-->
        -- no page --
    <!--{/}-->
    
    >> output
    
    <a href='page1.php'>[ 1 ]</a>
    [ 2 ]
    <a href='page3.php'>[ 3 ]</a>
    

switch

분기명령어 ? 뒤에 한 개 이상의 case 명령어 : 가 있으면 switch 분기로 해석됩니다.

명령어 의미 사용법
? [:] switch {? test_expression : label_expression … }
: case, default (옵션) {: label_expression …}, {:}
/ endswitch {/}

명령어들은 if 분기문, 루프문과 공통되지만 문맥에 의해 해석되고, 다른 구문들과 자유롭게 중첩해서 사용할 수 있으며, 정확하게 작성하지 않으면 템플릿 변환기가 적절한 오류메세지를 출력합니다.

* index.htm (_fruit 값이 'banana')

<!--{? _fruit :'banana'}-->
    yellow
<!--{:'apple' :'strawberry'}-->
    red
<!--{: _var}-->
    color of {_var}
<!--{:}-->
    unknown
<!--{/}-->

>> output

    yellow

주석

꼬리말형 주석

명령어 의미 사용법
// 변환시 태그내 〈//〉 이하문자 삭제 { any_template_code // any_string }

템플릿코드가 유효하지 않거나 이스케이프되었을 때는 삭제되지 않습니다.

  • 꼬리말형 주석 예제

    <table>
    <!--{@ list // loop starts!! }-->
    <tr>
        <td>{start - .index_ // list number }</td>
        <td>{.title}</td>
    </tr>
    <!--{/// list ends!! }-->
    </table>
    

블럭형 주석

명령어 의미 사용법
* 변환파일에서 삭제됨 {* any_string *}
  • 블럭형 주석 예제

    <!--{* Template {comments} are {removed} in compiled file *}-->
    <table>
    <tr>
        <td width="50px">
            <!--{ template * expression / overflows + width50px }-->{*no*}
        </td>
        <td width="250px">
            { width250px & is | enough }
        </td>
    </tr>
    </table>
    

다음 템플릿 태그는 {* *} , <!--{* *} , {* *}--> , <!--{* *}--> 모두 유효한 템플릿 주석입니다.

표현식

++ -- ?: , >>> 할당연산자 예약어연산자 등을 제외한 연산자를 사용하여 자바스크립트 문법을 따르는 표현식을 자유롭게 작성할 수 있습니다.

{ forum.listnum % 2 }
{ (some.var + 3) * test }

이스케이프

명령어 설명
\ 템플릿코드를 그대로 출력.

템플릿코드의 형식이 올바르지 않을 경우 이스케이프명령어가 없어도 그대로 출력합니다.

이스케이프 출력  
{\@ abc} {@ abc}  
{ 2 + 2 } 4  
{\ 2 + 2 } { 2 + 2 }  
{\ 2 + 2 } {2 + 2 }  
{ 2 + (2 } { 2 + (2 } 형식이 바르지 않은 경우
{\ 2 + (2 } {2 + (2 }  

{ orange + 2 } 와 같은 무의미한 자바스크립트블럭을 제외하면, 템플릿코드는 이스케이프하지 않아도 스타일시트나 자바스크립트와 충돌하지 않습니다.

상수

형(type) 지정자 (예약어) 의미 사용법
  1. (또는 C.)
뒤의 붙은 아이디가 상수임 { c.CONSTANT }

PHP 에 내장된 상수 또는 define() 함수에 의한 사용자정의 상수를 별도의 할당없이 템플릿내에서 사용할 수 있습니다.

::
{ C.SOME_USER_CONSTANT } {= htmlspecialchars( list.data.title, C.ENT_QUOTES ) } {? userFunc(user.name, true) == false } some message {/}

true , false , null 은 상수가 아닌 예약어이므로, C. 를 붙이지 않고 사용가능합니다.

배열

배열요소를 하나하나 할당하지 않고 배열자체를 하나의 템플릿 변수로 할당할 수 있습니다. 인덱스배열, 연관배열, 다중배열 모두 가능합니다.

  • 배열 할당 예제

    * $user 배열
    
    [
        'name'=>'julia',
        'hobby'=>[
            'swimming',
            'singing'
        ]
    ]
    
    * index.htm
    
    <div>{user.name} {user.hobby[0]} {user.hobby[1]}</div>
    
    >> output
    
    <div>julia swimming singing</div>
    

자바스크립트와 마찬가지로 {user.name} 과 {user[《name》]}, {user[〈name〉]} 은 모두 같으며, {user[name]} 처럼 따옴표가 없을 때의 name 은 템플릿 변수이고, 인덱스 배열의 경우, [] 를 사용하는 {style[23]} 의 형식만 가능합니다.

배열요소를 템플릿 표현식의 일부로 사용할 수 있으며, 배열을 루프변수로 할당할 수도 있습니다.

  • 루프 - 배열 할당

    * $list 배열
    
    [
        'start'=>5,
        'list'=>[
            'data'=>[
                'num'=>[
                    1,
                    2,
                    3
                ],
                'name'=>[
                    'Julia',
                    'Maria',
                    'Mickey'
                ],
                'date'=>[
                    '1993-05-06',
                    '2002-02-22',
                    '2003-03-01'
                ]
            ]
        ]
    ]
    
    * index.htm
    
    <!--{@ list}-->
    <div>{list.data.num + start}. {list.data.name} ({.data.date})</div>
    <!--{/}-->
    
    >> output
    
    <div>6. Julia (1993-05-06)</div>
    <div>7. Maria (2002-02-22)</div>
    <div>8. Mickey (2003-03-01)</div>
    

루프변수가 배열일 때도 {.data.num} 과 같이 루프아이디를 생략할 수 있습니다.

함수

템플릿표현식 내에 PHP 함수를 PHP 문법대로 자유롭게 사용할 수 있습니다. 단, 함수를 사용할 때는 출력명령어(=)를 생략할 수 없습니다.

{= date('Y-m-d h:i:s', timestamp) }
{= number_format(user.money) }
{= str_repeat( preg_replace('/\d+/', '', user.info), 10 ) }
{? empty(_COOKIE) || click=='first' || userFunc(arg) } hello {/}

객체

객체 또한 표현식의 구성요소로 자유롭게 사용할 수 있습니다.

연산자 사용법
-> { object->method() }, { object->property }
  • 객체 사용 예제
* index.php

<?php
class tplobj {
    public $user = 'julia';
    function hello() {
        return 'hello! ' . $this->user;
    }
}


* index.htm

<div> { tplobj->user } </div><div> { tplobj->hello() } </div>

>> output

<div> julia </div><div> hello! juila </div>

템플릿 파일내의 this 는 템플릿 객체를 참조합니다.

{ this->template_dir }
{= userFunc(this, arg1, arg2) }