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
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