phpsource/템플릿2006. 9. 20. 13:48
written: Jan 28 2002
last modified: Sep 20 2006
중첩 블록을 이용하기
FastTemplate은 블록들의 깊이를 하나로 제한합니다. 이것은 블록 안에 또 다른 블록(이하 중첩 블록)을 넣을 수 없다는 것을 말합니다. 따라서 중첩 블록이 필요하다면 해결방법은 오직 블록을 별도의 파일로 분리하는 것입니다.
하나의 웹페이지를 블록의 기능 제한때문에 분리 관리한다는 것은 불합리합니다. FastTemplate의 이러한 문제를 해결하기 위하여 중첩 블록을 허용하도록 Roland Roberts에 의해 수정된 rFastTemplate가 이미 공개되어 있습니다. 후키템플릿도 같은 이유로 FastTemplate을 수정하게 되었습니다. 물론 다른 이유도 있었지만......
중첩 블록을 이용하는 방법이라고 특별히 사용방법이 다르지는 않습니다. 위의 가게부 예제를 가지고 살펴보겠습니다. 여기서는 한 페이지 내에 12월 한달만이 아닌 2001년 4/4분기 4달을 전부 나타내도록 해 보지요.
2001년 4/4분기 가게부
2001년 9월 가게부
지출항목 지출금액(원)
자동차유지비 100,000
반찬값 80,000
학원비 350,000
2001년 10월 가게부
지출항목 지출금액(원)
자동차유지비 150,000
반찬값 130,000
학원비 350,000
2001년 11월 가게부
지출항목 지출금액(원)
자동차유지비 160,000
반찬값 140,000
학원비 350,000
2001년 12월 가게부
지출항목 지출금액(원)
자동차유지비 200,000
반찬값 180,000
학원비 350,000
위 문서를 가지고 템플릿을 작성해 보면 아래와 같이 될 것입니다.
{YEAR}년 {BRANCH}분기 가게부
{MONTH}월
지출항목 지출금액(원)
{ITEM} {MONEY}
템플릿 파일 작성
위의 템플릿에 대한 HTML 소스는 대략 다음과 같을 것입니다.
[code html;gutter:false] <!-- NAME: table.htm --> <TABLE align="center" width="280" bgcolor="#ECF5FF" border="1" cellpadding="0" cellspacing="0"> <TR class="td"> <TD bgcolor="#FFFFCC" width="100%" align="center"> {YEAR}년 {BRANCH}분기 가게부 </TD> </TR> <!-- BEGIN DYNAMIC BLOCK: month_row --> <TR class="td"> <TD align="center"> <TABLE border="1" width="100%" cellpadding="0" cellspacing="0"> <TR class="td"> <TD width="100%" colspan="2" align="center"> {MONTH}월 </TD> </TR> <TR bgcolor="#8AB7E3" class="td"> <TD width=50% align="center">지출항목</TD> <TD width=50% align="center">지출금액(원)</TD> </TR> <!-- BEGIN DYNAMIC BLOCK: row --> <TR bgcolor="#8AB7E3" class="td"> <TD align="center">{ITEM}</TD> <TD align="center">{MONEY}</TD> </TR> <!-- END DYNAMIC BLOCK: row --> </TABLE> </TD> </TR> <!-- END DYNAMIC BLOCK: month_row --> </TABLE> [/code]
PHP 코드 작성 book.php
이제는 중첩 블록이 포함된 템플릿을 위한 PHP 문서를 구성하여 보겠습니다.
[code php;gutter:false] <?php /** * file : book.php * * 일반적으로 지출항목 및 지출금액은 데이터베이스로부터 읽어오게 될 것이다. * 아래와 같이 데이터베이스로부터 읽어들인 값이 $item과 $money 배열에 * 순서대로 저장되었다고 가정합니다. * * $item[0] = "자동차유지비"; * $item[1] = "반찬값"; * $item[2] = "학원비"; * * 9월 : * $money[9][0] = 100000; * $money[9][1] = 80000; * $money[9][2] = 350000; * * 10월 : * $money[10][0] = 150000; * $money[10][1] = 130000; * $money[10][2] = 350000; * * 11월 : * $money[11][0] = 160000; * $money[11][1] = 140000; * $money[11][2] = 350000; * * 12월 : * $money[12][0] = 200000; * $money[12][1] = 180000; * $money[12][2] = 350000; */ include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates); $tpl->define( array( 'table' => 'table.htm' ) ); $tpl->assign( array( 'YEAR' => '2001', 'BRANCH' => '4/4' ) ); for ($k=9;$k<13;$k++) { for ($i=0;$i<3;$i++) { $tpl->assign( array( 'ITEM' => $item[$i], 'MONEY' => $money$money[$k][$i] ) ); $tpl->assign('row', 'row', true); } $tpl->assign('MONTH', $k); $tpl->assign('month_row', 'month_row', true); $tpl->assign('row', ''); } $tpl->assign('TABLE', 'table'); $tpl->output('TABLE'); ?> [/code]
rFastTemplate와의 호환성
후키템플릿과 마찬가지로 블록의 중첩을 허용하고 있는 rFastTemplate와의 호환성을 유지하려면 일부 문장을 아래와 같이 수정하세요. 그러면 양쪽 모두에서 정상적으로 동작할 것입니다.
assign('row', 'row', true); --> parse('DUMMY', '.row');
assign('month_row', 'month_row', true); --> parse('DUMMY', '.month_row');
assign('row', ''); --> clear_dynamic('row')
assign('TABLE', 'table'); --> parse('TABLE', 'table');
rFastTemplate에서 parse 함수의 첫 번째 인수에 지정된 이름은 의미없는 이름으로 어떠한 이름을 지정하여도 관계없습니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:47
written: Jan 28 2002
last modified: Sep 20 2006
블록 제어하기
이것은 Q & A 게시판에 "산적"님이 질문했던 내용입니다. 블록 부분을 상황에 따라 보여주기도 하고 감추기도 하기 위한 제어 방법입니다. 예를 들어 만약 "지출항목"과 "지출금액(원)"을 나타내는 제목 부분을 나타낼 때는 아래와 같이 보여주겠지요.
2001년 12월 가게부
지출항목 지출금액(원)
자동차유지비 200,000
반찬값 180,000
학원비 350,000
반면에 이 부분을 감춘다면 아래와 같을 것입니다.
2001년 12월 가게부
자동차유지비 200,000
반찬값 180,000
학원비 350,000
이것을 블록변수(다이나믹블록)로 처리했을 때 php 코드에서 제어하는 방법에 대하여 살펴보지요.
템플릿 파일 작성 main.htm
작성된 템플릿 main.htm을 보면 "지출항목"과 "지출금액(원)"을 나타내는 부분을 블록 IF_BLOCK로 묶어준 것을 볼 수 있습니다.
[code html;gutter:false] <TABLE border="1" width="297"> <TR> <TD colspan="2" width="287" align="center">2002년 6월 가게부</TD> </TR> <!--{@IF_BLOCK}--> <TR> <TD width="91" align="center">지출항목</TD> <TD width="190" align="center">지출금액(원)</TD> </TR> <!--{/}--> <TR> <TD align="center">자동차유지비</TD> <TD align="center">200,000</TD> </TR> <TR> <TD align="center">반찬값</TD> <TD align="center">180,000</TD> </TR> <TR> <TD align="center">학원비</TD> <TD align="center">350,000</TD> </TR> </TABLE> [/code]
PHP 코드 작성 test.php
$a가 true일 때만 블록 IF_BLOCK에 대한 템플릿 변수 IF_BLOCK에 대한 값을 할당합니다. 할당하지 않으면 기본적으로 템플릿 변수 IF_BLOCK에는 빈문자열이 할당되어 있지요.
[code php;gutter:false] <?php include_once('./class.hTemplate.php'); $tpl = new hTemplate('.'); $tpl->define( array( 'test' => 'main.htm' ) ); /** * 블록을 보여주고 싶으면 $a를 true로 설정하고 감추고 싶으면 $a를 false로 설정함 */ $a = false; //$a = true; if ($a) $tpl->assign('IF_BLOCK', 'IF_BLOCK'); else $tpl->assign('IF_BLOCK', ''); $tpl->assign('TEST', 'test'); $tpl->output('TEST'); ?> [/code]
define() 함수에 의해 main.htm을 파싱할 때 템플릿 파일에 포함된 모든 블록은 별도의 템플릿명으로 분리됩니다. 이 템플릿명이 바로 블록명과 동일하지요.
템플릿 test에 저장된 값
템플릿 파일 main.htm은 파싱된 후에는 아래와 같이 분석된 후 define으로 지시된 템플릿 test에 저장됩니다.
[code html;gutter:false] <TABLE border="1" width="297"> <TR> <TD colspan="2" width="287" align="center">2002년 6월 가게부</TD> </TR> {IF_BLOCK} <TR> <TD align="center">자동차유지비</TD> <TD align="center">200,000</TD> </TR> <TR> <TD align="center">반찬값</TD> <TD align="center">180,000</TD> </TR> <TR> <TD align="center">학원비</TD> <TD align="center">350,000</TD> </TR> </TABLE> [/code]
실제적으로 템플릿 test에 저장되는 것은 위와 같은 단순한 문자열은 아니고 좀더 복잡한 배열구조로 되어있지요. 다만 개념상 위와 같다는 것입니다.
저장된 내용을 보면 블록 부분이 없어지고 대신에 새로운 템플릿 변수명 {IF_BLOCK}이 자리를 차지하고 있는 것을 볼 수 있습니다.
템플릿 IF_BLOCK에 저장된 값
템플릿 test에 위와 같은 값이 저장됨과 동시에 블록에 해당하는 템플릿이 작성되지요. 즉, 블록명과 동일한 이름의 템플릿 IF_BLOCK에는 아래와 같은 값이 저장됩니다.
[code html;gutter:false] <TR> <TD width="91" align="center">지출항목</TD> <TD width="190" align="center">지출금액(원)</TD> </TR> [/code]
템플릿 변수 IF_BLOCK의 생성 및 초기화
또한 이와 동시에 블록에 해당하는 템플릿 변수가 생성되며 빈문자열로 초기화 됩니다. 즉,
[code php;gutter:false] $tpl->assign('IF_BLOCK', ''); [/code]
와 같은 초기화 작업이 내부적으로 이루어진다고 보면 됩니다. 따라서 아래의 코드 중에 else 문 이하의 문장은 실제로 없어도 되는 부분입니다.
[code php;gutter:false] if ($a) $tpl->assign('IF_BLOCK', 'IF_BLOCK'); else $tpl->assign('IF_BLOCK', ''); [/code]
결국 템플릿 IF_BLOCK를 이용하여 템플릿 변수 IF_BLOCK의 값을 재할당하지 않으면 템플릿 변수 IF_BLOCK에는 초기값인 빈문자열이 있게 되는 것입니다. 따라서 $a가 false일 때는 블록 IF_BLOCK 부분이 사라지게 되는 것이지요.
 블록의 경우는 블록명과 템플릿명과 템플릿 변수명이 동일하여 혼동되기 쉬우니 주의하시기 바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:45
written: Jan 28 2002
last modified: Sep 20 2006
화면 분활 실험(공유 영역 분리)
앞장 "템플릿 사용에 따른 이점"에서도 잠시 언급하였듯이 웹사이트 전체에 걸쳐 공통적으로 쓰이는 부분(상단메뉴, 하단 저작권 표시, 좌측 메뉴 등)을 별도의 템플릿으로 분리하게 되면 여러 페이지에서 이러한 부분을 공유하여 이용할 수 있습니다. 이와같이 공유하는 구역에 대한 것은 템플릿을 이용하여 공유하게 되면 웹사이트 전체의 코드양을 상당수 줄일 수 있을 것입니다. 이러한 예를 들어보지요.
< 공유영역을 가지고 있는 웹페이지 구성 >
템플릿 파일 작성
위와 같은 페이지를 구성하기 위해 상단부분(top.htm), 하단부분(bottom.htm), 좌측메뉴(left.htm), 본문 부분(center.htm) 및 이 모든 부분을 묶어주는 부분(all.htm)에 해당하는 템플릿을 보면 아래와 같습니다.
레이아웃용 템플릿 파일 all.htm
[code html;gutter:false] <!-- all.htm --> <HTML> <HEAD> <TITLE>{TITLE}</TITLE> </HEAD> <BODY topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> <CENTER> <TABLE width=460 border="0" cellpadding="0" cellspacing="0"> <TR bgcolor=white align="center"> <TD valign=bottom> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=bottom bgcolor=#999999> {TOP} </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top> <TABLE cellpadding=0 cellspacing=0 border="0" width=460> <TR> <TD align=right valign=top width=20% bgcolor=#dddddd> {LEFT} </TD> <TD align="center" valign=top width=80% bgcolor=yellow> {CENTER} </TD> </TR> </TABLE> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top bgcolor=#999999> {BOTTOM} </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> [/code]
화면 상단 부분 템플릿 파일 top.htm
[code html;gutter:false] <!-- top.htm --> <!-- Begin Table top --> <B>핍클래스홈(phpCLASS HOME)</B> <!-- End Table top --> [/code]
화면 하단 부분 템플릿 파일 bottom.htm
[code html;gutter:false] <!-- bottom.htm --> <!-- Begin Table bottom --> Web Master : Wookyung Hwang(hwooky) <!-- End Table bottom --> [/code]
화면 좌측 메뉴 템플릿 파일 left.htm
[code html;gutter:false] <!-- left.htm --> <!-- Begin Table left --> <A href=''>메뉴#1</A> <A href=''>메뉴#2</A> <A href=''>메뉴#3</A> <A href=''>메뉴#4</A> <A href=''>메뉴#5</A> <!-- End Table left --> [/code]
화면 중앙 본문 템플릿 파일 center.htm
[code html;gutter:false] <!-- center.htm --> <!-- Begin Table center --> {CONTENTS} <!-- End Table center --> [/code]
PHP 코드 작성 section.php
5개로 구성된 템플릿을 하나의 페이지로 구성하기 위한 PHP 소스는 아래와 같습니다.
[code php;gutter:false] <? /** * section.php */ include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'all' => 'all.htm', 'top' => 'top.htm', 'left' => 'left.htm', 'center' => 'center.htm', 'bottom' => 'bottom.htm' ) ); $tpl->assign(array( 'TITLE' => '화면 분활 실험', 'CONTENTS' => '서비스 내용', )); $tpl->assign('TOP', 'top'); $tpl->assign('LEFT', 'left'); $tpl->assign('CENTER', 'center'); $tpl->assign('BOTTOM', 'bottom'); $tpl->assign('ALL', 'all'); $tpl->output('ALL'); ?> [/code]
생성된 HTML 문서
PHP 코드(section.php)에 의해 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <HEAD> <TITLE>화면 분활 실험</TITLE> </HEAD> <BODY topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> <CENTER> <TABLE width=460 border="0" cellpadding="0" cellspacing="0"> <TR bgcolor=white align="center"> <TD valign=bottom> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=bottom bgcolor=#999999> <!-- top.html --> <!-- Begin Table top --> <B>핍클래스홈(phpCLASS HOME)</B> <!-- End Table top --> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top> <TABLE cellpadding=0 cellspacing=0 border="0" width=460> <TR> <TD align=left valign=top width=20% bgcolor=#dddddd> <!-- left.html --> <!-- Begin Table left --> <A href=''>핍클래스 커뮤니티?</A> <A href=''>클래스 사용법</A> <A href=''>클래스 객체 함수</A> <A href=''>객체에 관련된 정보</A> <A href=''>객체지향언어로서의 PHP</A> <A href=''>추상클래스</A> <A href=''>참조(레퍼런스)</A> <!-- End Table left --> </TD> <TD align="center" valign=top width=80% bgcolor=yellow> <!-- center.html --> <!-- Begin Table center --> 서비스 내용 <!-- End Table center --> </TD> </TR> </TABLE> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top bgcolor=#999999> <!-- bottom.html --> <!-- Begin Table bottom --> Web Master : Wookyung Hwang(hwooky) <!-- End Table bottom --> </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> [/code]
화면 중앙 본문 내용만 변경하기 위한 PHP 소스
만약 5개의 템플릿 top.htm, bottom.htm, left.htm, center.htm, all.htm 중에서 center.htm 템플릿 대신에 다른 템플릿(예를 들어 center2.htm)을 사용하여 페이지 내용을 바꾸려면 아래와 같이 define() 함수 부분만 변경하면 됩니다.
[code php;gutter:false] $tpl->define( array( 'all' => 'all.htm', 'top' => 'top.htm', 'left' => 'left.htm', 'center' => 'center2.htm', 'bottom' => 'bottom.htm' ) ); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:43
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 파일 작성 main.htm
작성된 템플릿 main.htm에는 {TITLE}라는 변수가 포함되어 있으며 이 변수는 출력하기 전에 실제 값으로 대치됩니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <HEAD><TITLE>{TITLE} </TITLE> </HEAD> <BODY> </BODY> </HTML> <!-- END: main.htm --> [/code]
PHP 코드 작성 test.php
main.htm이라는 템플릿 파일을 이용하여 HTML의 원형을 작성하기 위한 PHP 코드는 아래와 같습니다.
[code php;gutter:false] <?php include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'main' => 'main.htm' ) ); $tpl->assign('TITLE', '후키템플릿 실험'); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
class.hTemplate.php에는 클래스 hTemplate가 정의되어 있습니다. 이 파일을 포함시켜야 5번 행과 같이 $tpl이라는 객체를 생성할 수 있습니다. 객체 생성할 때 지정된 "./templates"에 의해 모든 템플릿들이 이 디렉토리에 있다는 것을 후키템플릿에 알려줍니다. 객체를 생성할 때 템플릿 디렉토리를 지정하지 않으면 현행 디렉토리에서 템플릿을 찾게 됩니다.
5번 행의 define() 함수를 실행하게 되면 템플릿 파일 main.htm의 내용은 템플릿 main에 저장되며 이 후로는 템플릿명 main을 통해 템플릿에 접근할 수 있습니다. 이 예제에서는 12번 행의 assign() 함수의 두 번째 인수에 템플릿 main을 지정하여 이 템플릿을 분석하도록 하고 있습니다.
11번 행의 assign() 함수를 통해 TITLE라는 템플릿 변수에 "후키템플릿 실험"라는 문자열을 할당합니다. 이와 같이 템플릿에 포함된 템플릿 변수에 대하여 미리 그 값을 할당하여야 12행과 같이 템플릿 main에 대하여 assign() 함수를 실행할 때 템플릿 main에 포함된 템플릿 변수를 앞서 할당된 그 변수값으로 대치할 수가 있습니다.
13번 행에 의해 output() 함수에서 지정된 템플릿 변수 MAIN의 내용이 출력됩니다.
12번 행에서와 같이 assign() 함수에서 지정한 MAIN이라는 템플릿 변수에는 이 함수에 의해 템플릿을 해석한 결과값이 마지막으로 저장되기 때문에 뒤에서 필요하다면 다른 템플릿을 해석할 때 또 다른 템플릿 변수로써 활용될 수 있습니다.
생성된 HTML 문서
test.php 코드에 의해 main.htm로 부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <HEAD><TITLE> 후키템플릿 실험 </TITLE> </HEAD> <BODY> </BODY> </HTML> <!-- END: main.htm --> [/code]
생성된 HTML 코드를 보면 템플릿 변수 {TITLE}가 "후키템플릿 실험"라는 문자열로 대치되어 있는 것을 볼 수 있습니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:43
written: Jan 28 2002
last modified: Sep 20 2006
클래스의 구성
후키템플릿 1.2.0 버전에서 사용하는 클래스는 모두 17가지 입니다. 한페이지 분량도 안되는 클래스들은 관계되는 클래스의 파일에 포함시켜도 되지만 캡슐화에 중점을 두고 작성하다보니 파일 구성이 방만(?)해 졌습니다.
템플릿 관련 클래스 구성
No. 패키지 클래스 종류 클래스가 정의된 파일명 적용버전
1 Template hTemplate class.hTemplate.php 1.0.0
2 " hTemplateAssign class.hTemplateAssign.php 1.0.0
3 " hTemplateStructure class.hTemplateStructure.php 1.0.0
4 " hTemplateCompile class.hTemplateCompile.php 1.0.0
5 " hTemplateFile class.hTemplateFile.php 1.1.0
- - hFastTemplate class.hFastTemplate.php 1.1.1 삭제
6 " hTemplateDebug class.hTemplateDebug.php 1.0.0
7 " hTemplateCache class.hTemplateCache.php 1.2.0
8 " hTemplateFunction class.hTemplateFunction.php 1.2.0
9 " hTemplateFilter class.hTemplateFilter.php 1.2.0
10 HTML hHtmlParser class.hHtmlParser.php 1.0.0
11 " hHtmlClassify class.hHtmlClassify.php 1.0.0
- - hHtmlUrlRedirection class.hHtmlUrlRedirection.php 1.1.1 삭제
12 " hHtmlUrlParser class.hHtmlUrlParser.php 1.1.1
13 cache hCacheFile class.hCacheFile.php 1.0.0
14 structure hStack class.hStack.php 1.0.0
15 class hClassMember class.hClassMember.php 1.0.0
16 globals hGlobals class.hGlobals.php 1.1.0
17 patterns hSingleton class.hSingleton.php 1.1.0
클래스의 동작
웹서비스할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php
캐시를 갱신할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php

class.hStack.php
class.hHtmlParser.php
class.hHtmlClassify.php
class.hHtmlUrlParser.php
class.hTemplateCompile.php
템플릿 파일 또는 PHP 소스가 수정되었으면 캐시를 갱신하여야 합니다. 템플릿 파일이 수정되었을 때는 후키템플릿이 자동으로 캐시를 갱신해 줍니다. 그러나 후키템플릿에서 제공하는 클래스 파일과 같은 php 소스가 변경되었을 때는 캐시를 자동으로 갱신해 주지 못하기 때문에 기존의 캐시를 강제적으로 지워주든지 아니면 객체 생성할 때 두 번째 인수인 캐시 정보의 속성 "update"의 값을 true로 설정해 주셔야 합니다
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'update' => true ) ); [/code]
1.2.0 버전부터는 후키템플릿툴에 포함된 17개의 클래스 파일이 수정되었을 때도 자동으로 캐시를 갱신해 줍니다.
템플릿 정보를 디버깅할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php

class.hStack.php
class.hHtmlParser.php
class.hHtmlClassify.php
class.hHtmlUrlParser.php
class.hTemplateCompile.php

class.hTemplateDebug.php
각 클래스의 기능
hTemplate 클래스
후키템플릿을 전체적으로 관리하는 클래스이며, 모든 public 메소드를 가지고 있습니다.
< 후키템플릿에서의 각 클래스의 역할 >
클래스와 클래스를 실선으로 연결된 것은 클래스 내부에서 객체 생성한 후 객체를 이용하여 접근한다는 의미이며 점선으로 연결된 것은 상속관계에 있음을 나타냅니다.
템플릿 형식 및 변수형식
Flow No template type variable type
file or no-file string
template infomation array
template variable string
 hTemplate 클래스는 상황에 따라 아래와 같이 필요한 클래스를 불러다가 처리합니다.
TML 문서가 변경된 후 처음 접속할 때의 동작 수순

  ① -> ② -> ③ -> ④ -> ⑤ -> ⑥ -> ⑦
이와 같이 템플릿 파일이 변경된 후 처음 후키템플릿을 실행하게 되면 모든 클래스를 불러다가 전 과정을 다 밟게 됩니다.
따라서 이 과정에서는 class.hTemplateCompile.php 파일과 HTML 패키지(hHtmlParser, hHtmlClassify, hHtmlUrlParser 클래스)도 필요하게 됩니다.
이 과정은 단 한번만 거치게 되며 그 다음부터는 아래와 같은 동작 수순을 밟게 됩니다.
HTML 문서가 변경된 후 두 번째 이후 접속할 때의 동작 수순

  ④ -> ⑤ -> ⑥ -> ⑦
< 후키템플릿에서의 각 클래스의 역할 >
템플릿 파일이 변경된 후 두 번째 이후 접속할 때는 ④부터 실행되기 때문에 HTML 패키지와 hTemplateCompile 클래스는 필요없으며 hTemplateCache 클래스, hCacheFile 클래스, hTemplateAssign, hTemplateStructure 클래스만 불러다가 실행하게 됩니다.
hTemplateAssign 클래스
템플릿 변수를 관리해주는 클래스로 템플릿 변수의 초기화, 추가, 수정, 삭제 및 출력 등을 담당합니다.
hTemplateStructure 클래스
템플릿 정보 및 템플릿 변수 정보는 모두 hTemplateStructure 클래스 내에 정적 멤버로 정의되어 있는 템플릿 정보 리스트 및 템플릿 변수 리스트에 기록되어 있습니다. 이 클래스는 인스턴스를 생성하지 않고 정적 멤버로만 사용됩니다.
hTemplateCache 클래스
1.2.0 버전부터 제공되는 클래스로 템플릿 캐시 관련 기능을 통합하여 수행합니다. hCacheFile 클래스는 필요에 따라 hTemplateCache 클래스 내에서 호출합니다.
hCacheFile 클래스
파일시스템용 캐시핸들러입니다. 후키 템플릿과는 독립적으로 동작하는 클래스로 캐시가 필요한 곳이면 어느 곳에서나 이용할 수 있도록 작성되어 있습니다.
hTemplateCompile 클래스
템플릿 파일을 템플릿으로 변환시켜주며 이 과정에서 HTML 패키지를 불러다가 URL 자동 변경과 같은 여러 가지 처리를 하게 됩니다.
HTML 패키지
HTML 패키지는 hHtmlParser, hHtmlClassify, hHtmlUrlParser 클래스로 구성되어 있습니다. HTML 패키지 중에 hHtmlParser 클래스는 후키템플릿과는 독립적으로 작성되어 이미 공개된 HTML 파서입니다.
hFastTemplate
기존에 사용하고 있던 FastTemplate 문서(php 소스 및 템플릿 파일)을 수정없이 사용하기 위해 작성된 클래스입니다. 1.1.1 버전부터 삭제되었습니다.
hTemplateDebug
개발 과정에서 현재까지 할당된 템플릿 변수의 상태를 실시간으로 확인할 수 있는 디버깅 기능과 컴파일된 템플릿 파일 정보를 실시간으로 확인할 수 있는 디버깅 기능을 위해 작성된 클래스입니다.
이 클래스 파일을 보면 알겠지만 기능 구현만을 신경쓰다보니 소스 코드가 전혀 정리되어 있지 않습니다. 향후 기능을 보완해 가면서 하나 하나 정리되어야 할 것 같습니다.
hTemplateFile
템플릿 파일 관리 클래스로 파일 변경여부, 기본 디렉토리 관리 등 템플릿 파일 관련 파일시스템을 다루기 위해 작성된 클래스입니다.
hClassMember
PHP에서 제공되지 않는 멤버 특성을 지원하기 위하여 작성된 클래스로 현재는 젠드엔진 1.0에서 소멸자를 흉내내기 위하여 작성되어 있습니다. 따라서 소멸자를 정식으로 지원하고 있는 젠드엔진 2.0에서는 불필요한 클래스입니다.
hStack
HTML 패키지 중에서 hHtmlParser 내에서 사용되는 클래스로 LIFO(Last In First Out) 자료구조인 스택(stack)을 구현하여주는 클래스입니다.
hGlobals
수퍼글로벌변수를 이용하여 절대경로를 상대경로로 수정하는 등과 같이 전역변수에 관계된 기능을 처리하는 클래스입니다.
hSingleton
디자인 패턴 중에서 Singleton 패턴을 처리하기 위해 작성된 클래스입니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:41
written: Jan 28 2002
last modified: Sep 20 2006
FastTemplate을 이용하여 작성된 문서를 후키템플릿 문서로 이전하는 방법에 대하여 살펴보겠습니다.   1.1.1 버전부터는 이 기능을 지원하지 않습니다.
FastTempalte용 템플릿 파일의 호환성
FastTemplate용으로 작성된 템플릿 파일은 수정없이 후키템플릿에서 그대로 사용할 수 있습니다.
단, 이미지나 앵커 태그 등에 나타내는 URL은 템플릿 파일을 기준으로 수정하셔야 합니다. 즉, 나모 웹에디터 등에서 템플릿 파일을 보았을 때 그림 등이 정상적으로 나타나도록 URL을 수정하십시요. 만약 URL을 수정하지 않고 후키템플릿을 사용하려면 아래와 같이 객체 생성할 때 생성자의 세 번째 인수인 HTML 파서 정보 중에서 "active_url_redirection"를 false로 설정하기 바랍니다.
$tpl = new hTemplate(템플릿 파일 기본 디렉토리, 캐시 정보,
  array(
   'active_html_parse' => false or not,
   'active_url_redirection' => false
  )
);
FastTempalte 함수와의 호환성
후키템플릿는 FastTemplate에서 제공하는 함수 중에서 define, assign, get_assigned, FastPrint() 함수만을 제공합니다. 기타 함수를 사용한 FastTemplate를 이용한 문서는 아래에서 설명하는 요령에 따라 수정하면 별 문제없이 후키템플릿에서도 동작하게 됩니다.
원본을 수정하기 전에 반드시 백업받아두시기 바랍니다!!!
만약 수정 후 정상적으로 동작되지 않는다면 원본이 필요하겠지요.
제공 함수 목록
제공 함수 목록
분류 FastTemplate 후키템플릿 기능
템플릿 define define 템플릿 파일 읽기,템플릿 구조 분석
clear_tpl - 템플릿 삭제
clear_define - 파일핸들 삭제
템플릿 변수 assign assign 템플릿 변수에 값 할당
parse assign
get_assigned get_assigned 템플릿 변수값 가져오기
fetch get_assigned
clear assign 템플릿 변수 삭제
clear_parse -
clear_href assign
clear_dynamic assign
출력 FastPrint FastPrint 템플릿 변수값 출력
기타 strict - 미정의 템플릿 변수 보여주기
no_strict - 미정의 템플릿 변수 감추기
define_dynamic - 부모 템플릿 지정하기
clear_all - clear();clear_tpl();
FastTemplate를 이용한 PHP 소스에서 define, assign, get_assigned, FastPrint() 함수 부분은 변경없이 후키템플릿에서 동작합니다.
parse 함수
1. parse -> assign
FastTemplate에서 assign() 함수가 문자열을 다루기 위한 것이라면 parse 함수는 템플릿(또는 다이나믹 블록)을 다루기 위해 작성된 함수입니다. 후키템플릿에서는 assign() 함수를 가지고 문자열 뿐만 아니라 템플릿과 다이나믹 블록까지 처리하도록 작성되었습니다. 따라서 FastTemplate으로 작성된 문서에서 사용된 parse 함수를 assign() 함수로 함수명만 변경하면 후키템플릿에서 정상적으로 동작합니다.
예를 들어 FastTemplate를 이용하여 작성된 문서가 아래와 같다고 하면,
< >
[code php;gutter:false] $tpl->parse('MAIN', 'main'); // 템플릿 main 처리 $tpl->parse('MAIN', array('table', 'main')); // 템플릿 table 및 main 처리 $tpl->parse('MAIN', '.row'); // 다이나믹 블록 row 처리 [/code]
이 문서를 후키템플릿에서 동작시키기 위해서는 아래와 같이 함수명 parse를 assign으로 수정합니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); // 템플릿 main 처리 $tpl->assign('MAIN', array('table', 'main')); // 템플릿 table 및 main 처리 $tpl->assign('row', '.row'); // 다이나믹 블록 row 처리 [/code]
버전 1.0.0부터는 append 방식을 나타내는 ".row" 대신에 아래와 같이 세 번째 인수를 true로 설정합니다.
[code php;gutter:false] $tpl->assign('row', 'row', true); // 다이나믹 블록 row 처리 [/code]
2. 템플릿 변수명 지정
간혹 FastTemplate에서 아래와 같이 FastPrint하기 직전에 parse 함수에서 변수명을 지정하지 않는 경우도 있었을 것입니다.
[code php;gutter:false] $tpl->parse('', 'main'); $tpl->FastPrint(); [/code]
위와 같이 하더라도 FastTemplate에서는 정상적으로 템플릿 "main"에 대한 내용을 출력하여 줍니다. 그러나 parse 함수대신에 assign() 함수를 이용하는 후키템플릿에서는 반드시 변수명을 지정하여야 합니다. 따라서 이 문서를 후키템플릿에서 동작시키기 위해서는 아래와 같이 함수명 parse를 assign으로 수정할 뿐만 아니라 변수명도 지정하여야 합니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint(); [/code]
버전 1.0.0부터는 아래와 같이 FastPrint() 메소드로 출력할 템플릿 변수를 명시적으로 지정하여 주시기 바랍니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint('MAIN'); [/code]
3. 다이나믹 블록에서의 템플릿 변수명 지정
FastTemplate에서는 다이나믹 블록을 parse 함수로 분석하여 템플릿 변수에 할당할 때 그 첫 번째 인수에 지정하는 변수명은 의미없는 값으로 어떠한 값을 지정하여도 관계없습니다.
[code php;gutter:false] $tpl->parse('DUMMY', '.row'); [/code]
그러나 후키템플릿 버전 0.0.2부터는 첫 번째 인수를 반드시 두 번째 인수로 지정되는 블록명과 동일하게 지정하여야 합니다. 버전 1.0.0부터는 append 방식을 나타내는 ".row" 대신에 아래와 같이 세 번째 인수를 true로 설정합니다.
[code php;gutter:false] /** * 후키템플릿 0.0.2 버전부터는 변수명과 블록명이 * 변수명과 블록명이 동일하여야 함 */ $tpl->assign('row', 'row', true); [/code]
fetch 함수
FastTemplate에서의 fetch 함수는 parse 함수의 실행 결과로 얻어진 템플릿 변수값을 반환하기 위해 작성되어 있었습니다. 후키템플릿에서는 parse 함수가 별도로 존재하지 않고 assign() 함수에 흡수되었기 때문에 fetch 함수의 기능도 get_assigned() 함수에 흡수되었습니다.
따라서 FastTemplate으로 작성된 문서에서 사용된 fetch 함수를 get_assigned() 함수로 함수명만 변경하면 후키템플릿에서 정상적으로 동작합니다.
예를 들어 FastTemplate를 이용하여 작성된 문서가 아래와 같다고 하면,
[code php;gutter:false] $tpl->parse('MAIN', array('table', 'main')); $data = $tpl->fetch(); [/code]
이 문서를 후키템플릿에서 동작시키기 위해서는 아래와 같이 함수명 fetch를 get_assigned으로 수정합니다.
[code php;gutter:false] $tpl->assign('MAIN', array('table', 'main')); $data = $tpl->get_assigned(); [/code]
버전 1.0.0부터는 아래와 같이 get_assigned() 메소드로 반환받을 템플릿 변수를 명시적으로 지정하여 주시기 바랍니다.
[code php;gutter:false] $tpl->assign('MAIN', array('table', 'main')); $data = $tpl->get_assigned('MAIN'); [/code]
define_dynamic 함수
define_dynamic(block_name, parent_tpl_name)
이 함수는 FastTemplate에서만 필요하며 후키템플릿 문서에서는 불필요한 함수입니다. 따라서 과감히 삭제하여 주시기 바랍니다.
원래 FastTemplate에서 이 함수의 역할은 블록명과 이 블록을 포함하고 있는 템플릿과의 관계를 지정하는 것이었습니다. 후키템플릿에서는 템플릿을 읽어들인 직후 템플릿을 분석하는 과정에서 자동적으로 이 관계를 추출해 내기 때문에 define_dynamic() 함수를 통해 일부로 이 관계를 알려줄 필요가 전혀 없지요.
clear_define() 함수
clear_define([템플릿명])
FastTemplate에서 clear_define() 함수는 define() 함수에 의해 설정된 템플릿 파일과 파일핸들(템플릿명)과의 관계를 단절시키기 위해 해당 파일핸들을 삭제하기 위해 사용됩니다. 인수를 지정하지 않으면 모든 파일핸들을 삭제하지요.
후키템플릿에서는 특별한 이유가 없으면 별로 사용될 일이 없는 함수로 판단되어 이 함수를 제공하지 않습니다. 좀 더 자세한 내용은 아래 "clear_tpl 함수" 항목을 살펴보시기 바랍니다.
clear_tpl 함수
clear_tpl([템플릿명])
FastTemplate에서는 템플릿 내용을 저장하는 장소와 파일핸들(템플릿명)을 저장하는 장소가 별개로 존재하기 때문에 clear_tpl 함수와 clear_define() 함수가 나누어져 제공되고 있습니다만 후키템플릿에서는 이 장소가 동일장소로 구성되어 있기 때문에 이를 구분할 이유가 없습니다. 만약 clear_tpl() 함수가 작성된다면 clear_tpl() 함수에 의해 템플릿이 삭제될 때 파일핸들도 동시에 삭제되겠지요. 그러나 clear_define() 함수의 예와 마찬가지로 후키템플릿에서는 특별한 이유가 없으면 별로 사용될 일이 없는 함수로 판단되어 이 함수를 제공하지 않습니다.
템플릿 변수 삭제하기
clear([변수명])
clear_parse()
clear_href([변수명])
FastTemplate에서는 assign() 함수에 의해 할당되는 템플릿 변수(이하 ASSIGN 템플릿 변수)와 parse 함수에 의해 할당되는 템플릿 변수(이하 PARSE 템플릿 변수)를 서로 구별하여 관리하고 있습니다. 그러다보니 아래 표와 같이 ASSIGN 템플릿 변수를 삭제하는 함수와 PARSE 템플릿 변수를 삭제하는 함수가 별도로 제공되고 있습니다.
템플릿 변수
삭제 함수
기능 사용예
clear 모든 PARSE 템플릿 변수를 삭제 clear()
지정된 PARSE 템플릿 변수를 삭제 clear(PARSE 템플릿 변수)
clear_parse 모든 ASSIGN 템플릿 변수를 삭제 clear_parse()
clear_href 모든 ASSIGN 템플릿 변수를 삭제 clear_href()
지정된 ASSIGN 템플릿 변수를 삭제 clear_href(ASSIGN 템플릿 변수)
FastTemplate에서 보면 clear_href() 함수와 clear_parse 함수는 동일한 기능을 수행하는 함수입니다. 다른 점을 보면 clear_href() 함수에는 특정 ASSIGN 템플릿 변수를 지정하여 삭제할 수 있지만 clear_parse 함수는 항상 모든 ASSIGN 템플릿 변수를 삭제할 수 있도록 작성되어 있다는 것입니다.
후키템플릿에서는 ASSIGN 템플릿 변수와 PARSE 템플릿 변수를 구별하지 않고 동일하게 다루고 있습니다. 따라서 후키템플릿에서는 하나의 함수만으로 ASSIGN 템플릿 변수와 PARSE 템플릿 변수를 모두 다룰 수 있습니다. 이 함수가 바로 _unsetvar() 함수입니다. 그러나 이 함수도 실제로는 별 필요가 없을 것으로 생각되어 공식적으로 지원하지 않습니다. 즉 내부적으로 감추어진 메소드(private method)입니다.
따라서 clear, clear_parse, clear_href 함수가 필요하다면 hTemplate 클래스에 아래와 같이 해당 메소드를 추가하면 정상적으로 동작됩니다.
[code php;gutter:false] /** * clear template variables * clears out hash created by call to assign() */ function clear($var_name=null) { $this->_unsetvar($var_name); } function clear_parse() { $this->_unsetvar(); } function clear_href($var_name=null) { $this->_unsetvar($var_name); } [/code]
대부분의 경우 템플릿 변수를 지워주는 clear 함수는 _unsetvar 함수를 사용하지 않더라도 assign() 함수를 이용하면 동일한 효과를 얻을 수 있습니다. 한가지 예를 들어보지요.
clear 함수는 아래와 같이 주로 블록 처리할 때 순환문의 처음이나 끝에 위치하게 될 것입니다.
[code php;gutter:false] for ($k=9;$i<13;$k++) { /** * 다이나믹 블록 변수 row를 깨끗이 지워줌 */ $tpl->clear('row'); for ($i=0;$i<3;$i++) { $tpl->assign( array( 'ITEM' => $item[$i], 'MONEY' => $money[$i] ) ); /** * 다이나믹 블록 변수 row에 값을 할당함 */ $tpl->assign('row', '.row'); } $tpl->assign('MONTH', $k); $tpl->assign('month_row', '.month_row'); } [/code]
이것을 후키템플릿에서 동작하도록 하려면 아래와 같이 clear 함수 대신에 assign() 함수를 이용할 수 있습니다. 또한 append 방식 표기방법을 수정합니다.
[code php;gutter:false] for ($k=9;$i<13;$k++) { /** * 다이나믹 블록 변수 row를 깨끗이 지워줌 */ $tpl->assign('row', ''); for ($i=0;$i<3;$i++) { $tpl->assign( array( 'ITEM' => $item[$i], 'MONEY' => $money[$i] ) ); /** * 다이나믹 블록 변수 row에 값을 할당함 */ $tpl->assign('row', 'row', true); } $tpl->assign('MONTH', $k); $tpl->assign('month_row', 'month_row', true); } [/code]
이와같이 assign() 함수를 이용하면 clear, clear_parse, clear_href 함수를 사용할 일이 별로 없을 것입니다.
다이나믹 블록 삭제하기
clear_dynamic(블록명)
FastTemplate에서는 parse 함수에 의해 기록된 다이나믹 블록 해석 결과를 초기화할 목적으로 이 함수가 제공되었으나, 후키템플릿에서는 데이터 구조가 완전히 달라졌으며 이에 따라 블록이 별도의 템플릿으로 기록됩니다. 따라서 clear_dynamic() 함수를 사용한다는 것은 바로 블록에 해당하는 템플릿 변수를 초기화하는 것과 같다고 볼 수 있습니다. 이러한 기능을 담당하는 함수가 바로 clear() 함수입니다.
그런데 위에서 살펴보았듯이 후키템플릿에서는 clear 함수 대신에 assign() 함수를 이용하기 때문에 clear_dynamic 함수 역시 assign() 함수를 이용하면 됩니다. 즉, 동일한 결과를 얻을 수 있는 assign(블록명, "")를 이용하시기 바랍니다.
clear_all 함수
clear_all()
clear_all 함수는 모든 템플릿 정보와 템플릿 변수를 삭제하기 위하여 clear 함수와 clear_tpl 함수를 순차적으로 실행하도록 되어 있습니다.
사실 clear 계열의 삭제함수들은 일반적으로 사용하는 경우는 거의 없기때문에 다른 삭제함수와 함께 clear_all 함수도 후키템플릿에서는 제공하지 않습니다.
FastTemplate의 도큐먼트 설명처럼 PHP 코드가 영구적인 장소에 계속 남아있는 상태에서 사용된다면 수시로 필요없는 템플릿 정보를 삭제할 필요가 있겠지만 대부분의 경우에는 PHP 코드가 일시적으로 메모리에 올라가기 때문에 그럴 경우는 거의 없을 것입니다.
혹시 인스턴스 풀링 기법 등을 이용하여 PHP 코드를 메모리에 계속 올려놓은 상태에서 사용하는 경우가 있다면 아마 clear_tpl() 함수와 clear 함수 정도는 필요할 지 모르겠으나 일단 지원하지 않도록 하겠습니다.
만약 이 함수가 꼭 필요하다면 hTemplate 클래스에 아래와 같이 clear_all 메소드를 추가하시기 바랍니다.
[code php;gutter:false] function clear_all() { $this->_unsetvar(); } [/code]
strict, no_strict 함수
strict()
no_strict()
FastTemplate에서 strict, no_strict 함수는 미정의된 템플릿 변수가 있을 때 에러메시지를 발생시킬 것인지 아니면 무시하고 미정의된 템플릿 변수를 모두 null 처리할 것인지를 결정하는 함수입니다. 기본값으로는 에러메시지를 발생시키도록 되어 있습니다. no_strict 함수를 이용하면 에러메시지없이 그냥 무사통과시킬 수 있지요.
후키템플릿에서는 strict, no_strict 함수를 제공하지 않습니다. 따라서 strict, no_strict 함수는 모두 삭제하시기 바랍니다. 미정의된 템플릿 변수가 있으면 무조건 에러메시지를 보게 되거나(버전 0.0.1) 아니면 빈문자열이 할당(버전 0.0.2 이상)됩니다.
객체 생성 및 생성자
이 부분에서 클래스명을 "FastTemplate" 대신에 "hTemplate"로 변경하기만 하면 나머지는 수정하지 않더라도 후키템플릿에서 정상적으로 동작합니다. 한가지 주의할 것은 후키탬플릿은 캐시를 사용합니다. 따라서 캐시 디렉토리 기본값인 "/tmp/" 디렉토리를 생성시켜주어야 하며 이 디렉토리는 쓰기가 가능하여야 하므로 소유주 및 퍼미션을 적절히 설정하여 주시기 바랍니다.
[code php;gutter:false] $tpl = new hTemplate('./templates'); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:05
written: Jan 28 2002
last modified: Sep 20 2006
여기서는 기존에 FastTemplate을 이용하여 작성된 문서를 거의 수정없이 사용하는 방법에 대하여 살펴보겠습니다.  1.1.1 버전부터는 이 기능을 지원하지 않습니다.
hFastTempalte 클래스
hFastTemplate 클래스는 FastTempalte로 작성된 문서를 수정없이 재사용하기 위해 작성된 것입니다. 이 클래스는 class.hFastTemplate.php 파일 내에 작성되어 있습니다.
hTemplate 클래스 대신에 hFastTemplate 클래스를 이용하면 FastTemplate 문서(php 소스 및 템플릿 파일)를 거의 수정없이 재사용할 수 있습니다.
FastTempalte용 템플릿 파일의 호환성
FastTemplate용으로 작성된 템플릿 파일은 전혀 변경없이 후키템플릿에서 그대로 사용할 수 있습니다.
FastTempalte용 php 소스의 호환성
후키템플릿 hFastTemplate 클래스의 사용방법은 FastTemplate의 사용방법과 동일합니다. 따라서 기존에 FastTemplate를 이용하여 작성된 페이지가 있다면 아래와 같이 클래스 파일명과 클래스명만 변경시켜주면 나머지 부분은 전혀 변경하지 않고도 사용할 수 있습니다.
예를 들어 FastTemplate를 이용하여 작성된 문서가 아래와 같다고 하면,
[code php;gutter:false] include_once('./class/template/class.FastTemplate.php'); $tpl = new FastTemplate('./Templates'); [/code]
이를 아래와 같이 수정합니다.
[code php;gutter:false] include_once('./class/template/class.hFastTemplate.php'); $tpl = new hFastTemplate('./Templates', array( 'update' => $update ? true : false, 'id' => $sign, 'path' => './cache' ) ); [/code]
hFastTemplate 클래스를 이용하면 URL 자동 변경기능을 수행하지 않습니다. 반면 캐시 기능은 "active_cache_handler"를 true로 지정하지 않더라도 동작하도록 되어 있습니다. 만약 캐시 기능까지 동작하기를 원치않으면 아래와 같이 "active_cache_handler"를 false로 설정하기 바랍니다.
[code php;gutter:false] $tpl = new hFastTemplate('./Templates', array( 'active_cache_handler' => false ) ); [/code]
FastTempalte 함수와의 호환성
FastTemplate에서 제공하는 함수 중에서 define, assign, get_assigned, parse, FastPrint, fetch, define_dynamic, clear_dynamic 함수만을 이용하여 작성된 소스라면 hFastTemplate 클래스를 이용하여 거의 100% 수정없이 사용할 수 있을 것입니다.
이 외의 함수로는 clear 계열의 삭제함수 밖에 없습니다만 아마 일반적으로 clear 계열의 함수를 사용하는 경우는 거의 없을 것입니다. 혹시나 해서 FastTemplate에서 제공하는 모든 삭제함수(clear_tpl, clear_all, clear, clear_parse, clear_href, clear_define)에 대하여도 가능한한 호환성을 유지되도록 작성하였습니다. 다른 함수와 달리 삭제함수는 템플릿 자료구조의 영향을 직접적으로 받기 때문에 템플릿 자료구조가 다른 FastTemplate와 호환성을 유지하기는 매우 어렵습니다. 따라서 경우에 따라서는 문제가 발생할 수 있으니 충분히 테스트해 보시기 바랍니다.
원본을 수정하기 전에 반드시 백업받아두시기 바랍니다!!! 만약 수정 후 정상적으로 동작되지 않는다면 원본이 필요하겠지요.
제공 함수 목록
<표1> 제공 함수 목록
분류 FastTemplate hFastTemplate 기능
템플릿 define define 템플릿 파일 읽기,템플릿 구조 분석
clear_tpl clear_tpl*1 템플릿 삭제
clear_define clear_define*1 파일핸들 삭제
템플릿 변수 assign assign 템플릿 변수에 값 할당
parse parse
get_assigned get_assigned 템플릿 변수값 가져오기
fetch fetch
clear clear 템플릿 변수 삭제
clear_parse clear_parse
clear_href clear_href
clear_dynamic clear_dynamic
출력 FastPrint FastPrint 템플릿 변수값 출력
기타 strict - 미정의 템플릿 변수 보여주기
no_strict - 미정의 템플릿 변수 감추기
define_dynamic define_dynamic*1 부모 템플릿 지정하기
clear_all clear_all clear();clear_tpl();
<표1>에 표기된 hFastTemplate의 멤버함수 중에서 *1 표시가 있는 함수들(clear_tpl, clear_define, define_dynamic)은 실행문장이 없는 더미 함수들입니다.
strict, no_strict 함수
strict()
no_strict()
FastTemplate에서 strict, no_strict 함수는 미정의된 템플릿 변수가 있을 때 에러메시지를 발생시킬 것인지 아니면 무시하고 미정의된 템플릿 변수를 모두 null 처리할 것인지를 결정하는 함수입니다. 기본값으로는 에러메시지를 발생시키도록 되어 있습니다. no_strict 함수를 이용하면 에러메시지없이 그냥 무사통과시킬 수 있지요.
hFastTemplate 클래스에서는 strict, no_strict 함수를 제공하지 않습니다. 따라서 strict, no_strict 함수는 모두 삭제하시기 바랍니다. 미정의된 템플릿 변수가 있으면 무조건 에러메시지를 보게 되거나(버전 0.0.1) 아니면 빈문자열이 할당(버전 0.0.2 이상)됩니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 12:56
written: Jan 28 2002
last modified: Sep 20 2006
템플릿을 이용하여 웹페이지를 작성하는 과정을 살펴보겠습니다.
수행 동작 3단계
하나의 템플릿을 가지고 HTML로 변화시키는 과정은 보통 3단계를 거치게 됩니다. 이러한 과정을 모든 템플릿에 대하여 순차적으로 또는 병행하여 수행하므로써 하나의 완성된 페이지가 작성되는 것입니다.
  1. 템플릿 문서 등록하기 : define()
  2. 템플릿 변수 할당하기 : assign()
  3. 템플릿 변수 출력하기 : output()
FastTemplate에서는 assign 단계가 assign과 parse로 나누어 설명됩니다. 그러나 후키템플릿에서는 parse 단계에 있던 대부분의 기능이 define 단계에 흡수되었으며 나머지 부분 즉 템플릿 내에 있는 변수에 값을 할당하는 것은 assign 개념과 같은 개념으로 보기 때문에 이 기능 또한 assign 단계에 흡수되었습니다.
output() 함수는 1.2.0 버전부터 지원되는 함수로 이전 버전의 FastPrint() 함수의 모든 기능을 포함하고 있습니다.
< 수행 동작 3단계 >
템플릿 문서 등록하기
define(템플릿명, 템플릿파일명)
이 부분은 함수 내부 동작에 있어서 FastTemplate와 후키템플릿 사이에 가장 큰 차이를 보이는 부분입니다. FastTemplate에서는 단지 템플릿명을 파일명으로 맵핑하는 것으로 define() 함수의 동작이 종료됩니다. 그러나 후키템플릿에서는 맵핑뿐만 아니라 파일로부터 템플릿 정보를 읽어들인 후 템플릿 구조 분석 및 템플릿 변수 분리 작업을 모두 수행하게 됩니다.
예를 들어 템플릿 정보가 저장된 파일이 "calendar.htm"이고 이를 메모리상에 올렸을 때의 템플릿을 "cal"이라는 이름으로 읽어들이고자 한다면 아래와 같이 코딩합니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); [/code]
버전 1.0.0부터 제안된 no-file용법을 이용하면 템플릿 파일 대신에 템플릿 변수가 포함된 HTML 소스가 저장된 문자열을 직접 지정할 수 있습니다.
템플릿 변수 할당하기
assign(템플릿변수명, 템플릿명)
assign(템플릿변수명, 블록명)
assign(템플릿변수명, 문자열)
템플릿 변수에 그 값을 할당하는 단계로서, 두 번째 인수로 지정되는 것이 무엇이냐에 따라 변수값 처리방법이 달라지게 됩니다.
변수값으로 지정될 수 있는 것은 3가지로 문자열, 템플릿명, 블록명이 올 수 있습니다.
문자열을 할당할 때
문자열을 지정할 때는 그 문자열 값이 그대로 변수값으로 할당됩니다. 이 문자열은 템플릿 변수가 포함되지 않은 HTML스크립트를 포함한 일반 문자열이어야 합니다.
assign(템플릿변수명, 문자열)
만약 템플릿 변수가 포함된 문자열을 처리해야 한다면, assign()이 아니라 define() 메소드를 이용하여 해당 문자열을 먼저 템플릿으로 등록하여야 합니다. 이 용법에 대하여는 "define()" 메뉴의 "no-file 용법" 항목을 참조 바랍니다.
템플릿명을 지정할 때
템플릿명을 지정하게 되면 해당 템플릿을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 첫 번째 인수로 지정된 템플릿 변수명에 할당합니다.
assign(템플릿변수명, 템플릿명)
블록명을 지정할 때
블록명을 지정하게 되면 해당 블록 내용을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 지정된 블록명에 해당하는 변수에 할당합니다.
각 블록에는 지정된 템플릿 변수가 미리 정의되어 있으며 이 변수명은 블록명과 동일합니다. 버전 0.0.1에서는 블록명을 지정할 때는 assign() 함수에 지정된 첫 번째 인수 템플릿 변수명은 사용되지 않는 무의미한 인수로 어떤 변수명을 지정하더라도 상관없으며 그냥 무시해버립니다.
assign(템플릿변수명, 블록명)
버전 0.0.2부터는 아래와 같이 템플릿 변수명을 반드시 블록명과 동일하게 지정하여야 에러메시지를 보지 않게 될 것입니다.
assign(블록명, 블록명)
버전 1.2.0부터는 템플릿 변수명을 블록명과 동일하게 지정하지 않아도 에러메시지를 발생시키지는 않습니다. 두번째 인자로 지정한 해당 블록의 처리 결과를 첫번째 인자로 지정한 변수에 저장합니다. 따라서 첫번째 인자와 두번째 인자로 지정된 이름이 다르게 되면 템플릿 문서 내의 해당 블록 위치에는 아무런 값도 나타나지 않을 것입니다.
앞장에서 살펴본 2001년 12월 달력을 예로 든다면 아래와 같이 템플릿 변수 "YEAR"과 "MONTH"에 해당값을 할당할 수 있을 것입니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); $tpl->assign( array( 'YEAR' => '2001', 'MONTH' => '12', 'MAIN' => 'cal' ) ); [/code]
< >
템플릿 변수 출력하기
output(템플릿변수명)
assign() 함수를 통해 할당된 템플릿 변수값을 output() 함수를 통해 웹브라우저로 출력합니다. 1.2.0 이전 버전에서는 output() 함수 대신에 FastPrint() 함수를 이용하여야 합니다.
[code php;gutter:false] $tpl->output('MAIN'); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 12:21
written: Jan 28 2002
last modified: Sep 20 2006
후키템플릿 1.0.0 버전에서 제안되었던 no-file 용법에 대한 문법적인 내용이 1.2.0 버전부터는 아래와 같이 수정되어 정식으로 제공됩니다. 1.2.0 버전에 포함된 NO파일(no-file) 용법은 1.0.0 버전부터 1.1.1p3 버전까지 제안되었던 용법과는 상당히 다르므로 이 용법을 사용하여 홈페이지 문서를 작성하셨던 분은 주의하시기 바랍니다.
NO파일(no-file) 용법이란
때에 따라서는 define() 메소드의 두 번째 인수인 템플릿 파일 대신에 rFastTemplate의 define_raw()와 같이 템플릿 변수가 포함된 HTML 소스가 저장된 문자열을 지정할 경우도 있을 것입니다. 이와 같이 파일이 아닌 문자열로부터 템플릿 변수가 포함된 HTML 소스를 직접 전달받는 기능을 NO파일(no-file) 용법이라 합니다.
이하 '템플릿 변수가 포함된 HTML 소스'를 '템플릿 문자열(template string)'이라고 칭하겠습니다.
define(템플릿명, 템플릿 문자열, 환경설정);
NO파일 용법에서는 위와같이 두번째 인수로 지정되는 템플릿 문서가 파일이 아닌 문자열로 지정됩니다.
1.0.0 버전에서 제안되었던 아래와 같은 형식은 더 이상 정상적으로 동작하지 않습니다.
define('상수:템플릿명', '템플릿 문자열');
define("$modified:템플릿명", '템플릿 문자열');
캐시 and 컴파일
NO파일 용법의 가장 큰 문제는 전달된 문자열의 내용이 변경되었는지 확인하기가 어렵다는 것입니다. 물론 문자열 전체를 검색하여 수정되었는지를 확인할 수도 있겠으나 이를 위해 문자열 전체를 캐시하기는 다소 어려움이 있습니다. 이와같이 NO파일 용법에서 문자열의 변경 여부를 확인하는 방법이 여의치 않아 1.0.0 버전에서는 지정된 캐시 갱신 여부를 사용자가 직접 지정하도록 하였으나 1.2.0 버전에서는 문자열이 변경되었을 때만 컴파일하도록 개선하였습니다.
NO파일 용법에서도 템플릿 파일의 경우와 마찬가지로 '템플릿 문자열'을 파싱한 내용이 캐시됩니다.
NO파일 용법에서 '템플릿 문자열'의 변경 여부를 확인하는데 문자열 전체를 비교하지는 않습니다. crc32 함수에 의한 checksum 기술에 의해 서로 비교합니다. 캐시에 기록된 checksum 값과 define 함수로 전달된 '템플릿 문자열'의 checksum 값을 비교하여 문자열의 변경여부를 판단합니다. 문자열이 변경되었다고 판단되면 변경된 문자열을 컴파일한 결과와 새로운 checksum 값이 캐시에 기록됩니다.
NO 캐시
만약 '템플릿 문자열'이 매번 변경되는 경우라면 '템플릿 문자열'에 대한 정보를 캐시할 필요가 없을 것입니다. 물론 캐시해도 문제가 발생하지는 않지만 매번 현페이지에 대한 캐시가 갱신되어야 하므로 약간의 시간을 손해보게 되겠지요. 그러므로 이 경우라면 아에 캐시를 하지 않도록 하는 것이 좋을 것입니다. 그러면 '템플릿 문자열'이 변경되더라도 현페이지에 대한 캐시를 갱신하지 않을 것입니다.
캐시하지 않기 위해서는 아래와 같이 define() 함수의 세번째 인자를 이용합니다.
define(템플릿명, 템플릿 문자열,
    array('cache_type' => HW_TPL_CACHE_NO)
);
define() 함수의 세번째 인자는 1.2.0 버전에서 새로 추가된 것으로 NO파일 용법뿐 아니라 기존의 file 용법에서도 사용할 수 있습니다.
이와 같이 'cache_type'에 상수 HW_TPL_CACHE_NO를 지정하면 '템플릿 문자열'의 컴파일 결과가 캐시되지 않으며 홈페이지 문서를 로딩할 때마다 매번 컴파일하게 됩니다.
기능적으로는 NO 캐시 용법을 제공합니다만 NO 캐시 용법은 다소 실행시간에 부담되는 용법이므로 가능하면 사용하지 않는 것이 좋습니다.
정적캐시(Static Cache) & 동적캐시(Dynamic Cache) ?
이전 버전에서는 하나의 홈페이지 문서에 하나의 캐시만 존재하도록 작성되어 있습니다. 하나의 문서를 생성하는데 여러 개의 템플릿 파일이 이용되더라도 하나의 캐시로 통합됩니다. 하나의 문서에 하나의 캐시를 생성하는 것이 관리상 편리할 수도 있겠으나 때에 따라서는 템플릿 파일별로 캐시가 작성되는 것도 유용할 것입니다.
이를 위하여 1.2.0 버전에서는 특정 홈페이지 문서에 고정적으로 따라다니는 정적캐시(Static Cache)와 홈페이지 문서와 관계없이 템플릿 파일별로 작성되어 홈페이지 문서에서 필요에 따라 동적으로 불러들일 수 있도록 작성된 동적캐시(Dynamic Cache)로 구분되어 동작합니다.
define() 함수의 세번째 인자인 배열의 첨자 'cache_type'을 지정하지 않거나 상수 HW_TPL_CACHE_STATIC를 지정하면 정적캐시(Static Cache)로 저장되며, 상수 HW_TPL_CACHE_DYNAMIC를 지정하면 동적캐시(Dynamic Cache)로 저장됩니다.
캐시디렉토리에 저장된 캐시파일명을 보면 이전 버전에서는 아래와 같았습니다. 웹루트에서 시작되는 파일명 'blog/index.php'에서 '/' 를 '@'로 치환한 후 '(캐시id).hcache.php'를 붙인 형태입니다.
blog@index.php(site_index).hcache.php
1.2.0 버전에서는아래와 같이 캐시파일명 형식이 변경되었습니다.
sn@site_index@blog@index.php.hcache.php
첫번째 문자 's'는 정적캐시(Static Cache)를 의미하고, 두번째 문자 'n'는 압축안함(no compressed cache)를 의미하고, 'site_index'은 캐시id를 의미하고, blog@index.php는 파일명 'blog/index.php'을 의미하고 'hcache.php'는 후키캐시 클래스에서 사용하는 첨자입니다.
동적캐시(Dynamic Cache)의 경우에는 첫문자가 'd'로 기록됩니다.
URL 리디렉션(URL redirection)
$tpl->define(템플릿명, 템플릿 문자열);
위와같은 문장에서 '템플릿 문자열'에 포함된 상대경로는 생성자에서 지정한 템플릿 기본 디렉토리을 기준으로 자동 변경됩니다. 기본 디렉토리가 여러 개 있을 때는 처음 지정된 디렉토리를 기준으로 변경됩니다.
1.1.1 버전부터는 아래와 같이 define 함수에서 기본 디렉토리를 직접 지정할 수 있었습니다. 예를 들어, './templates/abc'를 기본 디렉토리로 지정하려면 아래와 같이 작성할 수 있습니다.
$tpl->define(':템플릿명:./templates/abc', '템플릿 문자열');
$tpl->define(':템플릿명:./templates/abc', '템플릿 문자열');
즉, 템플릿명 뒤에 콜론(:)을 찍고 그 뒤에 기본 디렉토리를 지정하면 됩니다.
1.2.0 버전에서도 define() 함수에서 기본 디렉토리를 지정할 수 있으나 1.1.1 버전과는 다른 형식을 가지고 있습니다.
define(템플릿명, 템플릿 문자열,
    array('template_dir' => './templates/abc')
);
즉, cache_type을 지정할 때와 같이 define() 함수의 세번째 인자를 이용하며 배열인자의 첨자는 'template_dir'입니다. 존재하지 않는 디렉토리이거나 디렉토리 내에 있는 파일명까지 지정하면 에러가 발생합니다.
예제(example)
아래와 같이 작성된 소스를 살펴보지요.
[code php;gutter:false] $nofile_test1 = '{TEST}NO캐시'; $nofile_test2 = '{TEST}정적캐시'; $nofile_test3 = '{TEST}동적캐시'; $nofile_test1_config = array( 'cache_type' => HW_TPL_CACHE_NO ); $nofile_test2_config = array( 'cache_type' => HW_TPL_CACHE_STATIC, 'template_dir' => './templates/abc' ); $nofile_test3_config = array( 'cache_type' => HW_TPL_CACHE_DYNAMIC, 'template_dir' => './templates/abc' ); $tpl->define('nofile_test1', $nofile_test1, $nofile_test1_config); $tpl->define('nofile_test2', $nofile_test2, $nofile_test2_config); $tpl->define('nofile_test3', $nofile_test3, $nofile_test3_config); $tpl->assign('TEST', 'Static / Dynamic / No Cache ? => ' . ''); $tpl->assign('NF_test1', 'nofile_test1'); $tpl->assign('NF_test2', 'nofile_test2'); $tpl->assign('NF_test3', 'nofile_test3'); $tpl->output('NF_test1'); $tpl->output('NF_test2'); $tpl->output('NF_test3'); [/code]
위 소스를 실행하게 되면 아래와 같은 결과를 얻게 됩니다.
Static / Dynamic / No Cache ? => NO캐시
Static / Dynamic / No Cache ? => 정적캐시
Static / Dynamic / No Cache ? => 동적캐시
템플릿 문자열 $nofile_test1는 캐시되지 않으며, 템플릿 문자열 $nofile_test2는 정적캐시에 포함되어 저장될 것이며, 템플릿 문자열 $nofile_test3는 현재 실행 스크립트가 '/blog/index.php'라면 아래와 같이 동적캐시가 작성될 것입니다.
dn@nofile_test3@blog@templates@abc.hcache.php

Posted by 방글24
phpsource/템플릿2006. 9. 20. 11:57
written: Jan 28 2002
last modified: Sep 20 2006
사용방법을 알기 전에 우선 후키템플릿에서 사용하는 용어에 대하여 정리해 보겠습니다. 물론 이 용어들은 그 용도에 따라 여러가지로 정의될 수 있을 것입니다. 따라서 여기에서 정의한 용어들은 템플릿툴인 후키템플릿을 이용할 때를 기준으로 설명된 것임을 염두에 두기 바랍니다.
템플릿(template)
일반적인 의미에서 템플릿이란 무엇인가를 만들 때 안내역할을 하는데 사용되는 형식(꼴), 틀 또는 모형 등을 의미합니다. 예를 들어 표준화된 두문이나 미문이 들어있는 문서도 일종의 템플릿인데, 이를 복사한 뒤 변동이 있는 부분만을 채워서 문서를 완성할 수 있습니다. 또한 플로우차트에 사용되는 각종 부호를 잘 그릴 수 있도록 만든 모양자도 템플릿이라고 부릅니다. - (텀즈의 정의;www.terms.co.kr)
PHP는 HTML 내부에 PHP 명령어를 삽입할 수 있도록 허용함으로서 동일한 문서에서 데이터를 다양하게 변화 시켜가면서 보여줄 수 있습니다. 이와 같이 변화무쌍한 HTML 문서를 생성할 수 있다는 것은 PHP와 같은 서버 사이드 스크립트의 장점이기는 하지만 문서가 조금만 복잡해 진다면 PHP 코드와 HTML 태그가 혼재되어 있어 매우 혼란스럽기도 하며, 또한 도무지 전체 흐름이 파악하기가 쉽지 않습니다. 그 외에도 웹사이트가 복잡해 지다보면 PHP코드와 HTML이 혼합하는 방식으로는 관리하기도 어렵고, 향후 홈페이지를 수정하는 것도 무척이나 고달픈 작업이 되기 마련입니다.
그래서 웹사이트 규모가 커지게 되면 서버사이드 스크립트에서 수행할 PHP 코드와 웹브라우저 화면의 인터페이스를 담당하게 될 HTML 태그를 분리하기 시작하게 됩니다. HTML 태그는 주로 화면 디자인 및 정적 데이터를 나타내는데 사용되며, 반면 PHP 코드는 디자인된 화면에 들어갈 동적 데이터를 생성하는 일을 담당하게 됩니다. 여기에서 PHP 코드에서 완전히 분리되어 HTML로 작성된 코드를 템플릿이라 합니다. 우리가 잘 알고 있는 달력을 예를 들어 설명하겠습니다. 아래는 2001년12월 달력을 나타낸 것입니다.
2001년 12월
             1 
 2   3    4    5    6    7    8 
 9  10   11   12   13   14   15 
16  17   18   19   20   21   22 
23  24   25   26   27   28   29 
30  31            
이 예제에서 PHP 코드와는 독립적으로 작성될 수 있는 템플릿을 분리해 낸다면 아래와 같이 될 것입니다. 이러한 템플릿은 나모 웹에디터와 같은 툴을 이용하면 아주 편하고 쉽게 작성될 수 있을 것입니다.
    년  월
             
             
             
             
             
             
템플릿에 들어갈 데이터는 PHP 코드를 이용하여 년도와 달에 맞는 데이터를 생성하여 채워 넣게 됩니다.
파일명을 가지고 파일을 구분하는 것과 같이 메모리에 올려진 템플릿도 템플릿명(template name)을 가지고 구분하게 되지요. 그런데 이 템플릿이 대부분 파일로부터 읽혀지는 관계로 템플릿명을 파일태그(file tag) 또는 파일핸들(file handle)이라는 용어로도 사용됩니다.
템플릿 변수(template variable)
PHP 코드로 생성된 데이터를 템플릿에 채워 넣기 위해서는 템플릿과 PHP 코드사이에 해당 데이터를 다른 데이터와 구분하여 인식할 수 있는 이름이 필요하게 됩니다. 위의 예제를 통해 년과 월을 구분하는 경우를 예를 든다면 아래와 같을 것입니다.
{YEAR}{MONTH}
 ...  ...  ...  ...  ...  ...  ...
위와 같이 템플릿을 작성하였다면, 아래와 같이 PHP 코드에서 {YEAR}과 {MONTH}를 "2001"과 "12"로 설정할 수 있습니다.
[code php;gutter:false] $tpl = new hTemplate(); . . . $tpl->assign('YEAR', '2001'); $tpl->assign('MONTH', '12'); [/code]
< 템플릿을 이용한 홈페이지 구성 >
이제 템플릿을 출력할 때 {YEAR} 부분은 "2001"로 대치되고 {MONTH}부분은 "12"로 대치되어 그 결과 아래와 같이 템플릿 내용이 수정되어 출력될 것입니다.
200112
 ...  ...  ...  ...  ...  ...  ...
여기서 템플릿에 표시하는 {YEAR}, {MONTH}와 같은 템플릿 변수는 템플릿툴에 따라 다소 다르게 표시될 수 있습니다. 후키템플릿에서는 보는 바와 같이 템플릿변수를 템플릿 파일 내에서는 중괄호로 둘러싸도록 하고 있으나 PHP 코드 내에서는 중괄호 없이 사용합니다.
이와 같이 템플릿에 포함된 {YEAR}, {MONTH}을 템플릿에 삽입되는 변수라는 의미에서 템플릿 변수라고 부르며 다른 내용과 구분하여 템플릿 변수를 나타내기 위한 시작 및 종료기호 "{", "}"를 템플릿 태그라고 합니다.
기본형 : {변수명}
확장형 : <!--{변수명}-->
템플릿명을 파일핸들이라고 부르는 것과 같이 템플릿 변수를 변수핸들(variable handle)이라고도 부릅니다.
템플릿을 템플릿 변수와 관련지어 정의한다면 결국 템플릿이란 템플릿 변수가 포함된 HTML 문서라고 할 수 있습니다.
템플릿 파일(template file)
위에서 설명한 템플릿이 HTML 텍스트 형식의 별도의 파일로 저장된 형태를 템플릿 파일이라 합니다. 이 파일이 PHP 문서에 의해 메모리로 올려지면 템플릿이 되는 것이지요. 템플릿툴에 따라 메모리에 올려진 템플릿 자료구조는 여러가지 형태를 가지게 됩니다. 템플릿 파일로부터 읽혀진 상태 그대로의 문자열일 수도 있고 아니면 PHP 문서에서 사용하기 편리하도록 구성된 배열일 수도 있습니다. 후키템플릿에서는 템플릿 파일을 분석하여 그 결과를 배열에 기록하고 있습니다.
템플릿 NO파일(template no-file)
이와 같이 템플릿의 원소스는 HTML 텍스트 파일의 형식으로 작성되는 것이 보통이지만 때로는 DB 등에 저장되어 관리될 수도 있을 것입니다.

Posted by 방글24