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