phpsource/템플릿2006. 10. 13. 13:38
written: Oct 16 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
내장 필터 함수
내장 필터함수는 템플릿 문서를 작성하는데 도움이 될 만한 함수를 후키템플릿 클래스에 포함시켜 제공됩니다. 내장 필터함수를 위한 클래스 파일 class.hTemplateFilter.php가 1.2.0 버전에 추가되었습니다.
* [주의] - 2006.10.26

웹에디터에서 템플릿 문서를 작성할 때 내장 필터함수를 의미하는 "=>"가 제대로 입력되지 않는 문제가 발생하였습니다. 즉, 꺽은괄호(>)를 태그로 인식하여 ">"로 저장되어 필터처리가 원하는대로 되지 않습니다. 따라서 1.2.0의 패치버전(또는 다음버전)에서 꺽은괄호(>) 대신에 둥근괄호와 같은 다른 기호를 사용하려고 합니다. 예를들어 블록변수에서의 내장 필터함수의 구문형식을 현재와 수정안을 비교하여 살펴보면 아래와 같습니다.

현재 : {@변수명;;=>내장필터함수}내용{/}
수정(안) : {@변수명;;=)내장필터함수}내용{/}
내장필터함수 url() 사용법
아래와 같이 템플릿변수에서 내장필터함수 url()을 이용하면 URL 리디렉션을 템플릿변수에서 처리할 수 있도록 해줍니다.
{=>url("./images/my.htm")}
지금까지 URL 리디렉션을 할 수 있는 구성요소는 HTML 스크립트 <IMG> 태그의 "src" 속성과 같이 HTML 규약 상에 정의된 주소부분에 한정하였습니다. 이 외에 URL 리디렉션은 아래와 같이 자바스크립트 태그 <SCRIPT> 에서 속성 "tpl" 값을 "URL"로 설정했을 때만 제한적으로 허용하고 있습니다.
[code html;gutter:false] <script language="javascript" tpl="URL"> <!-- imagePath = "./images/tree"; //--> </script> <script language="javascript"> objTreeMenu_1 = new TreeMenu(imagePath, ......); objTreeMenu_1.showTooltips = true; </script> [/code]
이러한 방법은 URL 리디렉션 기능 구현이 쉽지않아 - 주소를 나타내는 부분과 그렇지 않은 부분을 구별하기가 어려워 - 임시방편적으로 제공된 방법이었습니다. 이제는 내장필터함수 url()을 이용하면 그 위치에 제한을 받지않으면서도(자바스크립트 뿐만 아니라 HTML 스크립트 내 어느곳에서나 사용할 수 있다는 의미) 손쉽게 URL 리디렉션을 할 수 있습니다.
[code html;gutter:false] <script language="javascript"> objTreeMenu_1 = new TreeMenu("{=>url('./images/tree')}", ......); objTreeMenu_1.showTooltips = true; [/code]
물론 다른 URL 리디렉션과 마찬가지로 컴파일옵션 "active_absolute_path"에 따라 생성된 HTML 스크립트 문서에서는 상대경로로 나타날 수도 있고 절대경로로 나타날 수도 있습니다.
아래 예에서와 같이 변수내용에 이미 주소가 저장되어 있는 경우에는 내장필터함수 url() 함수에 주소값을 입력할 필요가 없습니다.
{@_VARIABLE}
{ADDR;;./images/my.gif}
{/}

{ADDR;;=>url()}
1.2.0 버전부터 제공되는 단순변수 구문형식을 이용하면 아래와 같이 나타낼 수 있습니다.
{&ADDR;;=>url()}./images/my.gif{/}

'phpsource > 템플릿' 카테고리의 다른 글

{후키템플릿}8.4.php 명령  (0) 2006.10.16
{후키템플릿}7.2.내용 형식  (0) 2006.10.16
{후키템플릿}7.9.TR 용법  (0) 2006.10.13
{후키템플릿}6.1.특수문자의 표현  (0) 2006.10.09
{후키템플릿}8.8.래핑(wrapping)  (0) 2006.09.29
Posted by 방글24
phpsource/템플릿2006. 10. 13. 12:30
written: Sep 20 2006
TR 용법은 1.2.0 버전부터 사용할 수 있으나 확정된 기능이 아니라 여러분의 의견을 수렴할 목적으로 미리 공개되는 제안서(proposal)입니다. 따라서 향후 업그레이드할 때 아래서 설명한 내용과 다르게 동작할 수 있으니 주의하시기 바랍니다.
TR 용법
TR(Table Record) 용법은 위즈윅 HTML 에디터를 가지고 템플릿 문서를 편집할 때 유용하게 사용될 수 있을 것입니다. 아래와 같이 테이블의 각 행을 반복적으로 처리하는 경우에 블록변수 시작 및 종료태그가 <table> 태그와 <tr> 태그 사이에 위치하게 됩니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> <!-- BEGIN DYNAMIC BLOCK: DSP_BLOCK_ARTICLES --> <tr> <td style='padding-left:5;'> {block_articles} </td> </tr> <!-- END DYNAMIC BLOCK: DSP_BLOCK_ARTICLES --> </table> [/code]
이 문을 위즈윅 HTML 에디터로 보면 블록변수가 보이지 않으며, 따라서 HTML 문서를 수정할 때 매우 조심하여 작업하지 않으면 블록변수 태그가 손실될 우려가 높습니다. 블록변수를 보이게 하기 위하여 주석문 형식 대신에 {@DSP_BLOCK_ARTICLES} ... {/} 형식을 사용하게 되면 위즈윅 HTML 에디터가 소스를 변형하는 경우도 발생하며, 또 HTML 문서 규약에 맞지도 않기때문에 제대로 보이지 않습니다.
만약 블록변수 태그가 위즈윅 HTML 에디터에 나타난다면 HTML 스크립트 편집 작업이 훨씬 수월할 것입니다. 오래전부터 이 문제를 어떻게 개선할 수 없을까 고민하다가 일단 proposal로 그 구문형식을 제안합니다.
위에서 예를 든 블록변수를 새로 제안된 TR 블록변수로 작성한다면 아래와 같을 것입니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> <tr> <td style='padding-left:5;'> {@DSP_BLOCK_ARTICLES;tr=1}{block_articles}{/} </td> </tr> </table> [/code]
위 문자에서와 같이 변수옵션 tr을 1로 지정하게 되면 템플릿 문서를 컴파일할 때 아래와 같이 지정된 tr 옵션에 의해 변수의 위치가 <tr>...</tr> 태그 밖으로 이동되어 컴파일됩니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> {@DSP_BLOCK_ARTICLES} <tr> <td style='padding-left:5;'> {block_articles} </td> </tr> {/} </table> [/code]
이와같이 TR 태그의 위치를 변수 옵션 tr에 의해 조정할 수 있다는 의미에서 'TR 용법'이라고 이름지어 봤습니다.
3겹으로 중첩된 블록변수에서의 TR 용법
TR 용법을 응용하여 좀 더 복잡한 템플릿 문서를 작성하여 보겠습니다. 3겹으로 중첩된 블록변수로 작성된 문서입니다.
[code html;gutter:false] <!-- filename : block.htm --> <TABLE border="1"> <TR> <TD> {@a;tr=1}{sample_a} <TABLE border="1"> <TR> <TD> {@b;tr=1}{sample_b} <TABLE border="1"> <TR> <TD> {@c;tr=1}{sample_c}{/} </TD> </TR> </TABLE> {/} </TD> </TR> </TABLE> {/} </TD> </TR> </TABLE> [/code]
위의 템플릿 문서를 처리하기 위한 PHP 문장은 아래와 같습니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', .....); $tpl->define( array( 'main' => 'block.htm' ) ); for($i=0;$i<3;$i++) { $tpl->assign('sample_a', 'SAMPLE_a'.$i.'', true); $tpl->assign('sample_b', ''); for($j=0;$j<3;$j++) { $tpl->assign('sample_b', 'SAMPLE_b'.$j.'', true); $tpl->assign('sample_c', ''); for($k=0;$k<3;$k++) { $tpl->assign('sample_c', 'SAMPLE_c'.$k.'', true); } $tpl->assign('c', 'c'); } $tpl->assign('b', 'b'); } $tpl->assign('a', 'a'); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 PHP 문장을 실행하면 브라우저에는 아래와 같이 나타날 것입니다.
SAMPLE_a0SAMPLE_a1SAMPLE_a2
SAMPLE_b0SAMPLE_b1SAMPLE_b2
SAMPLE_c0SAMPLE_c1SAMPLE_c2
생성된 HTML 스크립트 소스는 아래와 같습니다.
[code html;gutter:false] <table border="1"> <tr> <td> SAMPLE_a0SAMPLE_a1SAMPLE_a2 <table border="1"> <tr> <td> SAMPLE_b0SAMPLE_b1SAMPLE_b2 <table border="1"> <tr> <td> SAMPLE_c0SAMPLE_c1SAMPLE_c2 </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> [/code]
참고로 템플릿 문서 block.htm을 위즈윅 HTLM 에디터에서 본다면 아래와 같이 나타날 것입니다. 이제는 에디터에서 블록변수의 위치를 확인하면서 작업할 수 있을 것입니다.
{@a;tr=1}{$sample_a}
{@b;tr=1}{$sample_b}
{@c;tr=1}{$sample_c}{/}
{/}
{/}
같은 템플릿 문서를 가지고 PHP 문장만 변형시켜 TR 태그를 반복시켜 보겠습니다. 수정된 PHP 문장은 아래와 같습니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', .....); $tpl->define( array( 'main' => 'block.htm' ) ); for($i=0;$i<2;$i++) { $tpl->assign('sample_a', 'SAMPLE_a'.$i.''); $tpl->assign('b', ''); for($j=0;$j<2;$j++) { $tpl->assign('sample_b', 'SAMPLE_b'.$j.''); $tpl->assign('c', ''); for($k=0;$k<2;$k++) { $tpl->assign('sample_c', 'SAMPLE_c'.$k.''); $tpl->assign('c', 'c', true); } $tpl->assign('b', 'b', true); } $tpl->assign('a', 'a', true); } $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 PHP 문장을 실행하면 브라우저에는 아래와 같이 나타날 것입니다.
SAMPLE_a0
SAMPLE_b0
SAMPLE_c0
SAMPLE_c1
SAMPLE_b1
SAMPLE_c0
SAMPLE_c1
SAMPLE_a1
SAMPLE_b0
SAMPLE_c0
SAMPLE_c1
SAMPLE_b1
SAMPLE_c0
SAMPLE_c1
각 변수에서의 TR 용법
TR 용법은 블록변수뿐만 아니라 단순변수, 조건변수, 파일변수에서도 사용할 수 있습니다.
단순변수일 때 {&변수명;tr=1}변수내용{/}
조건변수일 때 {?변수명;tr=1}경우의수{/}
블록변수일 때 {@변수명;tr=1}블록내용{/}
파일변수일 때 {#변수명;tr=1}파일명{/}
그러나 각 변수마다 TR기능이 동작하는 방식에 약간의 차이가 존재합니다.

Posted by 방글24
phpsource/템플릿2006. 10. 9. 10:45
written: Jan 28 2002
last modified: Nov 09 2006
템플릿 파일에서 특수문자를 표현하는 방법
템플릿 파일에서 특수하게 사용하고 있는 몇몇 특수문자를 특수문자가 아닌 그 문자 자체의 의미로 사용하려면 특수 문자 앞에 역슬래시(\) 문자를 붙여 escape시켜야 합니다. 후키템플릿에서 escape시켜야 하는 특수문자로는 '{', '}', '|'(수직바), ','(콤마), ' '(스페이스)가 있습니다.
0.0.3 버전부터는 특수문자('{', '}', '|')를 템플릿 파일에 삽입하기 위해서는 템플릿 파일 어느 곳이든지 상관없이 앞에다 역슬래시(\)를 붙여주면 됩니다. 이전 버전에서는 그 위치에 많은 제한을 받고 있습니다.
1.0.0 버전부터는 나타낼 수 있는 특수문자로 콤마 및 스페이스 문자가 추가되었습니다.
'{' - 열린 중괄호
'}' - 닫힌 중괄호
'|' - 수직바
',' - 콤마
' ' - 스페이스 문자
스페이스 문자(' ')는 조건변수(스위치문) 안에서만 쓰이는 특수문자이고 나머지는 템플릿 파일 전체에서 쓰이는 특수문자입니다.
특수문자의 용법
특수문자 '{' 와 '}'
특수문자 '{'는 템플릿 파일에서 템플릿 변수를 나타내는데 사용됩니다. 때에 따라서는 특수문자 '{'를 템플릿 변수가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 '{' 앞에 역슬래시(\)를 붙이게 되면 템플릿 변수로 해석하지 않고 일반문자 '{'로 화면에 나타낼 수 있습니다. 예를 들어 템플릿 파일을 아래와 같이 작성하였다고 하지요.
<P>\{TITLE\}은 템플릿 변수를 의미합니다.</P>
이 템플릿 파일을 파싱한 후 출력하면 화면에는 아래와 같이 보일 것입니다.
{TITLE}은 템플릿 변수를 의미합니다.
그러나 만약 '{' 문자를 escape하지 않고 아래와 같이 '{TITLE}'라고 기술한 경우를 생각해 보겠습니다.
<P>{TITLE}은 템플릿 변수를 의미합니다.</P>
이 템플릿 파일을 파싱한 후 출력하면 "{TITLE}"라는 문자 자체가 나타나지 않고 템플릿 변수로 해석하여 assign() 함수로 지정된 값으로 처리되었을 것입니다. assign() 함수로 지정된 값이 없었다면 아래와 같이 빈문자열로 처리될 것입니다.
은 템플릿 변수를 의미합니다.
'{'  문자와는 달리 '}' 문자의 경우는 escape를 시키지 않더라도 별 문제없이 나타낼 수 있습니다. 그러나 0.0.3부터 지원하기 시작한 템플릿 변수에 초기값을 지정할 때 초기값 내에서 '}' 문자를 나타내기 위해서는 반드시 escape 시켜야 합니다.
{ROW;;이곳에 초기값을 설정하면 템플릿 변수 \{ROW\}에 초기값이 할당됨}
초기값을 지정하는 위치가 아닌 곳은 이전과 같이 '}'에 대하여는 escape를 시키지 않아도 되나 전체적인 표기의 통일을 위하고 향후 버전의 호환성을 위해 무조건 escape를 시킬 것을 권합니다.
특수문자 ','
특수문자 ','(콤마)는 템플릿 파일에서 조건변수(스위치문)를 나타내는데 사용됩니다. 때에 따라서는 특수문자 ','를 특수문자가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 ',' 앞에 역슬래시(\)를 붙이게 되면 switch문에서 사용하는 특수문자로 해석하지 않고 일반문자 ','로 화면에 나타낼 수 있습니다.
예를 들어 템플릿 파일을 아래와 같이 작성한 경우를 생각해 보겠습니다.
변수의 초기값에 \,를 사용한 예 : {COMMA;;초기값으로 콤마(\,)를 넣을 수 있음}
이 템플릿 파일을 파싱한 후 템플릿 변수 {COMMA}에 아무값도 할당하지 않으면 아래와 같이 초기값인 '초기값으로 콤마(,)를 넣을 수 있음'이 출력됩니다.
변수의 초기값에 ,를 사용한 예 : 초기값으로 콤마(,)를 넣을 수 있음
특수문자 ','(콤마)는 1.0.0 버전부터 정상적으로 출력할 수 있습니다.
1.2.0 버전부터 지원되는 아래와 같은 형식에서는 콤마(,)를 이스케이프하지 않아도 됩니다.
{?SW;;=|userfunc('arg1','arg2');} 사과 | 배 {/}
특수문자 '|'
특수문자 '|'(수직바)는 템플릿 파일에서 복수 case문을 나타내는데 사용됩니다. 때에 따라서는 특수문자 '|'를 특수문자가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 '|' 앞에 역슬래시(\)를 붙이게 되면 복수 case문으로 해석하지 않고 일반문자 '|'로 화면에 나타낼 수 있습니다.
[0.0.2버전] 특수문자 "{"와는 달리 특수문자 '|'는 템플릿 파일 모든 영역에서 이와 같이 해석되지는 않고 단지 조건변수(스위치문) 안에서만 escape시켜야 합니다. 조건변수(스위치문) 밖에서 '\|'라고 하게 되면 '|'라고 출력되는 것이 아니라 '\|'라는 문자가 그대로 출력됩니다.
[0.0.3버전] 0.0.2 버전과는 달리 특수문자 '|'는 템플릿 파일 모든 영역에서 반드시 escape시켜주십시요. 조건변수(스위치문) 밖에서 '\|'라고 하게 되면 이전 버전과는 달리 '\|'라고 출력되는 것이 아니라 '|'문자만 출력됩니다. 조건변수(스위치문) 안에서만 escape시키고 그 밖에서는 escape시키지 않더라도 별문제 없이 나타낼 수 있으나 특수문자 '{', '}' 와 마찬가지로 전체적인 표기의 통일을 위하여 그리고 향후 버전의 호환성을 위해 무조건 escape를 시킬 것을 권합니다.
예를 들어 템플릿 파일을 아래와 같이 작성한 경우를 생각해 보겠습니다.
복수 case문에서 \|를 사용한 예 : {VAR, \|case-1\| | \|case-2\| | \|case-3\|}
이 템플릿 파일을 파싱한 후 템플릿 변수 {VAR}에 2를 할당한 후 출력하면 화면에는 아래와 같이 보일 것입니다.
복수 case문에서 |를 사용한 예 : |case-2|
스페이스 문자 " "
스페이스 문자는 조건변수(스위치문)의 각 case 값 앞뒤에 스페이스 문자를 붙일 수 있도록 해줍니다.
템플릿 파일에 조건변수 COLOR가 아래와 같이 정의되어 있는 경우의 예를 들어 보겠습니다. 이 때 조건변수 COLOR 값이 1이면 '파란색', 2면 '빨간색', 3이면 '노랑색', 4면 '하늘색', 5이면 '초록색'이 출력됩니다. 이 때 각 case 값 앞뒤에 있는 스페이스 문자는 모두 없어집니다.
{COLOR,
파란색 |
빨간색 |
노랑색 |
하늘색 |
초록색
}
만약 각 case 값 앞뒤에 스페이스 문자를 넣고 싶다면 아래와 같이 역슬래쉬로 스페이스 문자를 escape시킵니다. 그러면 조건변수 COLOR 값이 1이면 ' 파란색 ', 2면 ' 빨간색 ', 3이면 ' 노랑색 ', 4면 ' 하늘색 ', 5이면 ' 초록색 '이 출력됩니다. 각 case 값 앞뒤에 있는 스페이스 문자가 그대로 유지됩니다.
{COLOR,
\ 파란색\ |
\ 빨간색\ |
\ 노랑색\ |
\ 하늘색\ |
\ 초록색\
}

Posted by 방글24
phpsource/템플릿2006. 9. 29. 13:40
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
래핑(wrapping)
이미 작성된 템플릿 문서와 php 문서를 전혀 건드리지 않고 이 문서 앞 뒤로 새로운 템플릿 문서를 추가하거나 기작성된 템플릿 문서를 필터명령으로 수정할 수 있도록 하는 기능입니다.
그림에서 보듯이 내용물이 동일하더라도 포장을 어떻게 하느냐에 따라 결과물을 전혀 다르게 보일 수 있습니다. 이와 같이 랩핑 기능을 이용하면 기작성되어 있는 템플릿 문서와 php 문서를 손대지 않고도 전혀 다른 결과물을 얻을 수 있습니다.
기작성되어 있는 템플릿 문서가 아래와 같을 경우를 살펴보겠습니다.
[code html;gutter:false] <!-- template file : main.htm --> 오른쪽에 우리집이 있다. [/code]
일반적으로 php 문서에서 main.htm 문서를 처리하면 "오른쪽에 우리집이 있다"라는 HTML 스크립트를 생성할 수 있습니다. 이 문서를 래핑 기능과 필터 기능을 이용하면 아래와 같이 수정할 수 있습니다.
[code html;gutter:false] <!-- wrapping file : wrap.main.htm --> {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }{/} [/code]
기작성된 템플릿 문서 main.htm을 래핑하는 래핑 문서 wrap.main.htm을 같은 디렉토리 또는 그 상위 디렉토리에 저장하는 것으로 래핑 기능을 사용할 준비는 다 된 것입니다.
래핑 파일(wrap.main.htm) 내에 파일명이 생략된 파일변수가 존재하면 아래와 같이 wrapped 파일명(main.htm)을 지정한 것 문서와 같은 동작을 합니다.
[code html;gutter:false] {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }main.htm{/} [/code]
php 스크립트에서는 main.htm 대신에 wrap.main.htm을 define 처리합니다. 이 부분까지가 래핑 기능이 하는 역할입니다. 나머지는 이미 소개한 필터 기능에 의하여 "오른쪽에 우리집이 있다" 대신에 "왼쪽에 우리집이 있다"라는 HTML 스크립트를 생성하게 됩니다.
래핑 문서의 파일명은 기작성 템플릿 문서 파일명 앞에 서두문자 "wrap."을 붙이면 됩니다.
앞에서 설명한 바와 같이 래핑 문서를 기작성 템플릿 문서와 동일한 디렉토리에 저장할 수도 있고 그 상위 디렉토리에 저장할 수도 있습니다. 만약 두 곳 모두에 래핑 문서가 존재한다면 기작성 템플릿 문서와 동일한 디렉토리에 있는 래핑 문서에 우선권이 있습니다..
< 특정 템플릿에 종속된 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리와 blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 각각 동일한 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리되며, blogmeme_yellow 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리됩니다.
만약에 동일한 디렉토리 내에 다양한 이름을 가진 템플릿 문서를 모두 처리할 수 있는 래핑 문서를 작성하려면 그 이름을 아래와 같이 wrap._global.html로 지정하면 됩니다..
< 모든 템플릿에서 접근할 수 있는 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리에 있는 템플릿 문서 skin_1.html, skin_2.html, skin_3.html은 모두 동일한 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리되며, blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리됩니다.
위의 4가지 경우의 래핑문서가 모두 존재한다면 그 우선순위는 아래와 같습니다.
① 동일 디렉토리의 wrap.skin.html
② 차상위 디렉토리의 wrap.skin.html
③ 동일 디렉토리의 wrap._global.html
④ 차상위 디렉토리의 wrap._global.html

Posted by 방글24
phpsource/템플릿2006. 9. 29. 13:33
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
필터 함수
필터함수에는 사용자정의 필터함수(user defined filter function)와 내장 필터함수(built-in filter function)로 구분할 수 있습니다. 내장 필터함수는 템플릿 문서를 작성하는데 도움이 될 만한 함수를 후키템플릿 클래스에 포함시켜 제공됩니다. 사용자정의 필터함수는 사용자가 직접 필요한 필터함수를 정의하여 사용할 수 있습니다.
필터함수 정의하기
모든 필터함수는 아래와 같은 형식으로 정의되어야 합니다.
function 필터함수명($contents, $config [, ......]) {
......
return $contents;
}
필터함수는 템플릿 문서 내용이 첫번째 인자 $contents를 통해 전달받는데 각 실행시간에 따라 $contents의 형식과 내용이 다소 다릅니다. 전달받는 $contents의 형식과 내용에 대하여는 각 실행시간별로 살펴보겠습니다.
두번째 인자로 지정된 변수 $config는 템플릿 객체생성할 때 설정된 컴파일옵션과 템플릿명이 아래와 같은 배열 형식으로 설정되어 있습니다.
[config] => (array)
(
[active_absolute_path] => (boolean) false 또는 true
[active_html_compress] => (boolean) false 또는 true
[active_html_header] => (boolean) false 또는 true
[active_html_parse] => (boolean) false 또는 true
[active_tag_lowercase] => (boolean) false 또는 true
[active_url_redirection] => (boolean) false 또는 true
[template_name] => (string) 필터함수가 정의된 템플릿 문서의 템플릿명
)
사용자가 지정하지 않더라도 첫번째와 두번째 인자는 자동으로 필터함수로 넘어옵니다. 만약 $contents와 $confilg 정보 외에 다른 정보를 필터함수로 전달하기 위해서는 아래의 템플릿 문서의 예와 같이 필요한 정보를 필터함수와 함께 기술해주면 됩니다.
{#FILE;; =|user_filter("{_VERSION}", $global_var, "템플릿툴을 통한 홈페이지 제작 방안") }./test.htm{/}
위의 템플릿 문서 예에서 지정한 사용자정의 필터함수 user_filter()에는 사용자에 의해 템플릿변수 {_VERSION}, 전역변수 $global_var, 문자열 "템플릿툴을 통한 홈페이지 제작 방안"이 추가적으로 전달되고 있습니다. 추가된 정보를 필터함수에서 전달받기 위해서는 필터함수를 아래와 같이 정의하여야 합니다.
function user_filter($contents, $config, $version, $gVar, $str) {
......
return $contents;
}
사용자가 필터함수에 추가적으로 기술한 정보들은 필터함수의 세번째 인자부터 차례로 전달됩니다.
각 실행시간별로 필터함수를 정의하는 예를 살펴보기 위하여 우선 아래의 예제와 같은 템플릿 문서에 작성된 파일 변수에 지정된 각각의 필터함수를 정의해 보겠습니다.
{#FILE;;
initialize {%
=|initialize_skin();
%}
premacro {%
=|premacro_skin();
%}
precompile {%
=|precompile_skin();
%}
postcompile {%
=|postcompile_skin();
%}
preassign {%
=|preassign_skin();
%}
postassign {%
=|postassign_skin();
%}
output {%
=|output_skin();
%}
}./test.htm{/}
필터함수 이름은 사용자가 임의로 명명하여도 되지만 php 내장함수를 포함한 현재 페이지에서 사용 중인 사용자 정의 전역함수 이름과 중복하여 명명할 수 없습니다.
initialize 실행시간 필터함수 정의하기
initialize 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있으며, 아래와 같은 형식으로 정의합니다.
function initialize_skin($contents, $config [, ......]) {
......
return $contents;
}
initialize 실행시간 필터함수에 넘어오는 변수 $contents는 아무런 의미없는 빈문자열입니다. 리턴값 역시 별 의미가 없기 때문에 생략해도 됩니다만 향후 버전과의 호환성을 위하여 생략하지 말기 바랍니다.
premacro 실행시간 필터함수 정의하기
premacro 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있고 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function premacro_skin($contents, $config [, ......]) {
......
return $contents;
}
premacro 실행시간 필터함수에 넘어오는 변수 $contents에는 파일변수에서 지정된 파일의 내용이 그대로 담겨있습니다.
템플릿 문서를 컴파일하려면 아래의 몇가지 예와 같이 각 버전별로 상이한 템플릿 변수 형식을 통일시키는 등의 문자열 치환 작업(매크로 작업)이 필요합니다.
① <!--{ 을 { 으로 치환
② }--> 을 } 으로 치환
③ <!-- BEGIN DYNAMIC BLOCK: 블록명 --> 을 {@ 블록명} 으로 치환
④ <!-- END DYNAMIC BLOCK: 블록명 --> 을 {/} 으로 치환
⑤ <!--#include file="파일명"--> 을 {#파일명} 으로 치환
⑥ 기타 등등
이러한 매크로 작업은 템플릿툴이 컴파일하기 전에 자동으로 처리하는데 premacro 실행시간 필터함수는 템플릿툴이 미리 지정된 매크로 작업을 하기 전에 사용자가 먼저 템플릿 문서 내용을 넘겨받아 처리해야 할 필요가 있을 때 작성하는 함수입니다.
precompile 실행시간 필터함수 정의하기
precompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function precompile_skin($contents, $config [, ......]) {
......
return $contents;
}
precompile 실행시간 필터함수에 넘어오는 변수 $contents에는 여러가지 문자열 치환 작업(매크로 작업)을 한 직후의 템플릿 내용이 문자열 형식으로 담겨있습니다.
postcompile 실행시간 필터함수 정의하기
postcompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function postcompile_skin($contents, $config [, ......]) {
......
return $contents;
}
postcompile 실행시간 필터함수에 넘어오는 변수 $contents에는 컴파일된 템플릿 문서 내용이 배열형식으로 들어있습니다. 컴파일된 템플릿 문서 형식은 각 버전별로 상이하며 향후 버전에서도 상황에 따라 수시도 변경될 수 있으니 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다. 이 함수에서 리턴된 값은 바로 캐시에 저장됩니다.
preassign 실행시간 필터함수 정의하기
preassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function preassign_skin($contents, $config [, ......]) {
......
return $contents;
}
preassign 실행시간 필터함수는 아래의 예에서 볼 때 assign() 함수를 수행하는 시작부분에서 템플릿에 존재하는 변수들을 할당(assign)하기 직전에 수행합니다.
[code php;gutter:false] $tpl->assign('test','test'); [/code]
preassign 실행시간 필터함수에 넘어오는 변수 $contents에는 캐시에 저장되었던 템플릿 문서 내용이 담겨있습니다. 따라서 후키템플릿 고유의 배열형식으로 postcompile 실행시간 필터함수에서 설명한 것과 마찬가지로 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다.
postassign 실행시간 필터함수 정의하기
postassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function postassign_skin($contents, $config [, ......]) {
......
return $contents;
}
postassign 실행시간 필터함수는 assign() 함수를 수행하는 마지막부분에서 템플릿을 할당(assign)한 직후에 수행합니다.
postassign 실행시간 필터함수에 넘어오는 변수 $contents에는 템플릿 문서에 포함된 모든 템플릿 변수들이 처리된 문자열 형식의 순수 HTML 스크립트 문서가 담겨있습니다. 주의할 점이 원래 템플릿 파일에 있는 내용 중에서 BODY 태그 내에 있는 내용만 전달되며 BODY 태그 밖에 있는 HEAD 태그 내의 내용 등은 없습니다. BODY 태그 밖에 있는 내용을 처리하기 위해서는 output 실행시간 필터함수를 이용하여야 합니다.
output 실행시간 필터함수 정의하기
output 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function output_skin($contents, $config [, ......]) {
......
return $contents;
}
output 실행시간 필터함수는 php 스크립트의 실행이 종료되기 직전 출력버퍼 내용으로 부터 HTML 스크립트 문서를 생성한 직후에 실행됩니다. 따라서 $contents에는 생성된 HTML 스크립트 문서의 내용이 담겨있으며 이 함수에 의해 리턴된 값이 브라우저로 전송됩니다.
각 템플릿 문서에 허용필터명령을 지정한 경우에 output 실행시간에 처리되는 필터함수는 모든 템플릿 문서에 적용된 허용필터명령의 조건을 모두 만족해야 합니다.

Posted by 방글24
phpsource/템플릿2006. 9. 29. 09:46
written: Jan 28 2002
last modified: Oct 26 2006
템플릿변수에 관련된 용어 정리
후키템플릿에서 지원되는 템플릿변수(template variable)는 변수, 스위치문, 다이나믹 블록, 하위템플릿 인클루드입니다. 그동안 이들 변수를 호칭할 때 단순문, 블록문, 인클루드문 등 통일되지 못한 용어를 사용하여 왔습니다. 이를 정리할 필요가 있어 앞으로는 아래 표에서와 같이 단순변수, 조건변수, 블록변수, 파일변수라는 용어로 통일하여 호칭하고자 합니다.
< 템플릿변수 용어(1.2.0 버전부터) >
변경전 변경후 구문형식 예
변수,템플릿변수,단순문 단순변수 {VAR}
스위치문 조건변수 {VAR, caseA | caseB}
다이나믹 블록,블록문 블록변수 {@VAR}블록내용{/}
하위템플릿 인클루드,인클루드문 파일변수 {#./test.htm}
템플릿변수의 구문 형식
1.2.0 버전부터 템플릿변수의 구문 형식이 아래와 같이 정리되었습니다. 반복문 위치에는 여러가지 변수옵션을 지정할 수 있으며, 초기값 위치에는 필터명령을 지정할 수 있습니다.
< 변수 구문 형식 >
종 류 1.1.1 버전까지의 구문형식 1.2.0 버전부터의 구문형식
단순변수 {변수명::초기값} {변수명;변수옵션;필터명령}
{&변수명;변수옵션;필터명령}변수내용{/} *1
조건변수 {변수명::초기값,경우의수} {변수명;;초기값,경우의수}*2
{?변수명;변수옵션;필터명령,경우의수}*3
{?변수명;변수옵션;필터명령}경우의수{/}
블록변수 {@변수명}블록내용{/변수명} {@변수명;변수옵션;필터명령}블록내용{/}
파일변수 {#파일명} {#변수명;변수옵션;필터명령}파일명{/}
*1 [주의] - 2006.10.26

단순변수의 새로운 구문형식 {&변수명}{/}을 웹에디터에서 사용할 때 문제가 좀 있습니다.

"&" 문자가 HTML 에디터에서 "&nbsp;", "&lt;", "&gt;", "&amp;", "&quot;", "&#039;" 등에서 자주 사용되다보니 발생하는 문제입니다.

따라서 단순변수의 새로운 구문형식인 {&변수명}{/}을 1.2.0 패치버전(또는 다음버전)에서는 더 이상 사용하지 않겠습니다.
*2 [상위호환성 삭제] - 2008.06.06

상위버전에서는 이 형식({변수명;;초기값,경우의수})을 지원하지 않습니다.
*3 [오기수정] - 2008.06.06

{?변수명;변수옵션;필터명령,경우의수}은 허용하지 않는 구문형식입니다.
{VAR1;;100}
{&VAR1;;100}{/}
위의 2가지 단순변수들은 동일한 결과를 나타냅니다. 템플릿 변수 VAR1을 컴파일하면 단순변수 VAR1에는 "100" 값이 저장됩니다.
1.2.0 버전부터는 css 문과의 충돌을 피하기 위하여 반복문과 초기값을 구분하는 구분자를 콜론(:) 대신에 세미콜론(;)을 사용합니다.
{변수명:반복문,경우의수}과 {변수명:반복문}을 제외한 舊구문형식에서 콜론문자(:)를 사용한 구문형식은 1.2.0 버전에서도 계속 사용할 수 있으나 향후에 버전업될 버전과의 호환성을 보증할 수는 없으니 콜론문자(:) 대신에 세미콜론문자(;)를 이용하여 템플릿 문서를 작성하시기 바랍니다.
변수 옵션
변수 옵션은 1.2.0 버전부터 지정할 수 있으며 지정할 수 있는 변수 옵션으로는 repeat, ctype, allow_filter, tr가 있습니다. 자세한 것은 아래표의 각 항목을 참조바랍니다.
< 변수 옵션 >
변수 옵션 기 능 참 조
repeat 반복문 7.1.반복문
ctype 내용 형식 7.2.내용 형식
allow_filter 필터 처리 8.2.필터 명령
tr TR 용법 7.9.TR 용법
{&VAR2;repeat=1-3;="[[["."{_SELF}"."]]]"}변수내용{/}
템플릿변수 VAR2을 컴파일/할당하면 VAR2.1, VAR2.2, VAR2.3에는 모두 "[[[변수내용]]]" 값이 저장됩니다.
{?VAR;1-3;2}A|B|C{/}
{?VAR;repeat=1-3;2}A|B|C{/}
위의 2가지 조건변수들은 동일한 결과를 나타냅니다.
[code html;gutter:false] {@BLOCK;ctype=text&allow_filter=userfunc;=|userfunc()} 블록내용 {/} {#;allow_filter=func_a,func_b,=;=|func_a(); ="{_SELF}"."tail_value"; =|func_b(); }./test.htm{/}[/code]
위와 같은 표현들도 새로운 구문형식에 맞게 작성된 것으로 정상적으로 동작합니다. 그러나 템플릿 문서에서는 가능한 너무 복잡한 표현은 피하라고 권하고 싶습니다.
필터 명령
지정할 수 있는 필터 명령에는 필터 상수, php 명령, 초기화 명령, 사용자 정의 필터 함수, 내장 필터 함수가 있습니다. 자세한 것은 "8.2.필터 명령"을 참조바랍니다.
변수명 생략
모든 템플릿변수(단순문,스위치문,블록문,인클루드문)의 변수명를 생략할 수 있습니다.
변수명을 생략하면 새롭게 추가된 변수명 예약어인 "_AUTO"(예약어 _AUTO는 향후 버전에서 그 이름이 변경될 수 있으므로 사용자가 직접 사용할 수 없음)로 시작되는 변수명이 자동 지정됩니다.
{&}{/} --->> {&_AUTO}{/}
{?}a|b|c{/} --->> {?_AUTO}a|b|c{/}
{@}블록내용{/} --->> {@_AUTO}블록내용{/}
{#}파일명{/} --->> {#_AUTO}파일명{/}
블록변수의 변수명을 생략한 경우에는 블록변수에 대한 assign() 함수를 지정하지 않아도 자동 할당되어 처리됩니다. 자세한 것은 "5.3.블록변수"의 "자동 할당 기능"을 참조바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 21:46
written: Jan 28 2002
last modified: Sep 20 2006
4가지 자료구조
후키템플릿에서 사용하는 템플릿에 관련된 자료구조는 4가지 형태입니다.
  1. 템플릿 문서(파일 또는 NO파일)
  2. 템플릿 구조
  3. 템플릿 변수
  4. HTML 문서
< 자료구조 >
< 템플릿 관련 자료구조 >
자료 구조 저장 위치
템플릿 문서 파일은 서버 디스크, NO파일은 php 문서에서 문자열로 지정
템플릿 구조 서버 메모리
템플릿 변수 서버 메모리
HTML 문서 서버 메모리, 인터넷망, 웹브라우저
템플릿 문서(template document)
템플릿 문서는 일반적인 HTML 문서와 동일합니다. 차이점은 그 안에 템플릿 변수가 들어있다는 것뿐입니다. 템플릿 문서는 대부분 파일 형태로 제공됩니다. 이러한 템플릿 파일은 나모 웹에디터 또는 드림위버와 같은 HTML 제작툴을 이용하면 멋진 문서를 아주 쉽고도 빠르게 작성할 수 있습니다.
1.0.0 버전부터는 템플릿이 파일이 아니라 DB 등에 저장되어 문자열 형태로 제공될 수 있으며 이러한 템플릿 형식을 NO파일이라 합니다.
템플릿 구조(template structure)
define() 함수를 이용하여 템플릿 문서를 메모리상에 올려놓을 수 있습니다. 템플릿 문서 구조와는 자료 구조 형태가 다소 다릅니다. 템플릿 문서에는 HMTL과 템플릿 변수가 뒤썩여있지만 메모리에 올려진 템플릿 구조를 보면 HTML 문서와 템플릿 변수가 질서정연하게 분류되어 저장되어 있습니다. 아울러 파일에 관한 정보(파일명, 파일이 최종 수정된 시간, 내포된 블록에 대한 정보 등)가 잘 정돈되어 있습니다.
< 템플릿 구조의 구성 >
< 템플릿 저장 장소 >
구분 FastTemplate 후키템플릿
사용 함수 define(
 array(
   "템플릿명"=>"템플릿 파일명"
 )
)
parse("템플릿 변수명", "템플릿명")
define("템플릿명", "템플릿파일명")

또는

define("템플릿명", "템플릿문자열")
템플릿 저장위치 parse 함수 실행시 $this->템플릿명에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨. $this->템플릿 구조[템플릿명]에 템플릿 문서로부터 읽어들인 템플릿을 컴파일하여 템플릿환경, HTML문서와 템플릿변수가 분리되어 저장됨.
후키템플릿에서 사용하는 템플릿 구조의 자료구조는 잘 정리되어 있습니다. 템플릿 구조의 자료구조를 살펴보기 위해 아래와 같은 템플릿 예를 들어보겠습니다. define() 함수에 의해 구조분석이 끝나게 되면 생성된 객체의 템플릿 구조에는 아래와 같이 템플릿 내용이 저장됩니다. 아래 내용은 print_r() 함수로 표시한 예입니다.
 Array
(
[table] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => FILE
[filename] => table.htm
[filemtime] => 1011593178
[parent] =>
[child] => Array
(
[0] => row_block
)
)
)

[row_block] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => BLOCK
[parent] => table
[child] => Array
(
)
)
)

[*var_in_tpl] => Array
(
[row_block] =>
)
)
각 템플릿에 대한 일반적인 정보
위 자료구조의 내용을 개략적으로 살펴보면 "table", "row_block"은 템플릿명을 가리킨다. 이중에 "table"은 템플릿 파일인 table.htm로 부터 읽어들인 데이터를 분석한 템플릿 정보를 저장하였음을 나타내고 있고, "row_block"은 table.htm 내에 존재하는 블록변수(다이나믹블록)에 대한 템플릿 정보를 저장하고 있음을 나타내고 있습니다. 이러한 템플릿 환경에 대한 일반적인 정보는 "tpl_info"에 기록되어 있습니다. 블록변수(다이나믹블록)로부터 추출된 템플릿의 이름은 블록명과 동일합니다.
FastTemplate와는 다르게 후키템플릿에서는 블록변수(다이나믹블록)가 별도의 템플릿으로 기록되어 있습니다. 이것은 마치 FastTemplate에서 블록을 별도의 파일로 처리했을 때에 볼 수 있는 현상입니다. 결국 후키템플릿에서는 HTML 블록이 별도의 파일로 처리되나 아니면 블록변수(다이나믹블록)로 처리되나 템플릿 구조에 기록되는 결과는 거의 같습니다.
차이점이 있다면 템플릿을 별도의 파일로 구성하면 템플릿명을 임의로 지정할 수 있으나 블록변수(다이나믹블록)로 구성하면 템플릿명을 지정할 수 없으며 블록명이 곧 템플릿명이 된다는 것입니다.
후키템플릿에서는 define_dynamic 함수가 필요없다고 하였는데 그것은 템플릿 구조의 자료구조에서 보듯이 각 템플릿의 [템플릿명][tpl_info][child]를 보면 알 수 있기 때문입니다. 해당 템플릿에 포함된 블록이 이곳에 모두 기록되지요. 단, 모든 하위 블록이 모두 기록되는 것은 아니고 바로 밑에 있는 하위 블록만 기록됩니다.
각 템플릿은 양방향의 linked-list 자료구조로 설계되어 있기 때문에 만약 템플릿(또는 블록)에 포함된(중첩된) 하위 블록의 리스트를 알고 싶으면 템플릿 구조에서 [템플릿명(또는 블록명)][tpl_info][child]을 보면 그 하위 블록의 리스트를 연속적으로 얻을 수 있습니다.
각 템플릿 내용 분석
이제는 템플릿의 내용이 어떻게 기록되어 있는지 살펴보겠습니다. 템플릿 구조의 자료구조에서 각 템플릿에는 일반적인 정보를 나타내는 "tpl_info" 외에 템플릿의 실제 내용이 저장되는 "body_contents"가 있습니다. "body_contents"에는 바로 템플릿 내용을 템플릿 변수와 순수 HTML 소스로 분리하여 저장하는 곳입니다. 이를 원래 템플릿 내용으로 복원하려면 아래와 같이 하면 됩니다.
원래 템플릿 내용 =
body_contents[0] + {body_contents[1]} +
body_contents[2] + {body_contents[3]} +
body_contents[4] + {body_contents[5]} +
....... + ....... +
body_contents[마지막 첨자]
각 템플릿에 존재하는 템플릿 변수
마지막으로 설명 안된 부분이 "*var_in_tpl"입니다. 이것은 define() 함수를 실행하는 중에 발생한, 즉 템플릿 구조분석을 하는 중에 발생한 템플릿 변수를 기록하는 곳으로 각 템플릿 파일에 선언된 템플릿 변수와 블록변수(다이나믹블록)명에 해당하는 템플릿변수가 이곳에 기록됩니다.
템플릿 table에 포함된 블록변수(다이나믹블록)에 해당하는 템플릿 변수 {row_block}의 초기값(null로 지정되어 있음)을 지정하는 곳이 바로 "*var_in_tpl"입니다. 여기에 기록된 템플릿 변수값들은 임시로 기록되어 있는 값이며 define() 함수가 종료될 때 "*var_in_tpl"의 내용이 템플릿 변수 영역에 일괄 할당됩니다.
템플릿 변수(template variable)
assign() 함수에 의해 각 템플릿 변수에 대한 변수값이 지정됩니다. 변수값으로는 문자열을 직접 할당할 수도 있고, 템플릿(또는 블록)의 내용을 할당할 수도 있습니다. 템플릿(또는 블록)의 내용을 할당할 때는 할당하기 전에 템플릿 내에 있는 또 다른 변수부터 미리 지정된 값으로 대치하게 됩니다.
결국 템플릿 변수에 할당된 값에는 또 다른 변수가 포함될 수 없습니다. 템플릿 변수에 있는 값들은 output() 함수에 의해 바로 브라우저로 전송할 수 있는 상태로 존재하고 있습니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); $tpl->assign( array( 'YEAR' => '2001', 'MONTH' => '12' ) ); $tpl->assign('MAIN', 'cal'); [/code]
예를 들어 템플릿 파일 "calendar.htm"에 "{YEAR}년 {MONTH}월"라는 내용이 들어있을 때, 위와 같이 PHP 코드를 수행한다면 템플릿 변수에는 아래와 같이 총 3개의 변수값이 존재합니다.
템플릿 변수["YEAR"] = "2001"
템플릿 변수["MONTH"] = "12"
템플릿 변수["MAIN"] = "2001년 12월"
구분 FastTemplate 후키템플릿
사용 함수 assign("템플릿 변수명1", "문자열") parse("템플릿 변수명2", "템플릿명") assign("템플릿 변수명1", "문자열") assign("템플릿 변수명2", "템플릿명")
템플릿 저장위치 $this->PARSEVARS[템플릿 변수명]에 assign() 함수로 지정된 문자열과 parse 함수에 의해 템플릿을 해석한 결과값이 저장됨. parse 함수를 수행하게 되면 동시에 $this->템플릿 변수명에도 템플릿을 해석한 결과값이 저장됨 $this->템플릿 변수[템플릿 변수명1]에는 assign() 함수로 지정된 문자열이 저장되며 $this->템플릿 변수[템플릿 변수명2]에는 템플릿의 내용(템플릿 내의 또 다른 변수가 처리된 후)이 저장됨
HTML 문서(페이지 문서)
템플릿 변수에는 항상 순수 HTML 코드만 들어 있으며 여기에는 어떠한 템플릿 변수도 포함되어 있지 않습니다. output 함수(1.2.0 이전 버전에서는 FastPrint() 함수)에 의해 웹브라우저로 보내지게 되는 템플릿 변수 내용이 바로 웹페이지를 구성하는 HTML 문서가 됩니다.
템플릿명 및 변수명을 정할 때 규칙
FastTemplate에서의 규칙
FastTemplate에서는 파싱결과를 템플릿 변수명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 또한 템플릿 파일로 부터 읽어들이는 템플릿도 템플릿명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 이러한 이유로 해서 클래스 내부에서 정의하여 사용되고 있는 멤버변수와 충돌이 일어날 가능성이 있지요.
FastTemplate에서 클래스 내부에서 정의하여 사용하고 있는 멤버변수로는 $FILELIST, $DYNAMIC, $PARSEVARS, $LOADED, $HANDLE, $ROOT, $WIN32, $ERROR, $LAST, $STRICT 등이 있습니다. 이와 같이 내부에서 정의하여 사용하고 있는 멤버변수와 동일하게 템플릿명 또는 템플릿 변수명으로 사용한다면 충돌이 일어나 프로그램이 정상적으로 동작하지 않게 될 것입니다.
템플릿명과 템플릿 변수명를 기반으로 단순변수 형태의 멤버변수를 정의하여 사용하기 때문에 템플릿명과 템플릿 변수명은 반드시 일반 PHP 변수명을 정할 때 지켜야 할 규칙을 따라야 합니다. 즉, 영문자, 숫자 및 밑줄 만을 이용하여야 별 문제가 생기지 않을 것입니다.
후키템플릿에서의 규칙
후키템플릿에서는 템플릿 또는 템플릿 변수를 별도의 멤버로 구분하여 저장하도록 되어 있습니다.
사용 함수 저장 위치
define("템플릿명", "템플릿 파일명") $this->템플릿 구조[템플릿명]에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨
assign("변수명", "문자열") $this->템플릿 변수[변수명]에 "문자열"이 저장됨
assign("변수명", "템플릿명") $this->템플릿 변수[변수명]에 템플릿 내에 있는 또 다른 변수가 모두 처리된 후 그 결과값이 저장됨
위와 같이 후키템플릿에서는 템플릿명과 템플릿 변수명을 서로 다른 배열 변수(템플릿 구조 및 템플릿 변수)에 배열 첨자를 기반으로 기록하기 때문에 충돌가능성을 원천적으로 방지하고 있습니다. 따라서 템플릿명 또는 템플릿 변수명을 지을 때 알파벳, 숫자, 밑줄만으로 구성되어져 있다면 어떤 이름을 사용하더라도 상관없습니다. 사실 FastTemplate와는 다르게 템플릿명과 템플릿 변수명이 배열 첨자로 사용되기 때문에 #, (, ), ? 등과 같은 특수문자를 이름으로 사용할 수도 있겠으나 향후 상위 버전과의 호환성을 염두에 둔다는 의미에서 이를 지원하지 않겠습니다.
따라서 후키템플릿에서는 일반적인 언어에서와 같이 변수명을 영문자, 숫자, 밑줄 및 하이픈으로 제한하며 첫문자는 반드시 영문자이어야 합니다. 영문자는 대소문자를 구별합니다. 이러한 규칙을 지킨다면 어떠한 이름을 사용하여도 관계없습니다. 단 한가지 예외사항으로 "GLOBALS"를 변수명으로 사용하지 말기 바랍니다. 이것조차 지원하려고 하였으나 PHP 전역변수 처리와 관련하여 충돌되는 부분이 있어 어쩔 수 없이 예외로 처리하게 되었습니다.
그리고 클래스 내부에서 이미 "*var_in_tpl"를 템플릿 구조의 배열 첨자로 사용하고 있습니다. 이러한 특수문자들은 향후에도 클래스 내부에서 어떠한 형태로든지 사용될 수 있으므로 템플릿명과 템플릿 변수명을 정할 때는 이러한 특수문자들을 사용하지 말기 바랍니다.
템플릿 변수명을 정할 때 또 하나 주의할 것이 있습니다. 템플릿 내에 블록이 존재하는 경우 이 블록의 이름(블록명)은 클래스 내부에서 임의대로 템플릿명과 템플릿 변수명으로도 사용되므로 블록명에 해당하는 템플릿명과 템플릿 변수명은 사용하지 말기 바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 21:38
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 사용으로 인한 수행속도 저하
HTML 문서 내에 직접 PHP 코드를 삽입하는 방식과 비교하면 템플릿을 이용할 때의 속도가 느려지게 될 것입니다. 아무래도 템플릿을 분석하는 등의 일을 하는데 시간이 걸리겠지요. 이 때의 시간이란 물론 서버상에서 템플릿을 처리하는 시간이 될 것입니다.
그러나 이러한 서버상에서의 처리 시간이 그대로 인터넷 사용자가 느끼는 체감속도와는 상당히 다릅니다. 인터넷에서 문서를 요구(request)받았을 때부터 사용자에게 응답(response)될 때까지 웹문서 데이터가 이동하는 시간을 분석해 보면 서버에서 데이터가 처리되는 시간은 데이터가 인터넷망에 머무는 시간에 비해 수천분의일 정도 밖에 안될 것입니다. 따라서 서버상에서의 처리속도가 수십배 정도 느려졌다고 해도 인터넷 사용 체감속도가 느려졌다고 느끼는 분은 별로 없을 것입니다. 오히려 다른 요소들에 의해 체감속도가 들숙날숙할테니까요.
처리속도 향상을 위한 방안
그렇다고 서버 수행 속도가 마냥 느려서야 곤란하겠지요. 한 두사람 접속한다면 모르지만 수백명, 수천명이 동시에 접속한다면 서버의 수행속도는 매우 중요한 문제가 될 것입니다.
이러한 이유로 여러분도 템플릿툴 사용을 꺼리고 계시겠지요. 그러나 "구더기 무서워 장 못 담그겠습니까?" 일단 장은 담고 봐야죠(장을 담가야만 하는 이유는 앞장 "템플릿 사용에 따른 이점"을 참조바람). 그리고 나서 구더기(수행속도 저하)가 생기지 않도록 조치를 취해야 겠지요.
이러한 방안으로 템플릿툴에 캐시 개념을 도입하게 됩니다. 템플릿 파일이 변경되었을 때만 캐시 데이터를 업데이트 시켜주게 되면 다음부터는 템플릿 파일을 분석하는 일 없이 캐시된 문서를 바로 웹브라우저에 보여줄 수가 있기 때문에 PHP 코드 삽입 방식과 거의 속도 차이를 느낄 수 없을 것입니다. 대부분의 공개된 자료에서는 최종 웹페이지 문서를 캐시에 저장하는 방식을 사용합니다. 그러나 후키템플릿에서는 define() 함수에 의해 처리된 결과로 얻어진 템플릿 정보를 캐싱하는 방식을 지원합니다. 이 방식의 장점은 템플릿 파일 내용이 변경될 때마다 캐시데이터를 자동적으로 업데이트할 수 있다는 것입니다.
캐시 적용 클래스
FastTemplate의 경우 이러한 캐시 개념을 도입한 CachedFastTemplate가 공개되어 있습니다. 궁금하신 분은 www.codelib.co.kr에 가서 검색해 보세요.
후키템플릿는 템플릿 자료구조가 변경되어 CachedFastTemplate을 이용할 수 없습니다. 따라서 후키템플릿에서 캐시를 이용할 수 있도록 후키템플릿와는 별도로 캐시핸들러 클래스(후키캐시핸들러)를 제공합니다.
< 캐시 적용 >
템플릿을 캐시하기 위해 사용되는 후키캐시핸들러는 후키템플릿과는 독립적으로 작성되어 있으며 기본적으로 파일시스템을 이용하지만 데이터베이스와 같은 캐시 저장 매체로 쉽게 변경 및 확장할 수 있습니다. 후키캐시핸들러에 대한 자세한 내용은 메뉴 "캐시핸들러"를 참조바랍니다.
후키 템플릿의 동작
캐시에 저장된 템플릿 정보를 이용하여 HTML 문서를 생성할 때는 템플릿문서를 읽고 컴파일하는 과정을 생략합니다.
< 캐시를 이용할 때의 동작순서 >
캐시 핸들러의 동작
캐시템플릿에서는 아래 그림과 같이 생성자 내에서 open, gc, destroy, read 핸들러가 동작되며, 강제로 update 할 때는 destroy 핸들러가 동작되고 그렇지 않으면 read 핸들러가 동작됩니다.
< 캐시 핸들러 동작 순서 >
write, close 핸들러의 동작
0.0.4 이전 버전에서는 FastPrint() 함수가 처음 실행될 때 write, close 핸들러가 동작됩니다.
1.0.0 버전부터는 register_shutdown_function()로 지정된 콜백함수 내에서 캐시됩니다. zend engine 2.0이 탑재된 PHP 5.0.0 dev 이상 버전에서는 콜백함수 대신에 소멸자를 이용합니다.
1.2.0 버전부터는 PHP4&5 모두 register_shutdown_function()로 지정된 콜백함수 내에서 캐시됩니다.
정적 캐시(Static Cache) 및 동적 캐시(Dynamic Cache)
1.2.0 이전 버전에서는 하나의 홈페이지 문서에 하나의 캐시만 존재하도록 작성되어 있습니다. 즉 하나의 홈페이지 문서를 생성하는데 여러 개의 템플릿 파일이 이용되더라도 하나의 캐시로 통합됩니다. 하나의 문서에 하나의 캐시를 생성하는 것이 관리상 편리할 수도 있겠으나 때에 따라서는 템플릿 파일별로 캐시가 작성되는 것도 유용할 것입니다.
이를 위하여 1.2.0 버전에서는 특정 홈페이지 문서에 고정적으로 따라다니는 정적 캐시(Static Cache)와 홈페이지 문서와 관계없이 템플릿 파일별로 작성되어 홈페이지 문서에서 필요에 따라 동적으로 불러들일 수 있도록 작성된 동적 캐시(Dynamic Cache)로 구분되어 동작합니다.
define() 함수의 세번째 인자인 배열의 첨자 'cache_type'을 지정하지 않거나 상수 _TPL_CACHE_STATIC를 지정하면 정적 캐시(Static Cache)로 저장되며, 상수 _TPL_CACHE_DYNAMIC를 지정하면 동적 캐시(Dynamic Cache)로 저장됩니다.
캐시디렉토리에 저장된 캐시파일명을 보면 이전 버전에서는 아래와 같았습니다.
blog@index.php(site_index).hcache.php
웹루트에서 시작되는 파일명 'blog/index.php'에서 '/' 를 '@'로 치환한 후 '(캐시id).hcache.php'를 붙인 형태입니다. 1.2.0 버전에서는 아래와 같이 캐시파일명 형식이 변경되었습니다.
sn@site_index@blog@index.php.hcache.php
첫번째 문자 's'는 정적캐시(Static Cache)를 의미하며, 정적캐시가 아니고 동적캐시(Dynamic Cache)의 경우에는 첫번째 문자가 'd'로 기록됩니다.
[1.2.0] 두번째 문자 'n'은 active_html_compress가 false인 경우, 즉 캐시에 저장된 HTML 문서가 압축하지 않은 경우(no compress)를 의미하며, 만약 캐시에 저장된 HTML 문서가 압축된 상태, 즉 active_html_compress가 true라면 압축(compress)를 의미하는 'c' 문자가 기록될 것입니다.
[1.3.0] 캐시에 저장된 문서를 압축하느냐 하지않느냐를 결정하는 인자는 active_html_compress이 아니라 active_cache_compress입니다. 따라서 active_cache_compress가 false이면 두번째 문자가 'n'이 되고, true면 'c'가 되도록 수정합니다.
'site_index'은 캐시id를 의미하고, blog@index.php는 파일명 'blog/index.php'을 의미하고 'hcache.php'는 후키캐시 클래스에서 사용하는 첨자입니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 17:59
written: Jan 28 2002
last modified: Sep 20 2006
1.2.0 버전 설치방법
압축파일 구성
공개된 후키템플릿의 압축파일은 아래와 같이 구성되어 있습니다.
+- test.php (게시판 목록보기 예제)
|
+- class -+- cache - class.hCacheFile.php
| |
| +- class - class.hClassMember.php
| |
| +- structure - class.hStack.php
| |
| +- globals - class.hGlobals.php
| |
| +- patterns - class.hSingleton.php
| |
| +- HTML -+- class.hHtmlParser.php
| | +- class.hHtmlUrlParser.php
| | +- class.hHtmlClassify.php
| |
| +- template -+- class.hTemplate.php
| + class.hTemplateStructure.php
| + class.hTemplateFile.php
| + class.hTemplateAssign.php
| + class.hTemplateCompile.php
| + class.hTemplateDebug.php
| + class.hTemplateCache.php (1.2.0에서 추가)
| + class.hTemplateFunction.php (1.2.0에서 추가)
| + class.hTemplateFilter.php (1.2.0에서 추가)
|
+- func -+- func.version_compare.php (1.2.0에서 삭제)
|
+- hCache --- templates (템플릿 캐시 파일 기록 장소)
|
+- templates -+- listform.htm (템플릿 파일)
|
+- images (이미지 파일들)
func.version_compare.php 파일
이 파일은 버전 비교 루틴에 문제가 있어 1.1.0 버전에 추가된 파일입니다.
[code php;gutter:false] if ('4.3.0' <= PHP_VERSION) {...} [/code]
위와 같은 단순문자열 비교로는 정확한 버전을 비교할 수가 없어 아래와 같이 version_compare() 함수를 이용하여 버전 비교 루틴을 수정하였습니다.
[code php;gutter:false] if (version_compare('4.3.0', PHP_VERSION, '<=')) {...} [/code]
그런데 version_compare() 함수가 PHP 4.1.0 버전부터 제공되는 것이라 그 이하 버전에서는 사용할 수 없습니다. 이 문제로 PHP 4.1.0 이전 버전에서도 version_compare() 함수를 사용할 수 있도록 func.version_compare.php 파일에 version_compare() 함수를 정의해 놓았습니다.
PHP 4.1.0 이전 버전에서 후키템플릿을 사용하게 되면 version_compare() 함수가 정의되어 있지 않다는 에러메시지를 보게 될 것입니다. 이러한 경우에는 후키템플릿 파일을 인클루드 하기 전에 아래와 같이 func.version_compare.php 파일을 인클루드하시기 바랍니다.
[code php;gutter:false] include_once("해당디렉토리/func/func.version_compare.php"); include_once("해당디렉토리/class/template/class.hTemplate.php"); $tpl = new hTemplate(...); [/code]
후키템플릿 1.2.0 버전에서는 PHP 4.1.0 이후 버전에서만 동작하므로 func.version_compare.php 파일이 필요없습니다.
캐시 저장 디렉토리 설정
이 구성을 그대로 유지하여 서버에 업로드 하게되면 첨부된 예제 파일 test.php를 전혀 수정없이 실행할 수 있습니다. 단 캐시 저장 디렉토리(하위 디렉토리 포함)는 읽기/쓰기를 할 수 있어야 하기 때문에 퍼미션을 아래와 같이 설정하여 주시기 바랍니다.
리눅스라면
chmod a+rwx 캐시 저장 디렉토리
처럼 하시면 되고 윈도우라면 디렉토리 속성이 읽기전용이 되지 않도록만 설정하면 됩니다.
각 디렉토리 위치를 변경하려면
클래스 파일을 다른 곳으로 옮기고 싶을 때
만약 클래스 파일을 다른 곳으로 옮기고 싶다면 class 디렉토리 및 그 하부 디렉토리의 내용을 통째로 원하는 곳으로 옮긴 후 test.php 예제 소스에 있는 include_once 부분만 아래와 같이 수정하면 되며 후키 템플릿에 포함된 클래스의 내용은 전혀 수정할 필요가 없습니다.
[code php;gutter:false] /** * hwooky Template */ include_once("옮겨진 새로운 디렉토리/class.hTemplate.php"); [/code]
캐시 저장 디렉토리를 다른 곳으로 옮기고 싶을 때
만약 캐시 저장 디렉토리를 다른 곳으로 옮기고 싶다면 test.php 예제 소스에 있는 후키템플릿 객체 생성 부분을 아래와 같이 수정하세요.
[code php;gutter:false] $tpl = new hTemplate("템플릿 파일 저장 디렉토리", array( "update" => isset($_GET["update"]) ? true : false, "id" => "listform", "path" => "새로운 캐시 저장 디렉토리" ) ); [/code]
수정하신 후 옮겨진 캐시 저장 디렉토리의 퍼미션을 다시 설정해야 하는 것 잊지마시기 바랍니다.
템플릿 파일이 위치한 디렉토리를 다른 곳으로 옮기고 싶을 때
만약 템플릿 파일이 위치한 디렉토리를 옮기고 싶다면 test.php 예제 소스에 있는 후키템플릿 객체 생성 부분을 아래와 같이 수정하세요.
[code php;gutter:false] $tpl = &new hTemplate("새로운 템플릿 파일 저장 디렉토리", ......); [/code]
이전 버전을 말끔히 지운 후 새버전으로 다시 설치하십시요. 다시 설치한 후에 캐시 디렉토리에 있는 이전 버전의 캐시를 지우기 바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 16:39
written: Jan 28 2002
last modified: Sep 20 2006
후키템플릿은 2002년 당시 PHP에서 널리 사용되고 있는 FastTemplate를 수정,보완한 것입니다. 우선 블록의 중첩(nested block)을 허용하였으며, 실행속도를 향상시키기 위해 메모리상의 템플릿 자료구조를 재설계하였습니다. 템플릿 문서가 크고 복잡할 수록 실행속도의 개선 효과는 큽니다. 재설계된 템플릿 자료구조는 향후 기능 향상에 상당히 유연하게 대처할 수 있도록 설계된 것입니다.
1.0.0 버전부터는 실행속도보다는 각 클래스의 캡슐화에 중점을 두고 작성하였습니다. 그리고 FastTemplate로 작성된 이전 문서를 지원하기 위하여 hFastTemplate 클래스(class.hFastTemplate.php)를 추가하였습니다.
1.1.1 버전부터는 FastTemplate로 작성된 문서를 후키템플릿에서 사용할 수 있도록 지원하던 클래스 파일 class.hFastTemplate.php를 삭제하였으며 따라서 1.1.1 이후 버전부터는 FastTemplate로 작성된 문서를 공식적으로 지원하지 않습니다.
1.2.0 버전에서는 템플릿을 불편없이 사용할 수 있도록 템플릿 파일 내에서 템플릿변수 별로 php 코드를 사용할 수 있도록 하는 필터기능, php 문서 파일의 include 기능 등을 포함시켰습니다.
여러가지 기능을 제공하기는 하지만 대부분 템플릿 문서를 작성하는데 필요한 기능들이며 php 문서에서의 문법은 매우 단순하여 define, assign, get_assign, output 4개의 함수와 생성자를 통한 환경설정이 전부입니다.
1.2.0 버전부터는 후키템플릿에 php4와 php5에서 모두 동작하는 자체 출력버퍼 기능을 포함하면서 PHP 4.1.0버전부터 후키템플릿을 사용할 수 있습니다.
캐시 저장매체로 파일시스템만 지원됩니다. 0.0.1 버전에서 잠깐 데이터베이스를 지원한 적이 있었으나 0.0.1과 0.0.2를 가지고 실험해 본 결과 데이터베이스가 별로 효율적이지 않다는 생각이 들어 데이터베이스용 후키캐시를 별도로 공개하지 않기로 하였습니다.
후키템플릿 1.2.0 버전은 PHP 4.1.0 버전부터 현재 공개된 PHP 5.1.6 버전까지 정상적으로 동작합니다. 후키템플릿이 PHP 5 버전에서 동작한다고 해서 zend engine 2.0에서 새로이 제공하고 있는 객체 특성들을 이용하지는 않았습니다. 단지 하위 호환성을 위하여 에러만 발생하지 않도록 수정하였을 뿐입니다.
zend engine 2.0의 새로운 객체 특성 가운데 정적 멤버(static member)는 후키템플릿에서 꼭 필요한 특성인데 하위 호환성때문에 적용하지 못한 것이 무척 아쉽습니다. 향후 zend engine 2.0이 탑재된 PHP 5 버전 전용 후키템플릿을 개발한다면 새로운 객체특성을 적용하여 현재 소스를 상당히 개선할 수 있으리라 봅니다.

Posted by 방글24