IV. WORKING WITH DESIGNER
18.  주석
 꼬리말형 주석
명령어 의미 사용법
// 변환시 태그내 '//' 이하문자 삭제 { any_template_code // any_string }
템플릿코드가 유효하지 않거나 이스케이프되었을 때는 삭제되지 않습니다.
꼬리말형 주석 예제 
index.tpl
<table>
<!--{@ list // loop starts!! }-->
<tr>
    <td>{start - .index_ // list number }</td>
    <td>{.title}</td>
</tr>
<!--{/// list ends!! }-->
</table>
 블럭형 주석
명령어 의미 사용법
* 변환파일에서 삭제됨 {* any_string *}
블럭형 주석 예제 
index.tpl
<!--{* 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>
{* *} , <!--{* *} , {* *}--> , <!--{* *}--> 모두 유효한 템플릿 주석이며, 주석의 이스케이프방법은 레퍼런스에서 주석명령어를 참고하시기 바랍니다.
또한 템플릿의 첫번째 블럭형 주석은 아래에 설명될 매크로, 필터 등을 정의할 수 있는 영역입니다.
19.  매크로
명령어 의미 사용법
#define 문자열 치환 정의 #define search_string replace_string
템플릿 변환기가 템플릿 코드를 해석하기 전에, 매크로정의에 따라 문자열들을 치환합니다. 매크로는 템플릿 파일의 가장 처음 블럭형 주석에서만 정의할 수 있습니다.
index.tpl
<!--{*
#define  div  span
#define  Greeting  "Hello! Julia"
*}-->

<div>Greeting</div>
>> output
<span>Hello! Julia</span>
찾을 문자열, 바꿀 문자열 모두 따옴표로 감쌀 수 있고, 공백(공백, 탭, 줄바꿈)이 포함될 때는 반드시 따옴표처리합니다.
아래의 두 템플릿파일은 같은 변환파일로 변환됩니다.
index.tpl
<!--{@ page}-->
    <!--{? page.key_ == current }-->
        [ {page.key_} ]
    <!--{:}-->
        <a href='{page.value_}'>[ {page.key_} ]</a>
    <!--{/}-->
<!--{:}-->
    -- no page --
<!--{/}-->
index.tpl
<!--{*
#define  <!--current_page--\>  {@page}{?page.key_==current}
#define  <!--other_page--\>  {:}
#define  <!--no_page--\>  {/}{:}
#define  <!--page_end--\>  {/}
*}-->

<!--current_page-->
    [ {page.key_} ]
<!--other_page-->
    <a href='{page.value_}'>[ {page.key_} ]</a>
<!--no_page-->
    -- no page --
<!--page_end-->
찾을 문자열, 바꿀 문자열 내에 다음의 이스케이프 문자열이 유효합니다.
escape sequences
\\    \t    \n    \"    \'    \> (\g)
\n 은 에디터가 사용하는 줄바꿈문자에 해당하므로 \r 을 고려하지 않아도 됩니다. 위지윅에디터로 작업시 문자열에 "-->" 이 포함되면 안되므로 이 때 "--\>" 또는 "--\g" 로 사용할 수 있습니다.
20.  프리필터
템플릿 변환기는 "템플릿주석삭제 -> 매크로처리 -> 프리필터링 -> 템플릿변환 -> 포스트필터링
-> 변환파일저장" 의 순서로 작동합니다.
 아래와 같은 형식의 함수를 "prefilter.함수이름.php" 의 파일명으로 배포된 플러그인 디렉토리 내에 저장하면 필터함수로 사용할 수 있습니다.
prefilter.arrangeSpace.php
<?php
function arrangeSpace($source, $tpl) {
    ...
    return $source;
}
?>
프리필터함수는 템플릿주석삭제 및 매크로처리된 템플릿소스를 첫번째 인자로 받아, 가공해서 리턴합니다.
 프리필터를 사용하려면  $prefilter 속성에 사용할 필터함수이름을 지정합니다.
$tpl->prefilter = 'arrangeSpace';
여러 가지 필터링이 필요한 경우, 메서드명을 파이프 "|" 로 연결하면 순서대로 처리됩니다.
$tpl->prefilter = 'adjustPath | parseMySyntax | myFilter';
필터 메서드에 추가적인 인자값을 전달하려면 "&" 로 구분해서 지정합니다.
index.php
$tpl->prefilter = "myFilter & value1 & value2 | adjustPath";
prefilter.myFilter.php
<?php
function myFilter($source, $tpl, $arg1, $arg2) {
    ...
    return $source;
}
?>
인자값에 & 또는 | 가 필요하다면  \&, \| 로 이스케이프해서 사용할 수 있습니다.
 첫번째 템플릿주석 내에서 #prefilter 명령어로 추가적인 필터설정을 할 수 있습니다.
<!--{*
#prefilter "parseMySyntax & bbslist | someSpecialFilter"
#define ...
*}-->
$prefilter #prefilter >> result sequence
"f1 | f2" "f3 | f4" "f3 | f4"
"f1 | f2" "| f3 | f4" "f1 | f2 | f3 | f4"
"f1 | f2" "f3 | f4 |" "f3 | f4 | f1 | f2"
"f1 | f2" "" ""
21.  상대경로 자동보정(프리필터)
필터명 의미
adjustPath 템플릿파일내 상대경로를 절대경로로 변환
$tpl->prefilter = "adjustPath & css,js,jpg,jpeg,png,gif,swf";
지정된 확장자를 가진 상대경로를 변환하며, 상대경로는 템플릿파일의 위치를 기준으로 하므로, 템플릿파일을 브라우저나 위지윅에디터로 열었을 때도 이미지, 스타일시트 등이 적용됩니다.
인자를 지정하지 않으면 필터함수내의 기본값을 사용합니다.
예제 
directory
/
project
www (web root)
_global (template directory)
_img
logo.gif
intro
img
back.gif
intro.tpl
intro
index.php
include
compiles (compile directory)
Template_.class.php
/project/www/intro/index.php
<?php
include '/project/include/Template_.class.php';
$tpl= new Template_;
$tpl->template_dir= '/project/www/_global';
$tpl->compile_dir= '/project/include/compiles';
$tpl->prefilter= 'adjustPath';

$tpl->define('index', 'intro/intro.tpl');
$tpl->print_('index');
?>
/project/www/_global/intro/intro.tpl
<img src="../_img/logo.gif">
<div style="background-image:url(img/back.gif)">
    welcome!
    '../_img/test.gif'
    \"../_img/test.gif\"
    \'../_img/test.gif\'

    src=../_img/test.gif     ....not quoted
    "\../_img/test.gif"      ....escaped
</div>
>>output
<img src="/_global/_img/logo.gif">
<div style="background-image:url(/_global/intro/img/back.gif)">
    welcome!
    '/_global/_img/test.gif'
    \"/_global/_img/test.gif\"
    \'/_global/_img/test.gif\'

    src=../_img/test.gif     ....not quoted
    "../_img/test.gif"      ....escaped
</div>
상대경로 문자열이 큰 따옴표, 작은 따옴표, 또는 url() 로 묶여있는 경우에만 변환되며, 상대경로앞에 역슬래쉬 '\' 를 붙여서 이스케이프할 수 있습니다.
adjustPath 필터를 사용하여 이미지 서버를 분리하거나 웹서버의 리다이렉션과 연동하는 용도로 사용할 수 있습니다. 레퍼런스를 참고하시기 바랍니다.
22.  템플릿파일 분할
템플릿 분할 기능을 사용함으로써 여러 개의 템플릿을 한 파일에 작성할 수 있습니다.
다른 페이지에서 사용하는 템플릿들이 관련된 내용이거나, 작성한 템플릿의 일부만 다른 페이지에서 반복 사용하거나, 모두 한 페이지에서 출력되지만 시간차 출력을 하고자 할 때 사용할 수 있습니다.
명령어 의미 사용법
+ 추가적인 변환파일 생성 {+ division_id }
아래의 템플릿파일은 세 개의 변환파일을 만들게 됩니다.
layout.tpl
<!--{+ head}-->
<html>
<body>
<div>Welcome!</div>
<!--{+ body}-->
<table>
<tr><td>menu</td><td>content</td></tr>
</table>
</body>
</html>
> layout.tpl.php
<html>
<body>
<div>Welcome!</div>
<table>
<tr><td>menu</td><td>content</td></tr>
</table>
</body>
</html>
> layout.tpl.head.php
<html>
<body>
<div>Welcome!</div>
> layout.tpl.body.php
<table>
<tr><td>menu</td><td>content</td></tr>
</table>
</body>
</html>
분할기능을 사용할 때도 모든템플릿문법이 유효하고, 템플릿파일 상단에 매크로 또는 필터가 정의되어 있다면 분할된 변환파일에도 똑같이 적용됩니다.
분할된 템플릿파일을 사용하려면 PHP 파일에 다음과 같이 작성합니다.
index.php
...
$tpl->define(array(
    'header'=>'layout.tpl?head',
    'body'  =>'layout.tpl?body'
));
$tpl->print_('header');
flush();
...
...
...
$tpl->print_('body');
파일아이디와 분할아이디는 같아도, 달라도 되며, 기본변환파일인 layout.tpl.php 파일 역시 사용가능합니다.
 
2003-03-03 ~