phpsource/템플릿2006. 9. 20. 09:38
written: Jan 28 2002
last modified: Sep 20 2006
캐시 정보
$tpl = new hTemplate(템플릿 파일 기본 디렉토리,
array(
'active_cache_handler' => false or true
or _TPL_CACHE_NO
or _TPL_CACHE_DYNAMIC
or _TPL_CACHE_STATIC,
'update' => set to true if update cache,
'id' => cache ID,
'period' => garbage collection period,
'maxlifetime' => cache valid time,
'path' => path to cache,
'mode' => cache file permission(default is 0777),
'active_cache_compress' => false or not(default is true)
)
);
후키템플릿 생성자의 두 번째 인수로 캐시 정보가 전달됩니다. 이중에서 update 및 active_cache_handler 설정은 후키템플릿에서 사용하는 설정값이며 나머지는 모두 후키캐시핸들러(클래스명 hCacheFile)에서 사용하는 설정값입니다. 후키템플릿 생성자를 실행할 때 후키캐시 클래스에 대한 객체가 생성되며 이 때 캐시 정보를을 후키캐시 클래스의 생성자에 넘겨주게 됩니다.
< 캐시 정보의 기본값 및 설정예 >
항목 용도 기본값 설정예
active_cache_handler 캐시핸들러 사용유무 true false, _TPL_CACHE_NO, _TPL_CACHE_DYNAMIC, _TPL_CACHE_STATIC
or not
update 캐시 업데이트 false false or not
id 웹페이지를 구분하기 위한 인식자 HW_CACHE_ID 임의의 문자열
period 가비지콜렉션을 수행하는 주기 259,200(3일) 초단위로 설정
maxlifetime 캐시 데이터의 유효 기간 2,592,000(30일) 초단위로 설정
path 캐시가 저장되는 디렉토리 /tmp/ 접근가능한 모든 디렉토리
mode 캐시 파일의 퍼미션 0777 0644
active_cache_compress 캐시 파일의 압축 유무 true false or not
1.2.0 버전부터 mode와 active_cache_compress 설정이 추가되었으며, active_cache_handler에 설정할 수 있는 값은 이전의 true, false 외에 상수 _TPL_CACHE_NO, _TPL_CACHE_DYNAMIC, _TPL_CACHE_STATIC가 추가되었으며 기본값이 true에서 _TPL_CACHE_STATIC으로 변경되었습니다.
캐시 정보를 지정하는 예를 들어보면 아래와 같습니다.
[code php;gutter:false] include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates', array( 'id' => 'test', 'period' => 10*24*3600, // 10일 'maxlifetime' => 60*24*3600, // 60일 'path' => './hCache' ) ); [/code]
active_cache_handler
'active_cache_handler'  => false or true
or _TPL_CACHE_NO
or _TPL_CACHE_DYNAMIC
or _TPL_CACHE_STATIC,
캐시핸들러를 사용하지 않으려면 false를 설정한다. 그렇지 않으면 캐시핸들러가 기본적으로 동작합니다. 1.2.0 버전부터는 기본적으로 정적 캐시(Static Cache)로 동작합니다.
< active_cache_handler 설정값에 따른 동작 >
설정값 동작 가능 버전
true 정적 캐시 all
false 캐시 없음 all
_TPL_CACHE_NO 캐시 없음 1.2.0
_TPL_CACHE_DYNAMIC 동적 캐시 1.2.0
_TPL_CACHE_STATIC 정적 캐시 1.2.0
update
'update' => false or not(set to true if update cache)
update값이 false가 아니라면 이전에 사용하던 캐시 데이터를 말끔히 지워버리고 템플릿 파일로부터 템플릿을 다시 분석하여 변화된 템플릿 정보를 반영하여 캐시에 저장합니다. 템플릿 내용이 바뀌게 되면 이를 자동으로 감지하여 캐시 내용을 갱신하기 때문에 update 인수는 특별한 이유가 없으면 지정할 필요가 없습니다. 현재 페이지에 대한 캐시만을 강제로 갱신시킬 때 사용하시기 바랍니다.
id
'id' => cache ID
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'id' => 'abc' ) ); [/code]
후키템플릿 클래스에서 캐시를 호출할 때 위와 같이 id를 지정하였다면 후키템플릿 클래스 내부에서 후키캐시 객체를 생성할 때는 다음과 같은 방법으로 id를 재지정한 후 재지정된 id를 후키 캐시 클래스 생성자에 전달해 줍니다.
[code php;gutter:false] $id = str_replace('/', '@', substr($PHP_SELF, 1)) . "($id)"; new hCache( array( 'id' => $id ) ); [/code]
대부분의 경우에는 id를 지정할 필요가 없습니다. 클래스 내에서는 각 웹페이지를 구분하기 위하여 해당 웹페이지의 URL의 pass를 사용합니다. 예를 들어,
캐시하고자 하는 웹페이지의 URL:
http://www.phpclass.com/php/class.php

캐시클래스에 전달되는 캐시 id:
php@class.php()
후키템플릿에서는 현 문서 URL의 pass "phpclass/phpclass.php"에서 패스구분자 "/"를 "@"로 바꾼 후 후키캐시로 전달합니다. 따라서 하나의 URL로 하나의 웹페이지가 생성되는 경우에는 생성자에 id를 지정할 필요가 없습니다. 그러나 만약 하나의 URL로 여러 개의 웹페이지가 생성된다면 이를 구분할 수 있는 인식자가 추가로 필요할 것입니다. 이 역할을 하는 것이 생성자에 지정되는 id입니다. 예를 들어 id를 "1"라고 지정하게 되면 이 때 생성되는 캐시 파일명은 아래와 같을 것입니다.
캐시하고자 하는 웹페이지의 URL:
http://www.phpclass.com/php/class.php

생성자에 지정된 id값: "1"

캐시클래스에 전달되는 캐시 id:
php@class.php(1)
period
'period' => garbage collection period
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'period' => 259200 ) ); [/code]
가비지콜렉션은 서버에 많은 부담을 주는 동작 중에 하나입니다. 따라서 매번 수행하기 보다는 일정한 주기마다 정기적으로 수행하는 것이 바람직하다고 생각합니다. 이러한 이유로 후키캐시에 설정되어 있는 주기는 3일(초단위로는 259,200초)로 기본 설정되어 있습니다. 이에 따라 3일에 한번씩 가비지 콜렉션을 수행하게 됩니다. 이 주기를 더 길게하거나 짧게 하고 싶으면 period의 값을 초단위로 지정하여 주면 됩니다.
maxlifetime
'maxlifetime' => cache valid time
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'maxlifetime' => 2592000 ) ); [/code]
maxlifetime은 각 웹페이지에 대한 캐시 만료 기한을 나타내는 설정값입니다. 해당 웹페이지의 캐시 데이터를 사용한 후 maxlifetime에서 설정된 시간이 지나도록 다시 사용되지 않는다면 이 캐시 데이터는 쓰레기로 간주됩니다. 따라서 가비지콜렉션을 수행할 때 이러한 쓰레기는 모두 삭제됩니다. maxlifetime은 30일(초단위로는 2,592,000초)로 기본 설정되어 있습니다. 이 시간을 더 길게하거나 짧게 하고 싶으면 maxlifetime의 값을 초단위로 지정하여 주면 됩니다.
maxlifetime이 필요한 경우를 예를 든다면 웹페이지의 URL이 변경되었을 때 이전에 사용하던 URL에 대한 캐시 데이터는 다시 사용되지 않을 것입니다. maxlifetime은 이와같이 다시 사용되지 않는 캐시 데이터를 정리하는데 유용하게 사용될 것입니다.
path
'path' => path to cache
캐시가 저장되는 장소는 기본적으로 "/tmp/"입니다. 이 장소를 변경하고 싶을 때 path에 해당 경로를 지정해 주면 됩니다. 이 때 물론 해당 경로에 대한 퍼미션은 미리 적절히 조정해 주셔야 합니다. 리눅스에서 캐시 디렉토리에 대하여 퍼미션을 조정하려면 아래와 같이 하시기 바랍니다.
mkdir /tmp
chown nobody:nobody hCache
chmod 707 hCache
소유자가 "nobody"가 아니라면 해당되는 소유자를 지정해 주면 됩니다. 이것은 httpd.conf를 참조바랍니다.
mode
'mode' => cache file permission(default is 0777),
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'mode' => 0644 ) ); [/code]
1.2.0 버전부터는 새로운 설정값인 mode를 통해 캐시파일을 생성할 때 퍼미션 모드를 설정할 수 있도록 해줍니다. 기본값은 0777로 설정되어 있습니다.
< 캐시파일 퍼미션의 기본값 및 설정예 >
항목 용도 기본값 설정예
mode 캐시 파일의 퍼미션 0777 0644
active_cache_compress
'active_cache_compress' => false or not(default is true)
1.2.0 버전부터는 새로운 설정값인 active_cache_compress를 통해 캐시파일의 압축 유무를 설정할 수 있도록 해줍니다. 기본값은 true로 설정되어 있습니다.
gz 라이브러리 함수 gzcompress, gzuncompress를 이용하여 압축합니다. 압축에 사용하는 함수는 특별히 정해진 것은 아니고 향후 버전에서 템플릿 툴 내부에서 상황에 따라 변경될 수 있습니다.
서버가 이 함수들을 지원하지 않는다면 active_cache_compress 값을 true로 설정하더라도 압축하지 않고 저장합니다.
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'active_cache_compress' => false ) ); [/code]
< 캐시파일 압축기능의 기본값 및 설정예 >
항목 용도 기본값 설정예
active_cache_compress 캐시 파일의 압축 유무 true false or not

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:30
written: Jan 28 2002
last modified: Sep 20 2006
1.2.0 버전부터는 FastPrint() 함수 대신에 output() 함수를 이용해주세요. FastPrint() 함수는 상위호환성없이 당분간 임시로 사용될 예정입니다.
output() 함수의 사용법은 FastPrint() 함수의 사용법과 동일하며, 기존의 FastPrint() 함수에서 지정할 수 있었던 템플릿변수 외에도 HTML 스크립트 문장을 직접 지정할 수 있습니다.
또한 output() 함수에서는 FastPrint() 함수에서 디버깅할 수 있던 "템플릿 변수 정보", "템플릿 파일 정보" 외에 "캐시 관련 정보"를 볼 수 있습니다.
템플릿 변수값 출력하기
FastPrint(변수명)
이 함수는 템플릿 변수에 저장되어 있는 HTML 소스를 출력하는 기능을 담당합니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint('MAIN'); [/code]
위와 같은 경우에 FastPrint() 함수는 템플릿 변수 MAIN의 값을 출력합니다.
템플릿 변수명을 지정하지 않았을 때 처리 방법
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint(); [/code]
0.0.1 버전에서의 처리방법
템플릿 변수명을 지정하지 않으면 assign(변수명,...)에 의해 마지막으로 생성된 템플릿 변수를 기본으로 사용합니다. 그러나 assign() 함수의 두 번째 인수로 템플릿 또는 블록변수(다이나믹 블록)이 아닌 순수 문자열을 지정하였을 때는 변수명을 반드시 지정하여야 합니다.
0.0.2 버전에서의 처리방법
버전 0.0.2에서는 문자열일 때도 생략할 수 있습니다.
1.0.0 버전에서의 처리방법
버전 1.0.0부터는 템플릿 변수명을 명시적으로 지정하는 것을 원칙으로 하며 지정하지 않았을 때는 향후 업그레이드 버전에서 호환성을 보장할 수 없습니다.
1.1.2 버전에서의 처리방법
버전 1.1.2부터는 템플릿 변수명을 항상 명시적으로 지정하여야 하며 지정하지 않으면 에러로 처리합니다.
FastPrint() 함수를 이용한 디버깅
아래와 같이 FastPrint() 함수의 배열인수를 통해 "-variable", "-template"를 지정하면 템플릿 변수 정보 및 템플릿 파일 정보를 알려줍니다.
[code php;gutter:false] $tpl->FastPrint( array( '-variable', '-template' ) ); [/code]
-variable
현재까지 할당되어 있는 템플릿변수에 대한 상태를 출력합니다.
-template
현재까지 템플릿파일로부터 읽고 파싱된 템플릿 정보를 출력합니다.
[code php;gutter:false] $tpl->FastPrint( array( 'MAIN', '-variable', '-template' ) ); [/code]
먼저 템플릿변수 "MAIN"를 출력합니다. 그 다음에 할당된 모든 템플릿 변수의 상태를 보여줍니다. 그 다음에 템플릿파일로부터 읽어들인 모든 템플릿 정보를 보여줍니다.
만약 디버깅 정보 전부가 아닌 일부 템플릿 변수(또는 템플릿 정보, 캐시 관련 정보)에 대하여만 보고 싶다면 아래와 같이 보고싶은 정보 항목을 명시적으로 지정하면 됩니다.
[code php;gutter:false] $tpl->FastPrint( array( 'MAIN', '-variable PAGEVIEWS HEAD_TITLE COUNTER', '-template MAIN' ) ); [/code]
이 기능에 대한 좀 더 자세한 정보는 "2.2.템플릿 변수 정보", "2.3.템플릿 구조 정보를 참조바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:28
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 변수값 읽어오기
get_assigned(변수명)
이 함수는 해당 템플릿 변수에 지정되어 있는 변수값을 반환해 줍니다. 따라서 아래와 같은 경우를 보면 "잘되나 돌려봐야지" 라는 문자열을 반환해 주게 됩니다.
[code php;gutter:false] include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('table', 'table.htm'); $tpl->assign('BODY', '잘되나 돌려봐야지.'); $body = $tpl->get_assigned('BODY'); [/code]
FastTemplate에서는 assign() 함수에 의해 할당된 템플릿 변수와 parse 함수에 의해 할당된 템플릿 변수가 구분되어 있습니다. 그러나 후키템플릿에서는 아래 표에서 보는 바와 같이 템플릿 변수가 하나로 통일되어 있습니다.
< 템플릿 변수의 종류 및 저장 장소 >
종류 저장장소
FastTemplate 후키템플릿
assign() 함수에 의해 할당된 템플릿 변수 $PARSEVARS[변수명] 템플릿변수 리스트[변수명]
parse 함수에 의해 할당된 템플릿 변수 $변수명
< 템플릿 변수값 읽어오는 함수 >
종류 수행함수
FastTemplate 후키템플릿
assign() 함수에 의해 할당된 템플릿 변수값 읽어오기 get_assigned(변수명) get_assigned(변수명)
parse 함수에 의해 할당된 템플릿 변수값 읽어오기 fetch(변수명)
FastTemplate에서의 fetch 함수는 parse 함수의 실행 결과로 얻어진 템플릿 변수값을 반환하기 위해 작성되어 있었습니다. 후키템플릿에서는 템플릿 변수가 하나로 통일되었기 때문에 함수를 구분하여 작성할 필요가 없어졌고 따라서 템플릿 변수를 읽어오는 함수는 get_assigned() 함수로 통일되었습니다.
get_assigned() 함수를 이용하면 템플릿 변수값을 웹브라우저로 직접 출력하는 대신에 PHP 코드 내로 변수값을 넘겨 받을 수 있습니다. 그러면 넘겨 받은 값을 가지고 E-Mail로 전송하거나 파일로 저장하거나 할 수 있지요.
[code php;gutter:false] $data = $tpl->get_assigned('MAIN'); fwrite($fd, $data); // save to a file [/code]
템플릿 변수명을 지정하지 않았을 때 처리 방법
[code php;gutter:false] $tpl->assign('MAIN', array('table', 'main')); $data = $tpl->get_assigned(); [/code]
0.0.1 버전에서의 처리방법
템플릿 변수명을 지정하지 않으면 assign(변수명,...)에 의해 마지막으로 생성된 템플릿 변수를 기본으로 사용합니다. 그러나 assign() 함수의 두 번째 인수로 템플릿 또는 블록변수(다이나믹 블록)가 아닌 순수 문자열을 지정하였을 때는 변수명을 반드시 지정하여야 합니다.
0.0.2 버전에서의 처리방법
버전 0.0.2에서는 문자열일 때도 생략할 수 있습니다.
1.0.0 버전에서의 처리방법
버전 1.0.0부터는 템플릿 변수명을 명시적으로 지정하는 것을 원칙으로 하며 지정하지 않았을 때는 향후 업그레이드 버전에서 호환성을 보장할 수 없다.
1.2.0 버전에서의 처리방법
템플릿 변수명을 명시적으로 지정하여야 하며, 지정하지 않으면 정상적으로 동작하지 않습니다.
사용 예제
템플릿을 이메일로 보내기
후키템플릿은 템플릿 내용으로 HTML 문서로 제한하지 않습니다. 따라서 템플릿 분석 결과를 브라우저로 출력하는 대신 그 데이터를 변수로 되돌려 받아 이메일로 보낼 수 있습니다.
[code php;gutter:false] $data = $tpl->get_assigned(); mail('hwooky@phpclass.com', '후키템플릿', $data); [/code]
템플릿을 파일로 저장하기
템플릿 분석 결과를 아래와 같이 별도의 파일로 저장할 수 있습니다.
[code php;gutter:false] $data = $tpl->get_assigned(); if ($fp=@fopen('parsed.html', 'w')) { fwrite($fp, $data); fclose($fp); } [/code]
템플릿을 다른 템플릿 변수에 할당하기
템플릿 분석 결과를 아래와 같이 또 다른 템플릿 변수에 할당하게 되면 다음 템플릿을 분석할 때 이용할 수 있을 것입니다.
[code php;gutter:false] $data = $tpl->get_assigned(); $tpl->assign('NEXTMAIN', $data); [/code]
get_assigned()로 획득한 값을 출력할 때 주의할 점
1.2.0 버전부터 FastPrint() 함수대신에 사용되는 output() 함수에서 출력된 템플릿 스크립트가 php 에서 제공하던 출력버퍼 대신에 후키템플릿 자체 버퍼를 이용하며, 자체 버퍼에 저장된 템플릿 스크립트는 shutdown 함수가 실행될 때 브라우저로 전송됩니다. 따라서 print 또는 echo 함수를 이용하여 출력된 스크립트들은 자체 버퍼에 저장된 템플릿 스크립트보다 먼저(php5) 또는 나중(php4)에 출력됩니다.
따라서 get_assigned() 함수로 획득한 템플릿 스크립트를 순서대로 브라우저로 전송하려면 print 또는 echo 함수를 이용하면 안되며 새로 추가된 output()함수를 이용하시기 바랍니다.
[code php;gutter:false] $tpl->output($tpl->get_assigned('VARNAME')); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:24
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 변수값 할당하기
assign() 함수는 템플릿 변수에 그 값을 할당하는 역할을 합니다. 템플릿 변수에 값을 지정할 때는 아래에 나타나 있는 바와 같이 3가지 방법으로 그 값을 지정할 수 있습니다.
assign(변수명, 변수값)
assign(array(변수명 => 변수값, ...))
assign(변수명, array(변수값, ...))
변수값의 3가지 형태
변수값으로는 문자열, 템플릿명, 블록변수명을 지정할 수 있습니다.
문자열을 할당하기
assign(변수명, 문자열)
assign(array(변수명 => 문자열, ...))
문자열을 지정할 때는 그 문자열 값이 그대로 변수값으로 할당됩니다.
[code php;gutter:false] $tpl->assign('TITLE', '후키템플릿 블록실험'); $tpl->assign('BODY', '잘되나 돌려봐야지'); [/code]
위와 같이 각 변수를 별개의 문장으로 처리할 수도 있으나 아래와 같이 배열을 이용하면 한 번에 여러 개의 변수에 값을 지정할 수 있습니다.
[code php;gutter:false] $tpl->assign( array( 'TITLE' => '후키템플릿 블록실험', 'BODY' => '잘되나 돌려봐야지' ) ); [/code]
만약 동일한 변수명으로 중복되어 지정하게 되면 뒤에서 지정된 값이 앞에서 지정된 값을 덮어쓰게 됩니다. 즉 아래와 같은 경우를 보면 템플릿 변수 BODY에는 "계속 돌려봐야지"라는 값만 남아있게 되는 것이지요.
[code php;gutter:false] $tpl->assign('BODY', '잘되나 돌려봐야지'); $tpl->assign('BODY', '계속 돌려봐야지'); [/code]
만약 덮어쓰기가 아니라 앞서 저장된 문자열 뒤쪽에 덛붙여서 추가하기를 원한다면 1.0.0 버전부터 지원되는 세 번째 인수를 이용하여 append 방식임을 지정하여 주시기 바랍니다.
[code php;gutter:false] $tpl->assign('BODY', '잘되나 돌려봐야지.'); $tpl->assign('BODY', ' 계속 돌려봐야지.', true); [/code]
이 예제를 실행하게되면 템플릿 변수 BODY에는 "잘되나 돌려봐야지. 계속 돌려봐야지."이 최종적으로 할당됩니다.
assign() 함수의 두 번째 인수로 배열을 지정할 때
assign(변수명, array(서브변수명 => 문자열, ...))
위와 같이 지정되는 변수값의 형태가 배열로서 서브변수명을 지정할 수 있습니다. 예를 들면 아래와 같은 경우를 생각할 수 있을 것입니다.
[code php;gutter:false] $tpl->assign('upfile', array( 'name' => 'Autoexec.bat', 'type' => 'application/octet-stream', 'tmp_name' => 'c:\apache\php10D5.TMP', 'size' => 177 ) ); [/code]
위와 같이 assign() 함수를 실행하게 되면 아래와 같이 4개의 템플릿 변수가 생성됩니다.
< 생성된 템플릿 변수 >
템플릿 변수명 변수값
{upfile.name} Autoexec.bat
{upfile.type} application/octet-stream
{upfile.tmp_name} c:\apache\php10D5.TMP
{upfile.size} 177
이와 같이 변수명과 서브변수명은 마침표(.)로 구분되어지며 이러한 과정은 재귀적으로 이루어지므로 2차원 이상의 다차원배열도 템플릿 변수값으로 지정할 수 있습니다.
"GLOBALS"와 "HTTP_COOKIE"라는 문자열은 서브변수명으로 지정할 수 없는 예약어입니다. 지정하더라도 템플릿 변수를 생성하지 않고 무시해 버립니다.
만약 위의 예에서 assign() 함수의 두 번째 인수로 지정된 배열의 형태가 문자열 인덱스 배열(associative array)가 아닌 정수 인덱스 배열이라면 서브변수명이 문자열 인덱스가 아닌 정수 인덱스를 사용하게 됩니다.
[code php;gutter:false] $tpl->assign('upfile', array( 'Autoexec.bat', 'application/octet-stream', 'c:\apache\php10D5.TMP', 177 ) ); [/code]
위와 같이 정수 인덱스로 지정된다면 아래와 같이 정수 인덱스를 서브변수명으로 취하여 4개의 템플릿 변수가 생성됩니다.
< 생성된 템플릿 변수 >
템플릿 변수명 변수값
{upfile.0} Autoexec.bat
{upfile.1} application/octet-stream
{upfile.2} c:\apache\php10D5.TMP
{upfile.3} 177
템플릿 처리하기
assign(변수명, 템플릿명)
assign(array(변수명 => 템플릿명, ...))
assign(변수명, array(템플릿명, ...))
assign() 함수에서 변수값으로 템플릿명을 지정하는 경우에는 해당 템플릿을 가져와서 그 내부에 포함되어 있는 템플릿 변수를 모두 처리한 후 그 결과값을 첫 번째 인수로 지정된 템블릿 변수명에 할당합니다. 따라서 템플릿을 처리할 때는 그 템플릿 내에 존재하는 템플릿 변수가 먼저 assign() 함수를 통해 특정 값으로 할당되어 있어야 합니다. 만약 할당되지 않는 템플릿 변수가 있으면 에러메시지를 출력(버전 0.0.1일 때)하거나 아니면 에러메시지없이 null 값으로 처리(버전 0.0.2부터)됩니다.
템플릿명 처리하는 방식
변수값으로 템플릿이 지정되었을 때는 지정 방법에 따라 세가지 방식(regular, compound, append)으로 처리되어 집니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); // regular $tpl->assign('MAIN', array('table', 'main')); // compound $tpl->assign('MAIN', 'row', true); // append [/code]
regular 방식
regular 방식은 가장 기본적인 처리방식으로 지정된 템플릿 안에 포함된 템플릿 변수를 그 변수값으로 대치시킨 후 완성된 순수 HTML 코드를 첫 번째 인수로 지정된 또 다른 템플릿 변수에 저장하게 됩니다.
[code html;gutter:false] <!-- NAME: main.htm --> <H2><U>{TITLE}</U></H2> <!-- END: main.htm --> [/code]
위와 같이 템플릿 내에 {TITLE} 라는 템플릿 변수가 존재할 때 아래와 같이 assign() 함수를 통해 {TITLE} 라는 변수에 "후키템플릿 블록실험"라는 값을 지정하여 보죠.
[code php;gutter:false] $tpl->define( array( 'main' => 'main.htm' // 템플릿 main 생성 ) ); $tpl->assign('TITLE', '후키템플릿 블록실험'); // 템플릿 변수 TITLE 생성 $tpl->assign('MAIN', 'main'); // 템플릿 변수 MAIN 생성 [/code]
이런 경우 assign("MAIN", "main")를 수행할 때 템플릿 "main"에 존재하는 템플릿 변수 {TITLE}가 모두 assign() 함수를 통해 미리 지정된 "후키템플릿 블록실험"라는 값으로 대치되는 것이지요. 대치된 결과는 첫 번째 인수로 지정된 MAIN이라는 또 다른 템플릿 변수에 저장됩니다. 이 예제의 경우 MAIN이라는 템플릿 변수에는 아래와 같이 순수 HTML 코드가 저장됩니다.
[code html;gutter:false] <!-- NAME: main.htm --> <H2><U>후키템플릿 블록실험</U></H2> <!-- END: main.htm --> [/code]
만약 assign() 함수를 통해 여러 개의 템플릿을 처리하는 경우라면 아래와 같이 작성하게 될 것입니다.
[code php;gutter:false] $tpl->define( array( 'main' => 'main.htm', 'sub' => 'sub.htm' ) ); $tpl->assign('TITLE', '후키템플릿 블록실험'); // ***템플릿 변수 TITLE 생성 $tpl->assign('SUB, 'sub'); $tpl->assign('MAIN', 'main'); [/code]
이러한 경우 배열을 이용하면 한 번에 처리할 수도 있습니다.
[code php;gutter:false] $tpl->assign( array( 'TITLE' => '후키템플릿 블록실험', 'SUB' => 'sub', 'MAIN' => 'main' ) ); [/code]
compound 방식 - 버전 1.0.0부터는 지원되지 않습니다.
compound 방식은 템플릿 변수를 통해 연결되어 있는 두 가지 이상의 문서를 동시에 처리할 때 유용합니다. 예를 들어 main.htm 및 table.htm이라는 두 가지 템플릿이 아래와 같이 있다고 하지요.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {MAIN} </BODY> </HTML> <!-- END: main.htm --> [/code]
[code html;gutter:false] <!-- NAME: table.htm --> <U>{NUMBER}</U> <!-- END: table.htm --> [/code]
[code php;gutter:false] $tpl->define( array( 'main' => 'main.htm', 'table' => 'table.htm' ) ); $tpl->assign('NUMBER', '2001'); $tpl->assign('MAIN', array('table', 'main')); [/code]
이러한 경우를 보면 $tpl->assign("MAIN", array("table", "main"));의 의미는 아래와 같이 두 개의 문장으로 나누어 기술할 수 있습니다. 즉, 우선 템플릿 table을 먼저 분석하여 그 결과값을 새로운 템플릿 변수 MAIN에 저장한 후 템플릿 main 분석결과를 템플릿 변수 MAIN에 다시 저장하는 것입니다.
[code php;gutter:false] $tpl->assign('MAIN', 'table'); $tpl->assign('MAIN', 'main'); [/code]
assign() 함수의 두 번째 인수가 배열일 경우에는 변수값으로 문자열과 템플릿을 혼용하여 지정할 수 없습니다.
append 방식
마지막으로 append 방식에 대하여 알아보겠습니다. append 방식은 템플릿 변수를 새롭게 생성하는 것이 아니라 이전에 있던 템플릿 변수값에 새로운 값을 추가할 때 사용합니다.
append 방식을 처리하는 방법이 1.0.0 버전에서 약간 변경되었습니다.
1.0.0 이전 버전에서는 append 방식으로 적용하기 위해서는 아래와 같이 지정하는 템플릿명 앞에 마침표(.)를 붙여주면 됩니다.
assign(변수명, ".템플릿명")
템플릿 변수값이 템플릿명(또는 블록명)일 때를 살펴보면 템플릿명(또는 블록명)의 첫자가 '.'인 경우에는 해당 템플릿에 대하여 append 방식으로 처리합니다.
이와같은 dot 문자에 의한 append 기능은 1.0.0 버전부터는 이를 공식적으로는 지원하지 않으며(동작은 하지만 향후 버전과 호환성없음), 1.2.0 버전부터는 기능 자체가 삭제되었습니다. 따라서 append 기능을 사용하려면 아래와 같이 세 번째 인수를 true로 설정하기 바랍니다.
assign(변수명, 템플릿명, true)
템플릿 파일 row.htm의 내용이 아래와 같다고 가정하겠습니다.
[code html;gutter:false] <TR><TD>{NUMBER}</TD></TR> [/code]
템플릿 파일 row.htm을 가지고 아래와 같은 PHP 문서를 실행하여 보지요.
[code php;gutter:false] $tpl->define( array( 'row' => 'row.htm', ) ); $tpl->assign('NUMBER', 1); $tpl->assign('ROWS', 'row'); $tpl->assign('NUMBER', 2); $tpl->assign('ROWS', 'row', true); [/code]
우선 $tpl->assign("ROWS", "row") 문장에 의해 템플릿 변수 ROWS에는 아래와 같은 값이 기록되겠지요.
[code html;gutter:false] <TR><TD>1</TD></TR> [/code]
다음 $tpl->assign("ROWS", "row", true) 문장을 추가로 수행하게 되면 결과값이 템플릿 변수 ROWS의 기존의 값을 지우지 않고 그 뒤에 추가로 기록하게 되며, 최종적으로 템플릿 변수 ROWS에 기록되는 값은 아래와 같을 것입니다.
[code html;gutter:false] <TR><TD>1</TD></TR> <TR><TD>2</TD></TR> [/code]
append 방식이냐 아니냐를 나타내는 세 번째 인수는 1.0.0 버전부터 지원되며 이를 이용하면 템플릿 변수값이 일반 문자열일 때도 append 방식으로 처리할 수 있습니다.
예를 들어 아래와 같이 regular 방식으로 처리되는 예제를 살펴보겠습니다.
[code php;gutter:false] $tpl->assign('TEST', '123'); $tpl->assign('TEST', '456'); [/code]
이 예제를 실행하게되면 템플릿 변수 TEST에는 "456"이 최종적으로 할당됩니다.
이제 일반 문자열에 대하여 append 방식으로 처리하도록 두 번째 문장을 regular 방식이 아닌 append 방식으로 변경하여 보지요.
[code php;gutter:false] $tpl->assign('TEST', '123'); $tpl->assign('TEST', '456', true); [/code]
이 예제를 실행하게되면 템플릿 변수 TEST에는 "123456"이 최종적으로 할당됩니다.
블록변수(다이나믹 블록) 처리하기
블록변수(다이나믹 블록) 처리방법은 템플릿 처리방법과 동일합니다.
assign(변수명, 블록변수명)
assign(array(변수명 => 블록변수명, ...))
assign(변수명, array(블록변수명, ...))
템플릿을 처리하는 것과 다른 점이 한가지 있습니다.
지정된 해당 블록 내용을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 지정된 블록변수명에 해당하는 변수에 할당합니다. 각 블록에는 지정된 템플릿 변수가 미리 정의되어 있습니다. 이 변수명은 블록변수명과 동일합니다.
0.0.1 버전에서의 assign() 함수의 첫 번째 인수 처리 방식
이러한 이유로 후키템플릿 버전 0.0.1에서는 블록을 처리할 때 지정되는 첫 번째 인수에 어떠한 이름을 지정하더라도 상관없이 이를 무시하고 블록명을 가지고 템플릿 변수명으로 강제 지정하여 처리해 줍니다.
예를 들어 블록변수(다이나믹 블록)이 포함된 템플릿 파일 및 이를 처리하는 PHP 코드가 아래와 같다고 할 때 여기에서 보면 블록 "row"를 assign() 함수로 처리할 때 첫 번째 인수가 "DUMMY"로 지정하였으나 "DUMMY"라는 템플릿 변수명은 의미없는 이름이며 어떠한 이름을 지정하여도 관계없습니다.
[code html;gutter:false] <!-- NAME: dynamic.htm --> <TABLE> <!-- BEGIN DYNAMIC BLOCK: row --> <TR><TD>{NUMBER}</TD></TR> <!-- END DYNAMIC BLOCK: row --> </TABLE> <!-- END: dynamic.htm --> [/code]
[code php;gutter:false] $tpl->define( array( 'table' => 'dynamic.htm' ) ); for ($n=1;$n<=3;$n++) { $Number = $n; $tpl->assign('NUMBER', $Number); $tpl->assign('DUMMY', '.row'); // 블록 row 처리 } $tpl->assign('MAIN', 'table'); [/code]
지정된 이름이 무엇이든지 관계없이 블록명 "row"를 템플릿 변수명으로 강제 지정합니다. 즉, 블록 "row"의 처리결과는 강제 지정된 템플릿 변수명 "row"에 저장되는 것이지요.
따라서 아래의 예들은 모두 새로운 템플릿 변수 "row"라는 것을 생성하여 블록 "row"의 처리 결과를 저장합니다. 여기서 "DUMMY", "STAR", "hwooky"는 모두 의미없는 인수로 무시되어 버립니다.
[code php;gutter:false] $tpl->assign('DUMMY', '.row'); $tpl->assign('STAR', '.row'); $tpl->assign('hwooky', '.row'); [/code]
0.0.2~0.0.4 버전에서의 assign() 함수의 첫 번째 인수 처리 방식
 버전 0.0.2에서는 첫 번째 인수를 반드시 두 번째 인수로 지정되는 블록명과 동일하게 지정하도록 수정하였습니다.
버전 0.0.1을 가지고 제 홈페이지에 적용하여 실험하다보니 의미없는 첫 번째 인수로 인해 소스 코드에서 블록을 처리하는 assisgn 함수 부분의 의미가 불명확하게 되고 이에 따라 소스 코드의 가독성도 떨어진다는 생각이 들었습니다.
따라서 첫 번째 인수의 의미를 분명히 하는 것이 좋겠다는 판단이 들어 첫 번째 인수가 진정 의미하고 있는 실제 템플릿 변수를 지정하도록 그 문법을 엄격하게 적용하게 되었습니다.
[code php;gutter:false] $tpl->assign('DUMMY', '.row'); // 블록 row 처리 [/code]
만약 위와 같이 버전 0.0.1에서 하던 습관대로 작성하게 되면 "In CASE is block, must specify template variable name equally with block name.: [assign("DUMMY", "row") => assign("row", "row")]" 라는 에러메시지를 출력하도록 되어 있습니다. 따라서 이러한 에러메시지를 피하려면 아래와 같이 수정하시기 바랍니다.
[code php;gutter:false] $tpl->assign('row', '.row'); // 블록 row 처리 [/code]
수정하지 않더라도 에러메시지만 출력할 뿐 실행에는 버전 0.0.1과 마찬가지로 정상적으로 처리되고 있습니다.
1.0.0 버전에서의 assign() 함수의 첫 번째 인수 처리 방식
버전 1.0.0부터는 다이나믹 블록을 처리할 때 첫 번째 인수를 반드시 두 번째 인수로 지정되는 블록명과 동일하게 지정하여야 합니다.
[code php;gutter:false] $tpl->assign('row', 'row', true); // 블록 row 처리 [/code]
만약 이를 지키지 않으면 0.0.2 ~ 0.0.4 버전과 달리 에러메시지 출력하는 즉시 스크립트가 중지되어 버립니다.
템플릿 변수 삭제하기
후키템플릿에서는 템플릿 변수를 삭제하는 함수를 별도로 제공하지 않습니다. 대신에 assign(변수명, "")와 같이 assign() 함수를 이용하여 빈문자열을 할당하게 되면 변수값을 지울 수 있습니다. 변수값을 지우는 경우는 아래와 같이 주로 이중 블록 처리할 때 순환문 시작(또는 끝) 부분에 위치하게 될 것입니다.
[code php;gutter:false] for ($k=9;$i<13;$k++) { $tpl->assign('row', ''); for ($i=0;$i<3;$i++) { $tpl->assign( array( 'ITEM' => $item[$i], 'MONEY' => $money[$i] ) ); $tpl->assign('row', 'row', true); } $tpl->assign('MONTH', $k); $tpl->assign('month_row', 'month_row', true); } [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:21
written: Jan 28 2002
last modified: Sep 20 2006
define() 함수로 처리할 수 있는 템플릿 문서는 템플릿 파일이 대부분입니다. 1.2.0 버전부터는 파일이 아닌 DB 등에 저장된 템플릿을 읽어와 PHP 변수에 저장한 문자열 형식의 값으로도 처리할 수 있습니다. 이와같이 문자열 변수에 담긴 템플릿 문서를 템플릿 파일(template file)과 대비하여 템플릿 문자열(template string)이라 호칭합니다.
define(템플릿명, 템플릿 파일명, 환경설정)
define(템플릿명, 템플릿 문자열, 환경설정)
1.0.0 버전에서 PROPOSAL(제안서)로 제안한 NO파일 용법이 바로 define() 함수에서 템플릿 문자열을 처리하는 용법을 의미합니다. 1.2.0 버전부터는 이러한 NO파일 용법을 정식으로 제공합니다.
템플릿 파일 처리하기
1개의 템플릿 파일을 지정하는 방법
define(템플릿명, 템플릿 파일명, 환경설정)
환경설정값은 1.2.0 버전부터 지원되는 기능으로 1개의 템플릿 파일을 지정할 때만 환경설정을 할 수 있습니다.
1.2.0 버전에서 지정할 수 있는 환경설정값으로는 "template_dir", "cache_type", "allow_filter"가 있습니다.
[code php;gutter:false] $tpl->define( 'main', 'main.htm', array( 'template_dir' => './templates', 'cache_type' => _TPL_CACHE_DYNAMIC, 'allow_filter' => 'func_a, func_b, func_c, =' ) ); [/code]
define() 함수에 지정된 템플릿 파일 기본 디렉토리는 생성자에 지정한 디렉토리에 우선하여 처리됩니다. define() 함수에 지정된 디렉토리에 템플릿 파일이 없을 때만 생성자에 지정한 디렉토리를 사용합니다.
cache_type에서 지정할 수 있는 상수는 후키템플릿에 미리 정의되어 있으며 _TPL_CACHE_STATIC(정적캐시), _TPL_CACHE_DYNAMIC(동적캐시), _TPL_CACHE_NO(캐시하지않음)와 같이 세가지입니다. cache_type를 지정하지 않으면 정적캐시(_TPL_CACHE_STATIC)로 처리됩니다.
allow_filter은 지정된 템플릿 문서에서 허용하는 필터명령을 지정하는데 사용합니다. 위의 예에서는 "func_a", "func_b", "func_c" 및 "="(초기화명령/PHP명령)을 허용합니다.
1개 이상의 템플릿 파일을 지정하는 방법
define(
array(
템플릿명1 => 템플릿 파일명1,
템플릿명2 => 템플릿 파일명2
)
);
define() 함수는 파일로부터 템플릿 정보를 읽어들인 후 템플릿 구조 분석 및 템플릿 변수 분리 작업을 모두 수행한 후 템플릿 정보 리스트에 그 내용을 기록합니다.
[code php;gutter:false] $tpl->define( array( 'main' => 'main.htm', 'table' => 'dynamic.htm' ) ); [/code]
main.htm 및 dynamic.htm은 템플릿 변수가 포함되어 있는 템플릿 파일입니다. 템플릿이 저장되어 있는 디렉토리는 객체생성할 때 생성자를 통해 지정되었음을 앞에서 설명하였습니다. 이 디렉토리는 현 웹문서가 종료될 때까지 그대로 유지됩니다. 그러나 때에 따라서는 다른 디렉토리에 있는 템플릿을 읽어올 필요도 있을 것입니다.
[code php;gutter:false] $tpl = new hTemplate('/public/templates'); $tpl->define( array( 'main' => 'main.htm', 'table' => './templates/dynamic.htm' ) ); [/code]
템플릿 파일 main.htm은 /public/templates에서 찾게 되며, dynamic.htm은 ./templates/에서 찾게 됩니다.
define() 함수 사용할 때 주의할 점
버전 0.0.1에서는 assign() 함수가 나타난 이후에는 define() 함수를 사용하여서는 안됩니다. assign() 함수 이후에 define() 함수가 나타나면 이전에 assign으로 할당된 템플릿 변수가 모두 지워져 버립니다.
버전 0.0.2부터는 assign() 함수가 나타난 이후에도 define() 함수를 사용할 수 있도록 수정하였습니다. 그러나 FastPrint() 함수 이후에는 define() 함수를 사용할 수 없습니다.
버전 1.0.0부터는 FastPrint() 함수 이후에도 define() 함수를 제한없이 사용할 수 있습니다.
버전 1.2.0부터는 FastPrint() 함수가 output() 함수로 대치되었으며, 따라서 output() 함수 이후에도 define() 함수를 제한없이 사용할 수 있습니다.
템플릿 문자열 처리하기
때에 따라서는 템플릿 파일 대신에 rFastTemplate의 define_raw()와 같이 템플릿 변수가 포함된 문자열을 지정할 수 있습니다. DB 등에 저장되어 있던 템플릿 문서를 DB로부터 읽어와 define() 함수를 통해 컴파일할 수 있습니다. 1.0.0 버전에서 제안되었던 기능으로 1.2.0 버전부터 정식으로 사용할 수 있습니다.
define(템플릿명, 템플릿 문자열, 환경설정)
이와같이 템플릿 문서가 파일이 아닌 문자열에 포함되어 처리하는 기능을 NO파일(no-file) 용법이라 합니다.
후키템플릿 1.0.0~1.1.1p3 버전에서 제안되었던 NO파일 용법에 대한 문법적인 내용이 1.2.0 버전에서는 아래와 같이 대폭 변경되어 정식으로 제공됩니다. 1.2.0 버전에 포함된 NO파일 용법은 1.0.0 버전부터 1.1.1p3 버전까지 제안되었던 용법과는 상당히 다르므로 이 용법을 사용하여 홈페이지 문서를 작성하셨던 분은 주의하시기 바랍니다.
NO파일 용법에 대한 자세한 사용법은 7.8.no-file 용법을 참조바랍니다.
허용필터명령 지정하기
허용필터명령을 지정하지 않으면 모든 필터명령을 제한없이 사용할 수 있습니다. 기타 필터명령에 대한 자세한 사용법은 "8.필터처리"에 있습니다.
[code php;gutter:false] $tpl->define('main', 'main.htm', array( 'allow_filter' => 'func_a, func_b, func_c, =' ) ); [/code]
자동 캐시 갱신 설정하기
템플릿 문서가 수정되었을 때 수정된 템플릿 문서에 해당하는 캐시를 자동으로 갱신해 줍니다. 1.2.0 버전부터는 후키템플릿툴 클래스 파일이 수정되면 현재 실행중이 PHP 문서에 해당하는 템플릿 문서에 해당하는 정적캐시를 자동으로 갱신해 줍니다. 만약 사용자가 작성한 임의의 php 문서를 자동 갱신 범주에 포함하고 싶다면 아래와 같이 이 문서 내에 define() 함수를 이용하여 자동으로 캐시하도록 설정할 수 있습니다.
[code php;gutter:false] <?php $tpl->define(__FILE__); ?> [/code]
후키템플릿 객체를 생성한 문서 또는 define() 함수를 수행한 문서는 위와 같이 수동으로 자동 캐시 갱신을 설정하지 않더라도 해당 문서가 수정되면 캐시를 자동으로 갱신합니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:18
written: Jan 28 2002
last modified: Sep 20 2006
객체 생성 및 소멸
생성자(constructor)
객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 아래와 같이 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 명령 정보가 있습니다. 이 중에 필터 명령 정보는 1.2.0 버전에서 추가되었습니다.
$tpl = new hTemplate(
템플릿 파일 기본 디렉토리,
캐시정보,
컴파일정보,
필터정보
);
각 인수는 모두 생략할 수 있으며 생략하게 되면 각 인수마다 기본으로 지정된 기본값으로 동작하게 됩니다.
각 인수에 관한 상세한 내용은 '환경설정' 메뉴를 살펴보시기 바랍니다.
[code php;gutter:false] $tpl = &new hTemplate; [/code]
객 체생성을 위한 new 연산자 앞에 있는 기호 &는 PHP 4.0.4부터 지원하는 참조(레퍼런스) 기능입니다. 참조(레퍼런스)에 대한 자세한 것은 상단메뉴의 "class & object >> 참조(reference)"를 참조하기 바랍니다.
zend 엔진 1.0에서는 객체를 참조가 아닌 값으로 취급하도록 설계되어 있어서 변수에 값을 할당하거나 함수에 인수를 전달하는 것과 같은 조작을 할 때 항상 객체 복사 과정이 따르게 됩니다. 이는 스크립트 동작에 다소 부담이 되고 있어 zend 엔진 2.0에서는 객체를 다룰 때 값이 아닌 참조로 다루도록 변경되었습니다. 따라서 zend 엔진 2.0이 탑재된 PHP 5.0.0 dev에서는 아래와 같이 참조연산자 &를 생략하더라도 $tpl은 생성된 객체에 대한 복사본이 아닌 참조로 설정됩니다.
[code php;gutter:false] $tpl = new hTemplate;[/code]
 zend 엔진 2.0에 대한 자세한 것은 제 홈페이지 메뉴 "class & object >> Zend2 객체모델"를 참조하기 바랍니다.
shutdown 콜백함수 및 소멸자(destructor)
shutdown 콜백함수 또는 소멸자에서는 현재 문서에 대한 템플릿 정보를 캐시합니다.
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()로 지정된 콜백함수 내에서 캐시합니다.
후키템플릿 클래스의 객체가 여러 개 생성되었을 때는 처음 생성된 객체의 shutdown 콜백함수 또는 소멸자에서만 캐시핸들러가 동작합니다.
zend 엔진 1.0일 때 대부분의 경우에는 new 연산자를 통해 반환된 $tpl이 객체의 복사본이더라도 별 문제는 발생하지 않습니다. 그러나 소멸자를 흉내내기 위해 생성자 내에서 register_shutdown_function()을 이용하여 콜백함수로 설정된 클래스 멤버함수 내에서 $this 객체를 이용할 때는 매우 미묘한 문제(?)가 발생하게 되며 이로 인하여 정상적으로 객체를 다룰 수 없게 됩니다. 이러한 미묘한 문제를 만나지 않으려면 객체를 생성, 대입 등을 할 때 반드시 참조로 다루어야 합니다.
반면 zend 엔진 2.0에서는 객체가 참조로 다루어지므로 이러한 문제가 근본적으로 발생하지 않습니다.
객체 생성을 여러번 하는데 따른 문제점
1.0.0 버전부터는 한 문서에 몇개의 객체를 생성하든지 상관없이 한 객체를 가지고 처리하는 것과 동일하게 처리합니다. 이를 위하여 현재 템플릿 정보 리스트 및 템플릿 변수 리스트를 정적 멤버 변수(?)에 저장하도록 수정하였습니다.
앞에서 객체 생성할 때 후키템플릿 클래스의 생성자로 전달하게 되는 정보로는 템플릿 파일 기본 디렉토리, 캐시 정보, 컴파일 정보 및 필터 정보가 있다고 하였습니다.
한 문서에서 객체를 여러 번 생성할 때에는 처음 생성된 객체에서 지정한 캐시 정보, 컴파일 정보 및 필터 정보만 유효하며 두번째부터는 이 정보들을 무시합니다. 반면에 템플릿 파일 기본 디렉토리는 각 객체마다 독립적으로 지정할 수 있으며, 추가로 지정된 기본 디렉토리 정보는 기본 디렉토리 정보를 저장하고 있는 배열에 추가됩니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:15
written: Jan 28 2002
last modified: Sep 20 2006
제공함수 목록
< 제공 함수 목록 >
분류 함수명 기능
초기화 생성자 템플릿 파일 기본 디렉토리 설정 HTML 파서 관련 환경설정 캐시 핸들러 관련 환경설정 필터 명령 관련 환경설정(1.2.0 버전부터)
마무리 shutdown 콜백함수 캐시 저장
템플릿 define 템플릿 파일 읽기,템플릿 구조 분석
템플릿 변수 assign 템플릿 변수에 값 할당
get_assigned 템플릿 변수값 가져오기
출력 output 템플릿 변수값 출력
output() 함수는 1.2.0 버전부터 제공되는 함수로 이전 버전에서의 FastPrint() 함수의 모든 기능을 가지고 있으며 아울러 1.2.0 버전부터 제공되는 새로운 기능들이 추가로 포함되어 있습니다.
각 함수의 사용방법은 FastTemplate의 사용방법과 거의 유사하기 때문에 FastTemplate를 사용해 본 적이 있는 분은 별 어려움없이 후키템플릿을 사용할 수 있을 것입니다.
제 홈페이지에서는 hFastTemplate 클래스에서 제공하는 함수에 대하여는 설명하지 않습니다. hFastTemplate 클래스에서 제공하는 함수의 사용법은 FastTemplate의 사용방법과 동일합니다.
미정의된 템플릿 변수 처리 방법
0.0.1 버전에서는 미정의된 템플릿 변수가 있으면 에러메시지를 발생시키도록 되어 있었으나 0.0.2 버전부터는 모두 null 처리하였으며 에러메시지를 발생시키지 않으니 주의하시기 바랍니다. 이는 마치 FastTemplate에서 no_strict 함수를 이용하는 것과 같은 효과를 얻게 됩니다.
간단한 사용예제
[code php;gutter:false] include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('list', 'listform.htm'); $tpl->assign('TITLE', 'hwooky Template Testing...'); $tpl->assign('MAIN', 'list'); $tpl->output('MAIN'); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:10
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 캐시 정보 디버깅
개발과정에서 캐시와 관련된 여러가지 정보를 실시간으로 확인할 수 있는 디버깅 기능을 1.2.0 버전에 새로이 추가하였습니다.
이 기능을 이용하면 현재 페이지가 생성되기까지의 과정을 캐시와 관련하여 살펴볼 수 있으며 각 템플릿 파일의 변경 여부 등을 알 수 있습니다.
템플릿 캐시 정보를 보려면
아래와 같이 output() 함수에 배열 인수로 "-cache"를 지정합니다.
[code php;gutter:false] output( array( '-cache' ) );[/code]
그러면 현재의 브라우저에 나타난 홈페이지 문서와 관련된 캐시 정보를 아래와 같이 볼 수 있습니다.
<그림1> 템플릿 캐시 정보
템플릿 캐시 정보는 크게 보면 캐시 관련 파일들에 대한 각각의 정보와 캐시 및 템플릿 처리 과정을 나타내는 정보로 구분됩니다.
첫번째 정보로 제공된 캐시 관련 파일(Cache Related Files;CRFs) 정보는 4부분으로 구분됩니다.
① LIBRARY - 후키템플릿툴 클래스 파일
② DOCUMENT - php 스크립트 문서]
③ TEMPLATE - 템플릿 문서
④ INCLUDE - 인클루드 파일
각 캐시 관련 파일에 대한 정보로는 웹루트로부터 시작되는 파일스펙("디렉토리/파일명"), 파일수정일시(file modified time), 파일수정여부 및 캐시형식(cache type)이 있습니다.
만약 디버깅 정보 전부가 아닌 일부 캐시 관련 정보에 대하여만 보고 싶다면 아래와 같이 보고싶은 정보 항목을 명시적으로 지정하면 됩니다.
[code php;gutter:false] $tpl->output( array( '-cache DOCUMENT' ) );[/code]
두번째 정보인 "캐시 및 템플릿 처리 과정(Static Cache & Template Processing Flow)에 관한 정보는 HTML 문서가 생성하기까지의 과정을 아래와 같이 5개의 단계로 나누어 각 단계에서의 캐시 상태를 알려줍니다.
<표1> Static Cache & Template Processing Flow
1단계
cache file
2단계
initial routine
3단계
processing routine
4단계
shutdown routine
5단계
cache file
no exist nothing template compile all templates create cache exist
exist read cache no compile no update cache exist
compile some template files clear cache no exist
some template files are modified compile all templates update cache exist
1단계로 캐시파일의 존재여부를 나타냅니다. 캐시파일이 존재하면 "exist", 존재하지 않으면 "nothing"가 표시됩니다.
2단계로 템플릿툴이 시작되는 초기화 단계에서 해당 템플릿 정보가 없으면 "nothing template", 템플릿 정보를 캐시로부터 읽어들였으면 "read cache", 하나 이상의 템플릿 문서가 수정된 것이 확인되었으면 "some template files are modified"라고 표시됩니다.
3단계로 define() 함수를 수행하면서 각 템플릿을 어떻게 처리했는지는 나타냅니다. 캐시파일이 없었거나 CRFs(캐시관련파일)에 등록된 파일 중 일부가 변경되었다면 모든 템플릿 문서를 다시 컴파일하게 되고 이때는 "compile all templates"라고 표시되며, 변경된 템플릿 파일이 전혀 없었다면 "no compile", CRFs(캐시관련파일)에 등록된 파일 이외의 템플릿 파일이 변경되는 등 프로그램 수행 중간에 템플릿 파일 변경이 확인될 때는 변경이 확인된 템플릿 파일 만 다시 컴파일 하며 이 때는 "compile some template files"라고 표시됩니다.
4단계는 모든 프로그램 수행을 마치고 register_shutdown_function()로 지정된 콜백함수를 실행할 때 컴파일된 템플릿 정보를 어떻게 처리했는가를 나타내줍니다. 처음부터 캐시에 없었다면 새롭게 컴파일된 템플릿 정보를 모두 캐시하며 "create cache"라고 표시됩니다. 변경된 템플릿이 하나도 없었다면 기존에 저장되어있던 캐시를 그대로 놔두며 "no update cache"라고 표시됩니다. 앞단계에서 CRFs(캐시관련파일)에 등록된 파일 중 일부 파일이 변경되어 모든 템플릿을 다시 컴파일하여 "compile all templates"라고 표시되었다면 기존의 캐시를 지우고 새롭게 컴파일한 템플릿 정보를 캐시하며 이때는 "update cache"라고 표시됩니다.
4단계에서 가장 처리하기 힘든 부분이 앞단계에서 CRFs(캐시관련파일)에 등록된 파일 이외의 템플릿 파일이 변경되는 등 프로그램 수행 중간에 템플릿 파일 변경이 확인될 때는 변경이 확인된 템플릿 파일 만 다시 컴파일 하며 이 때는 "compile some template files"라고 표시된 경우입니다. 이 경우에는 현재 컴파일된 템플릿 정보가 혹시 잘못 작성될 수 있는 가능성이 1%라도 있을 수 있다는 생각에 컴파일된 템플릿 정보를 캐시에 기록하지 않으며 기존에 저장되어 있던 캐시도 말끔히 지워버립니다. 이에 따라 다음 차수에 현 홈페이지 문서를 로딩할 때 처음부터 다시 컴파일할 수 있도록 해줍니다. 이 경우에 4단계에 "clear cache"라고 표시됩니다.
5단계에서는 앞 단계가 캐시를 지운 "clear cache" 상태라면 현 홈페이지 문서에 대한 프로그램이 종료된 후 캐시가 존재하지 않으므로 "no exist"라고 표시되며, 그렇지 않으면 캐시가 존재하므로 "exist"라고 표시됩니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 08:51
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 구조 정보 디버깅
개발과정에서 컴파일된 템플릿 구조 정보를 실시간으로 확인할 수 있는 디버깅 기능을 1.0.0 버전에 새로이 추가하였습니다.
이 기능을 이용하면 define() 메소드를 통해 템플릿 문서의 내용이 어떻게 컴파일되어 템플릿 구조로 저장되어 있나를 알 수 있으며 아울러 각 템플릿 문서별로 선언되어 있는 템플릿 변수의 초기 상태를 확인할 수 있습니다.
모든 템플릿 구조 정보를 출력할 때
define() 메소드에 의해 컴파일된 템플릿 구조 정보를 확인하려면 아래와 같이 output() 함수(1.2.0 이전 버전에서는 FastPrint() 함수)에 배열 인수로 "-template" 지정합니다.
[code php;gutter:false] output( array( '-template' ) );[/code]
그러면 이 문장이 나타난 행까지 define() 메소드에 의해 컴파일된 모든 템플릿 구조 정보를 아래와 같이 웹 브라우저에 출력해 줍니다.
<그림1> 모든 템플릿 구조 정보
템플릿 구조 정보는 크게 보면 template type, parent, child 등을 나타내는 헤더 정보와 group, subgroup, value를 나타내는 본문 정보로 구분됩니다. 헤더 정보와 본문 정보에 대한 자세한 것은 아래에서 별도의 항목으로 설명하겠습니다.
일부 템플릿 구조 정보만 출력할 때
만약 모든 템플릿 구조가 아닌 일부 템플릿 구조에 대하여만 보고싶다면 아래와 같이 보고싶은 템플릿명만을 명시적으로 지정하면 됩니다.
[code php;gutter:false] $tpl->define('body', './templates-2/home.htm'); . . . $tpl->output( array( '-template body' ) );[/code]
"body"는 define() 메소드에서의 첫 번째 인수에 지시한 템플릿명을 의미합니다. 그러면 템플릿 파일 "./templates-2/home.htm"에 선언된 모든 템플릿 구조 정보를 아래와 같이 웹 브라우저에 출력해 줍니다.
<그림2> 일부 템플릿 구조 정보
헤더 정보
헤더 정보에는 아래와 같이 5가지 정보에 대하여 분류되어 나타납니다.
<표1> 헤더 정보
분 류 기 능 나타나는 값
template type 템플릿 형식 FILE, NOFILE, BLOCK, INCLUDE
parent 부모 템플릿명 (예)main
child 자식 템플릿명 (예)block_info_menu
template file 템플릿 파일명 (예)./templates/main.htm
filemtime 템플릿 파일의 최종 수정시간 (예)2003년 03월 27일 12:02:52
템플릿 형식(template type)
1.0.0 버전에서 나타날 수 있는 템플릿 형식은 "FILE", "NOFILE", "BLOCK", "INCLUDE"입니다.
"FILE"은 템플릿 파일로부터 컴파일된 템플릿 구조 정보임을 나타냅니다. 아래와 같은 경우를 살펴보면 템플릿 구조 정보 "main"의 템플릿 형식은 "main.htm"으로부터 컴파일되었으므로 "FILE"로 나타납니다.
[code php;gutter:false] $tpl->define('main', 'main.htm');[/code]
"NOFILE"은 rFastTemplate의 define_raw()와 같이 템플릿 구조 정보가 템플릿 파일이 아닌 문자열로부터 얻었음을 나타냅니다. 이러한 기능을 후키템플릿에서는 no-file 용법이라 부르며 자세한 것은 "define()" 메뉴를 참조바랍니다.
"BOLCK"은 블록변수(다이나믹 블록)로부터 분리된 템플릿 구조 정보를 의미합니다. 예를 들어 아래와 같은 블록변수(다이나믹 블록)가 템플릿 파일 "main.htm"에 포함되어 있다고 가정하겠습니다.
[code html;gutter:false] <!-- BEGIN DYNAMIC BLOCK: block_info_menu --> {CONTENTS} <!-- END DYNAMIC BLOCK: block_info_menu -->[/code]
이 때 템플릿 파일 "main.htm"을 define() 메소드를 이용하여 컴파일하게 되면 아래 <그림3>에서와 같은 템플릿 구조 정보 "block_info_menu"에 대한 결과를 얻을 수 있습니다.
<그림3> 템플릿 형식(template type) "BLOCK"
"INCLUDE"는 파일변수(인클루드문)로부터 분리된 템플릿 구조 정보를 의미합니다.
부모 및 자식 템플릿(parent & child template)
예를 들어 아래와 같은 블록변수(다이나믹 블록)가 템플릿 파일 "main.htm"에 포함되어 있다고 가정하겠습니다.
[code html;gutter:false] <!-- BEGIN DYNAMIC BLOCK: sub-1 --> <!-- BEGIN DYNAMIC BLOCK: sub-2 --> <!-- BEGIN DYNAMIC BLOCK: sub-3 --> <!-- BEGIN DYNAMIC BLOCK: sub-4 --> <!-- BEGIN DYNAMIC BLOCK: sub-5 --> {CONTENTS} <!-- END DYNAMIC BLOCK: sub-5 --> <!-- END DYNAMIC BLOCK: sub-4 --> <!-- END DYNAMIC BLOCK: sub-3 --> <!-- END DYNAMIC BLOCK: sub-2 --> <!-- END DYNAMIC BLOCK: sub-1 -->[/code]
이 때 템플릿 파일 "main.htm"을 define() 메소드를 이용하여 아래와 같이 컴파일하였다고 가정합니다.
[code php;gutter:false] $tpl->define('main', 'main.htm');[/code]
컴파일 후 템플릿 구조 정보에 대하여 디버깅하면 각 템플릿 "main", "sub-1", "sub-2", "sub-3", "sub-4", "sub-5"에 나타나는 부모 및 자식 템플릿 명을 아래와 같습니다.
<표2> 부모 및 자식 템플릿
템플릿 템플릿 형식 부모 템플릿 자식 템플릿
main FILE 없음 sub-1
sub-1 BLOCK main sub-2
sub-2 BLOCK sub-1 sub-3
sub-3 BLOCK sub-2 sub-4
sub-4 BLOCK sub-3 sub-5
sub-5 BLOCK sub-4 없음
이와 같이 템플릿 구조 정보는 양방향성을 가진 Linked List 구조로 되어있습니다.
템플릿 파일(template file)
이 정보는 템플릿 형식이 "FILE"인 경우에만 나타나며, 컴파일된 템플릿 파일명을 나타냅니다.
템플릿 파일의 최종 수정시간(template file's modification time)
이 정보는 템플릿 형식이 "FILE"인 경우에만 나타나며, 컴파일된 템플릿 파일이 최종적으로 수정된 시간을 나타냅니다. 캐시에 있는 이 시간과 실제 템플릿 파일의 수정시간을 비교하여 캐시의 갱신여부를 결정합니다.
본문 정보
첫 행 group은 템플릿 구조 정보를 <!DOCTYPE> 태그 내용, <HEAD>~</HEAD>의 내용, <BODY> 태그 속성 내용, <BODY>~</BODY>의 내용으로 분류하여 보여줍니다.
본문 정보에는 아래와 같이 4가지 정보에 대하여 대분류(group)되어 나타납니다. 이 외에도 후키템플릿의 내부에서만 사용되는 내부 정보가 있으나 내부 정보는 디버깅할 때 나타나지 않습니다.
<표3> 본문 정보
group 분류 기 능 subgroup 분류
doctype_tag <!DOCTYPE> 태그 내용 *reserved
head_contents <HEAD>~</HEAD> 사이의 내용 TITLE META_content-type META_author META_keywords META_description LINK_속성 href의 값 SCRIPT SCRIPT_속성 scr의 값 STYLE
body_tag <BODY> 태그의 속성값 topmargin leftmargin marginwidth marginheight 기타 <BODY> 태그의 속성명
body_contents <BODY>~</BODY> 사이의 내용 html source, variable
doctype_tag
<!DOCTYPE> 태그 내용을 나타내며 템플릿 파일에 있는 내용 그대로 값으로 저장됩니다. subgroup은 없으며 value 항목에는 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">와 같이 태그 내용을 그대로 가지고 있습니다.
<!DOCTYPE> 태그가 2개 이상의 템플릿 파일에서 나타나는 경우에는 처음 나타나는 <!DOCTYPE> 태그 내용만 유효하며 나머지는 무시됩니다.
head_contents
group "head_contents"는 <HEAD>~</HEAD> 사이의 내용을 나타내며 그 내용이 다시 TITLE, META, LINK, SCRIPT 별로 분류되어 저장됩니다. META 태그는 속성 name값을 덧붙여 subgrouping하며, LINK는 속성 href값을 덧붙여 subgrouping합니다. 그 외에도 subgroup은 태그 종류에 따라 다양하게 나타나게 됩니다.
body_tag
group "body_tag"는 <BODY> 태그 속성 내용을 나타내며 subgroup은 <BODY> 태그의 속성명으로 분류됩니다. 여러개의 파일에서 속성이 중복되어 나타나는 경우에는 처음 나타나는 속성에 대하여만 유효하며 나머지는 무시됩니다.
body_contents
마지막 group인 "body_contents"는 <BODY>~</BODY>의 내용을 나타내며 대부분 가장 많은 내용을 담고 있으며 템플릿 구조 정보의 가장 핵심적인 내용이라 할 수 있습니다. 다른 group과는 달리 기록하는 방법이 좀 특이합니다.
<BODY>~</BODY> 사이의 내용이 템플릿 변수를 기준으로 그 내용이 분리되어 기록되기 때문에 "html source"와 "variable"이 계속 교차되어 나타납니다. 예를 들어 아래와 같은 템플릿 파일이 있다고 가정하겠습니다.
[code html;gutter:false] <BODY> <P>실험용 소스:{VALUE1}/{VALUE2}</P> </BODY>[/code]
이 때 이 템플릿 파일을 define() 메소드를 이용하여 컴파일하게 되면 "body_contents"은 아래와 같이 나타날 것입니다.
<그림4> body_contents 구조
위와 같이 body_contents 구조 정보는 HTML 소스와 템플릿 변수가 번갈아 가며 나타납니다.
위에서 <!--hwooky HTML Parser 1.2.0-->부분은 hHtmlParser 클래스를 이용하여 템플릿 파일을 파싱하는 과정에서 추가된 주석으로 원래 템플릿 파일에는 없는 내용입니다.
템플릿 변수의 초기값 상태
<그림4>을 보면 각 템플릿 파일마다 선언된 템플릿 변수들이 템플릿 구조 정보 하단에 나타나 있는 것을 볼 수 있습니다. 여기서 나타나는 템플릿 변수 정보는 템플릿 파일에 선언된 초기값을 보여줍니다. 앞에서 살펴보았지만 "-variable"를 가지고 출력되는 템플릿 변수 정보가 assign() 메소드로 할당된 결과를 보여주는 것과는 다르지요. 만약 assign() 메소드로 그 값을 변경한 일이 없다면 양 쪽에 나타나는 템플릿 변수의 값은 동일하겠지요.
[1.0.0 beta]각 템플릿 파일별로 선언된 템플릿 변수의 초기 상태는 캐시를 갱신할 때만 확인할 수 있습니다. 왜냐하면 캐시에는 각 템플릿 변수에 대한 초기 상태가 기록되지 않습니다. 각 템플릿 변수에 대한 초기 상태는 템플릿 파일을 갱신할 때만 임시로 생성되는 정보입니다.
따라서 템플릿 파일에 선언된 템플릿 변수의 초기 상태를 출력하고자 원한다면 디버깅할 때마다 반드시 캐시를 같이 갱신하시기 바랍니다. 즉, 후키 템플릿 객체를 생성할 때 지시하는 캐시정보에서 "update" 속성을 반드시 true로 설정든지 아니면 캐시 디렉토리에서 해당 캐시를 먼저 삭제하여야 합니다. 그렇지 않으면 해당 템플릿 파일에 존재하는 템플릿 변수는 나타나지 않고 템플릿 구조 정보만 나타납니다.
[1.0.0 정식버전]캐시 갱신 여부와 관계없이 각 템플릿 파일별로 선언된 템플릿 변수의 초기 상태를 확인할 수 있습니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 08:45
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 변수 디버깅
개발과정에서 현재까지 할당된 템플릿 변수의 상태를 실시간으로 확인할 수 있는 디버깅 기능을 1.0.0 버전에 새로이 추가하였습니다.
모든 템플릿 변수 정보를 출력할 때
현재까지 템플릿 변수에 할당된 값을 보여주기 위하여 아래와 같이 output() 함수(1.2.0 이전 버전에서는 FastPrint() 함수)에 배열 인수로 "-variable" 지정합니다.
[code php;gutter:false] output( array( '-variable' ) );[/code]
그러면 이 문장이 나타난 행까지 할당된 모든 템플릿 변수의 상태를 아래와 같이 웹 브라우저에 출력해 줍니다.
<그림1> 모든 템플릿 변수 정보
첫 행에 나타난 BODY, BROWSER_VERSION, COUNTER 등은 템플릿 변수명을 나타내며, 두 번째 행은 할당된 변수값을 보여줍니다. 마지막 행은 해당 템플릿 변수가 선언된 템플릿 파일명을 의미합니다. 템플릿 파일에는 없으나 PHP 소스에서 assign() 메소드를 통해 할당되었거나 템플릿 파일을 컴파일하는 과정에서 내부적으로 추가 생성된 템플릿 변수는 파일명 대신에 "assigned variable"라는 예약어가 출력됩니다.
두 번째 행에 보여주는 변수값은 모두 보여주지는 않고 앞뒤로 50자씩만 보여주며 중간에는 생략된 문자수를 보여줍니다. 위의 예에서 템플릿 변수 BODY의 할당된 값을 보면 중간에 생략된 문자수가 12,176자(영문자 기준)임을 알 수 있습니다.
일부 템플릿 변수 정보만 출력할 때
만약 모든 템플릿 변수가 아닌 일부 템플릿 변수에 대하여만 보고싶다면 아래와 같이 보고싶은 템플릿 변수만을 명시적으로 지정하면 됩니다.
[code php;gutter:false] output( array( '-variable COUNTER MAIN HEAD_TITLE' ) );[/code]
그러면 이 문장이 나타난 행까지 할당된 템플릿 변수 COUNTER, MAIN, HEAD_TITLE의 상태를 아래와 같이 웹 브라우저에 출력해 줍니다.
<그림2> 일부 템플릿 변수 정보
조건변수(스위치문)일 때
조건변수(스위치문)는 일반 템플릿 변수와는 좀 다른 방법으로 처리되고 있습니다.
{SW_VAR::3,첫번째값|두번째값|세번째값} <<<--- 1.1.1 버전까지
{?SW_VAR;;3}첫번째값|두번째값|세번째값{/} <<<--- 1.2.0 버전
예를 들어 템플릿 ./templates/main.htm의 내용이 위와 같은 경우를 생각해 보겠습니다. 위와 같이 switch문 형식의 템플릿 변수가 포함된 템플릿 파일을 아래의 PHP 소스를 이용하여 컴파일해 보지요.
[code php;gutter:false] $tpl->define('main', 'main.htm'); $tpl->assign('SW_VAR', 1); $tpl->assign('MAIN', 'main'); $tpl->output( array( 'MAIN', '-variable SW_VAR' ) );[/code]
위와 같이 output() 함수를 이용하여 템플릿 변수 "SW_VAR"에 대한 할당 상태를 확인하게 되면 아래와 같은 정보를 얻을 수 있습니다.
<그림3> switch문 형식의 템플릿 변수 정보
위의 정보를 분석해 보면 우선 템플릿 파일의 {SW_VAR;;3}첫번째값|두번째값|세번째값{/} 부분은 {*switch_0}로 대치됩니다. 컴파일 과정에서 추가로 생성된 템플릿 변수 {*switch_0}는 상황(case 1, 2, 3)에 따라 세가지 값(첫번째값, 두번째값, 세번째값)을 가질 수 있습니다. 최종적으로 템플릿 변수 {*switch_0}에 세가지 값 중에 어떤 값이 할당되느냐는 템플릿 변수 {SW_VAR} 값이 무엇이냐에 달려있지요. 위의 경우에는 템플릿 변수 {SW_VAR} 값이 초기값은 3이었지만 PHP 소스에서 $tpl->assign("SW_VAR", 1)을 통해 그 값이 재할당되어 1이 되었으므로 {*switch_0}의 값은 "첫번째값"이 됩니다. 결국 {*switch_0}의 값 "첫번째값"이 출력되는 것이지요.
위에서 보면 템플릿 변수 {SW_VAR} 값이 1이라고 나타났으나 만약 PHP 소스에서 $tpl->assign("SW_VAR", 1); 문장을 수행하기 전에 tpl->output(array("-variable SW_VAR")); 라는 문장을 수행하였다면 템플릿 파일에 선언된 초기값 3이 나타났을 것입니다.

Posted by 방글24