I. BASIC
목차
1.  환경설정
템플릿언더바는 PHP 4.1.0 이상에서 작동합니다.
var $template_dir = '_template';  
var $compile_dir  = '_compile';
$compile_dir 은 템플릿언더바가 템플릿파일을 변환하여 저장하는 디렉토리입니다. 운영체제상의 절대경로나 실행파일을 기준으로 한 상대경로를 지정합니다.
/
home
htdocs
index.php (실행파일)
_template
index.tpl (템플릿파일)
_compile
index.tpl.php (템플릿변환파일)
리눅스를 작업용 서버로 사용할 때, 변환파일이 위치할 디렉토리에 대해 웹서버(nobody)가 읽고 쓰기 권한을 가져야 합니다. 레퍼런스의 환경설정2 에서 싸이트 구성 방법을 참고하시기 바랍니다.
2.  템플릿 태그
템플릿 태그는 템플릿 파일내에서 템플릿엔진이 해석할 위치를 표시합니다. 해석할 내용이 변수이든 제어명령이든 관계없이 { } , <!--{ } , { }--> , <!--{ }--> 모두가 유효한 템플릿 태그입니다.
템플릿 파일을 브라우저나 위지윅 에디터로 열었을 때, 바르게 보일 수 있도록 편리한대로 자유롭게 선택하여 사용할 수 있습니다.
3.  템플릿 파일 정의, 템플릿 변수 할당, 출력
메서드 기능
define() 사용할 템플릿 파일의 아이디를 정의
assign() 템플릿 변수에 값을 할당
print_() 출력
명령어 의미 사용법
= 템플릿변수의 값을 출력 {= template_variable }
템플릿태그 내에서 함수를 사용하지 않을 때는 {=title} 대신 {title} 과 같이 출력명령어를 생략할 수 있습니다.
예제 
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$tpl->assign(array(
    'title'  =>'First Template_',
    'content'=>'Fill me in',
));
$tpl->print_('index');
?>
index.tpl
<html>
<head>
<title>{title}</title>
</head>
<body>
{content}
</body>
</html>
>>output
<html>
<head>
<title>First Template_</title>
</head>
<body>
Fill me in
</body>
</html>
템플릿변수의 네이밍 규칙은 자바스크립트와 같고 자바스크립트처럼 한글도 가능합니다. 단 '$' 는 사용할 수 없으며, '_' 로 시작하는 템플릿변수는 별도의 용도를 가집니다.
템플릿파일을 define() 메서드로 정의할 때, $template_dir 속성으로부터의 상대경로를 지정합니다.
Note:
엔진 내부적으로, 템플릿파일(index.tpl)을 수정했을 때만 패키지의 변환기파일(Template_.compiler.php)을 인클루드하고, 변환파일(index.tpl.php)을 갱신합니다.
4.  루프(1)
명령어 의미 사용법
@ 루프의 시작 {@ loop_id}
: 루프가 돌지 않았을 때 출력 (옵션) {:}
/ 루프의 끝 {/}
기본 루프 예제 
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$tpl->assign('title', 'power of 2');
$loop = array();
for ($i=1; $i<=3; $i++) {
    $loop[] = array(             // or
        'exponent'=>$i,          // $loop[$i]['exponent']=$i;
        'power'   =>pow(2, $i),  // $loop[$i]['power']   =pow(2, $i);
    );                           //
}
$tpl->assign('row', $loop);
$tpl->print_('index');
?>
index.tpl
<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.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$loop = array(
    array(
        'name' =>'banana',
        'color'=>'yellow',
    ),
    array(
        'name' =>'apple',
        'color'=>'red',
    ),
);
$tpl->assign('list', $loop);
$tpl->print_('index');
?>
index.tpl
<table>
<!--{@ list}-->
<tr><td>{list.name}</td><td>{list.color}</td></tr>

<!--{/}-->
</table>
>>output
<table>
<tr><td>banana</td><td>yellow</td></tr>
<tr><td>apple</td><td>red</td></tr>

</table>
Note:
부피가 큰 배열을 할당하더라도, PHP의 참조카운트 시스템으로 인해, 별도의 메모리 공간을 만들어서 복사하지 않으므로 성능상의 문제를 일으키지 않습니다.
중첩 루프 예제 
index.php
<?php
...
$tpl = new Template_;
$tpl->define('index', 'index.tpl');
$group = array('sport', 'book', 'fruit');
$loop1 = array();
for ($i=0,$s=count($group); $i<$s; $i++) {
    $loop1[] = array(                 // or
        'name'=>$group[$i],           // $loop1[$i]['name']=$group[$i];
    );
    $loop2 = &$loop1[$i]['item'];     // php notice safe, valid syntax.
    $result = mysql_query('select name, num from '.$group[$i]);
    while ($data=mysql_fetch_array($result)) {
        $loop2[] = array(             // or
            'name'=>$data['name'],    // $loop2[] = $data;
            'num' =>$data['num'],
        );
    }
}
$tpl->assign('group', $loop1);
$tpl->print_('index');
?>
index.tpl
<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>
아래의 배열을 직접 할당해도 출력결과는 같습니다.
Array of nested loop
$loop1 = array(
    array(
        'name' =>'sport',
        'item' => array(
            array(
                'name'=>'pingpong',
                'num' =>5,
            ),
            array(
                'name'=>'running',
                'num' =>16,
            ),
        ),
    ),
    array(
        'name' =>'book',
        //'item' => null
    ),
    array(
        'name' =>'fruit',
        'item' => array(
            array(
                'name'=>'apple',
                'num' =>63,
            ),
        ),
    ),
);
Note:
중첩루프를 설명하기 위한 예제이며, 위와 같은 반복적인 DB 쿼리는 바람직하지 않습니다.
템플릿태그내에 공백은 자유롭게 삽입할 수 있습니다. 상위루프의 변수는 추가적인 할당없이 중첩루프내에서도 사용할 수 있으며 일반템플릿변수는 템플릿 전체에서 유효합니다.
최상위루프의 변수이면 { .name }, 중첩루프의 변수면 { ..name } 과 같이 루프 아이디를 생략하고 루프변수를 짧게 표시할 수 있습니다. 이 때, 점의 개수는 중첩의 깊이를 나타냅니다.
<table>
<!--{@ group }-->
<tr>
    <td> group: {.name}</td>
    <td> item:
    <!--{@ item}-->
        {.name}-{..name}({..num})
    <!--{:}-->
        -- if no item, print this --
    <!--{/}-->
    </td>
</tr>
<!--{/}-->

</table>
5.  하위템플릿 인클루드
명령어 의미 사용법
# 하위템플릿파일 인클루드 {# file_id }
예제 
directory
/
home
htdocs
index.php
_template
layout.tpl
left.tpl
intro
intro.tpl
_compile
...
index.php
<?php
include 'Template_.class.php';
$tpl = new Template_;
$tpl->define(array(
    'body' => 'body.tpl',
    'left' => 'left.tpl',
    'main' => 'intro/intro.tpl',
));
$tpl->assign(array(
    'link'  => 'xtac.net',
    'text1' => 'fine',
    'text2' => 'thanks',
));
$tpl->print_('body');
?>
body.tpl
<table>
<tr><td> {# left} </td><td> {# main} </td></tr>
</table>
left.tpl
{ link }
intro/intro.tpl
<div>{ text1 }..{ text2 }</div>
>>output
<table>
<tr><td> xtac.net </td><td> <div>fine..thanks</div> </td></tr>
</table>
하위 템플릿파일 내에도 이 명령어를 사용할 수 있습니다. 템플릿 변수가 없는 정적텍스트나 PHP 파일을 인클루드하는 방법은 레퍼런스의 define() 메서드를 참고하시기 바랍니다.
또한 한 페이지에 print_() 메서드를 여러 번 사용해서 출력해도 좋습니다.
$tpl->print_('head');
flush();
// logic for body

$tpl->print_('body');
 
2003-03-03 ~