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
phpsource/템플릿2006. 9. 15. 09:44
written: Oct 13 2006
필터 정보
$tpl = new hTemplate(템플릿 파일 기본 디렉토리, 캐시 정보, HTML 파서 정보,
array(
'allow_filter' => 필터함수목록
)
);
후키템플릿 생성자의 네 번째 인수로 필터 정보가 전달됩니다.
allow_filter
'allow_filter' => 필터함수목록
생성자에서 지정된 허용필터명령은 모든 템플릿문서에 적용됩니다.
[code php;gutter:false] $tpl = new hTemplate( array( $theme_dir ), array( 'path' => $cache_dir, 'id' => $tpl_id ), array( 'active_tag_lowercase' => false ), array( 'allow_filter' => 'func_a, func_c, func_d, func_e, =' ) ); [/code]
"="를 지정하면 php명령과 전처리명령을 사용할 수 있습니다. "="를 제외한 "func_a", "func_c", "func_d", "func_e"는 허용되는 사용자정의 필터함수를 의미합니다. 필터상수와 내장필터함수는 아무런 제한없이 모든 템플릿문서에서 사용할 수 있습니다.
특별히 허용필터명령을 지정하지 않으면 모든 필터명령(필터상수, php명령, 전처리명령, 사용자정의 필터함수 및 내장필터함수)을 사용할 수 있습니다.
허용필터명령을 지정하지 않을 때
허용필터명령을 지정하지 않으면 모든 필터명령을 제한없이 사용할 수 있습니다.

Posted by 방글24
phpsource/템플릿2006. 8. 2. 13:07
written: Oct 26 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
필터명령 실행시간
필터명령의 실행시간은 아래와 같은 지시자에 의해 변경될 수 있으며, 또한 혼용되어 사용될 수 있습니다.
① initialize
② premacro
③ precompile
④ compile
⑤ postcompile
⑥ preassign
⑦ assign
⑧ postassign
⑨ output
블록변수를 포함한 모든 템플릿변수의 필터명령 실행시간을 정리하면 아래표와 같습니다.
< 필터명령 실행시간 >
실행시간 단순
변수
조건
변수
블록변수 파일변수
tpl txt php tpl txt php
initialize x x x x x o x x
premacro x x x x x o x x
precompile x x o o o o o o
compile x x x x x x x x
postcompile x x o x x o x x
preassign x x o x x o x x
assign @ @ x x x x x x
postassign x x @ @ @ @ @ @
output x x x x x o x x
x : 실행시간 지정불가, o : 실행시간 지정가능, @ : 실행시간 지정가능(default)
tpl=template, txt=text document, php=php script
블록변수/파일변수에 필터명령 실행시간(execute time)을 지정하지 않으면(default 상태) 블록내용/파일내용을 assign한 직 후(postassign)에 필터링합니다. 반면 단순변수/조건변수는 assign할 때 필터링합니다. 이와 같이 각 템플릿 변수별로 실행시간 초기값이 지정되어 있습니다.
위 표의 기준과 다르게 예외적으로 compile 실행시간으로 처리되는 요소들은 아래와 같습니다.
① 필터상수(filter constants)
② 파일변수의 파일명(filename)
③ 내용형식(contents type) ctype이 php일 때에 php 문서에 포함된 템플릿 변수들
④ ctype이 template인 단순변수의 변수내용부분
compile 실행시간은 사용자가 지정할 수 없으며, 템플릿 툴이 내부적으로만 사용하는 실행시간입니다.
필터명령 실행시간을 제어하는 방법
템플릿변수의 필터명령은 각각 아래와 같이 지정합니다.
단순변수일 때 {&변수명;;필터명령}변수내용{/}
조건변수일 때 {?변수명;;필터명령}경우의수{/}
블록변수일 때 {@변수명;;필터명령}블록내용{/}
파일변수일 때 {#변수명;;필터명령}파일명{/}
실행시간에 대한 언급없이 단순히 필터명령만 지정하는 경우 위 표 <필터명령 실행시간> 의 default 실행시간으로 처리됩니다. 이러한 default 실행시간은 아래의 파일변수 예에서와 같이 다른 시간으로 강제 지정할 수 있습니다.
{#FILE;;
initialize {%
    =*include_once('{::_PATH_TO_TPLS}/filter.php');
    =|initialize_skin();
%}
premacro {%
    =|prefilter_macro();
%}
precompile {%
    ={_SELF};
%}
postcompile {%
    =|postfilter_compile();
%}
preassign {%
    =|prefilter_assign();
%}
postassign {%
    =|postfilter_assign();
%}
}./include.htm{/}
사용자정의 필터함수들은 각 실행시간에 해당 필터함수가 실행되기 전에 미리 정의되어 있어야 합니다.
강제 지정할 수 있는 실행시간은 각 변수별로 다릅니다. 각 변수별로 허용되지 않는 실행시간은 지정할 수 없으며, 지정했을 때 1.2.0 버전에서는 실행하지 않고 무시해버리나 향후 버전에서는 강제로 에러를 출력 후 프로그램을 중지시킬 수도 있으니 주의하기 바랍니다.
위의 예제에서 표기된 {_SELF}는 필터 처리할 때 사용되는 미리정의된 템플릿변수로 하위템플릿 파일인 include.htm의 내용을 가지고 있습니다. 이 템플릿 변수에 대한 자세한 정보는 "6.2.미리정의된 템플릿변수"를 참조바랍니다.
필터 FLOW
실행시간 중에 premacro, precompile, compile, postcompile으로 지정되는 필터명령들은 템플릿파일을 컴파일할 때만 수행되며, initialize으로 지정되는 필터명령은 컴파일 유무에 관계없이 define() 함수를 실행하는 초기에 수행되며, preassign, assign, postassign으로 지정되는 필터명령들은 assign() 함수를 실행할 때 수행됩니다.
output으로 지정된 필터명령들은 출력버퍼에 있는 문서를 가지고 최종 HTML 스크립트 문서를 생성할 때 수행됩니다.
< 필터 FLOW >
필터명령 구문 형식
지정할 수 있는 필터명령에는 필터상수, php명령, 전처리명령, 사용자정의 필터함수 및 내장 필터함수가 있습니다. 각각의 필터명령은 아래와 같은 표에 의해 지정됩니다.
< 필터명령 구문 형식 >
종 류 구문 형식
필터상수 {@변수명;;필터상수}내용{/}
php명령 {@변수명;;=php명령}내용{/}
전처리명령 {@변수명;;=*전처리명령}내용{/}
사용자정의 필터함수 {@변수명;;=|사용자정의 필터함수}내용{/}
내장 필터함수 {@변수명;;=>내장필터함수}내용{/}*
{@변수명;;=)내장필터함수}내용{/}
* [주의] - 2006.10.26

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

현재 : {@변수명;;=>내장필터함수}내용{/}
수정(안) : {@변수명;;=)내장필터함수}내용{/}
허용필터명령 지정하기
허용필터명령을 지정할 수 있는 방법은 아래와 같이 세가지입니다.
① 생성자의 네번째 인자로 새롭게 추가된 필터옵션의 allow_filter 키를 통해서
② define() 함수의 세번째 인자인 옵션의 allow_filter 키를 통해서
③ 파일변수(인클루드문)의 변수옵션 allow_filter 키를 통해서
생성자에서 지정된 허용필터명령은 모든 템플릿문서에 적용됩니다.
[code php;gutter:false] $tpl = new hTemplate(디렉토리정보, 캐시옵션, 컴파일옵션, array( 'allow_filter' => 'func_a, func_c, func_d, func_e, =' ) ); [/code]
'=' 문자를 지정하면 php명령과 전처리명령을 사용할 수 있습니다. '=' 문자를 제외한 func_a, func_c, func_d, func_e는 허용되는 사용자정의 필터함수를 의미합니다. 필터상수와 내장필터함수는 아무런 제한없이 모든 템플릿문서에서 사용할 수 있습니다.
특별히 허용필터명령을 지정하지 않으면 모든 필터명령(필터상수, php명령, 전처리명령, 사용자정의 필터함수 및 내장필터함수)을 사용할 수 있습니다.
define() 함수로 지정된 허용필터명령은 해당 define()에 지정된 템플릿 파일에만 적용됩니다. 또한 생성자에서 지정된 허용필터명령이 있을 때는 생성자에서 지정된 허용필터명령 중에서만 지정할 수 있습니다. 생성자에서 지정하지 않은 허용필터명령을 define() 함수에서 지정하더라도 무시됩니다.
[code php;gutter:false] $tpl = new hTemplate(디렉토리정보, 캐시옵션, 컴파일옵션, array( 'allow_filter' => 'func_a, func_c, func_d, func_e, =' ) ); $tpl->define('main', 'filter.htm', array( 'allow_filter' => 'func_a, func_b, func_e, func_f' ) ); [/code]
템플릿 main(템플릿파일 filter.htm)에서는 사용자정의 필터함수 func_a, func_e만 허용되며 사용자정의 필터함수 func_b, func_f와 php명령, 전처리명령은 허용되지 않습니다. 필터상수와 내장필터함수는 역시 제한없이 사용할 수 있습니다.
마지막으로 파일변수(인클루드문)에서의 허용필터명령에 대하여 살펴보겠습니다.
파일변수에서 지정된 허용필터명령은 파일변수에서 지정된 파일에만 적용됩니다. 또한 현재 템플릿 문서가 생성자 또는 define() 함수로 허용필터명령이 지정된 경우에는 지정된 허용필터명령 중에서만 지정할 수 있습니다.
위 define() 함수로 지정된 허용필터명령의 예에 있는 php 스크립트에서 사용하는 템플릿 문서 filter.htm의 내용이 아래와 같은 경우를 살펴보겠습니다.
[code html;gutter:false] <!-- template file : filter.htm -->{#SAMPLE;allow_filter=func_b, func_c, func_e, =; =|func_a(); =|func_b(); =|func_c(); =|func_d(); =|func_e(); ="[[["."{_SELF}"."]]]"; }./include.htm{/} [/code]
파일변수 SAMPLE 내에서 허용되는 사용자정의 필터함수는 func_e뿐입니다. 왜냐하면 템플릿파일 filter.htm은 define() 함수에 의해 사용자정의 필터함수 func_a, func_e만 허용되었는데 파일변수 SAMPLE에서는 이 중에 func_e만 일치하고 나머지는 define() 함수에 의해 허용되지 않는 필터함수, php명령, 초기화명령이기 때문입니다. 따라서 파일변수 SAMPLE에서 지정한 많은 필터명령중에 다섯번째 필터명령인 =|func_e();만 정상적으로 수행하고 나머지는 무시해 버립니다.
파일변수 SAMPLE에서 지정된 템플릿파일 include.htm 내에서 또 다른 파일변수가 내포되어 있을 경우에 내포된 파일변수에서는 파일변수 SAMPLE에서 허용되는 func_e 함수만 필터명령으로 사용할 수 있습니다.
이와같이 파일변수가 중첩되었을 때는 허용필터명령이 하위 파일변수로 연속적으로 전달되어 허용필터명령을 제한하게 됩니다.
허용필터명령에 와일드카드 사용하기
허용필터명령을 지정할 때 아래와 같은 세가지 와일드카드 문자를 통하여 여러개의 필터명령을 한번에 지정할 수 있습니다.
① The asterisk(*) represents a whole word or a group of characters.
② The question mark(?) represents a single character.
③ The exclamation mark(!) is a character to deny filter functions.
* 문자는 해당 문자가 없거나 하나 이상의 문자(anything or nothing) 대신에 사용될 수 있습니다. 예를 들어 func_*는 func_a, func_b, func_aaa를 모두 나타내며 * 문자 위치에 아무 문자도 없는 func_으로도 나타낼 수 있습니다.
? 문자는 임의의 한 문자(any single character)를 대표해서 나타내며, ?는 a 또는 b 또는 6과도 일치합니다. 그러나 * 문자와는 달리 반드시 하나의 문자가 있어야 합니다. 예를 들어 func_?는 func_a, func_b와는 일치하지만 func_와는 일치하지 않습니다.
! 문자는 지정된 필터명령을 허용하지 않을 때 사용하는 논리적 부정의 의미를 가진 문자입니다. !가 없으면 허용필터명령(allow filter)이 되는 것이고, !가 앞에 있으면 불허필터명령(deny filter)이 되는 것입니다. 만약 func_*에 해당하는 필터명령들을 허용하지 않으려면 !func_*와 같이 맨 앞에 ! 문자를 덧붙이기만 하면 됩니다.
허용필터명령에 일치하지 않는 필터함수 처리
아래와 같이 허용필터명령을 지정하는 4가지 예에서 필터함수명이 일치하지않는 필터함수를 어떻게 처리하는지 살펴보겠습니다.
① {#FILE;allow_filter=func_a, func_b, func_c}./test.htm{/}
② {#FILE;allow_filter=!func_a, !func_b, !func_c}./test.htm{/}
③ {#FILE;allow_filter=func_a, !func_b, func_c}./test.htm{/}
④ {#FILE;allow_filter=func_a, func_b, !func_c}./test.htm{/}
첫번째 예에서는 지정된 func_a, func_b, func_c는 모두 허용필터함수들이며, 두번째 예에서 지정된 func_a, func_b, func_c는 모두 불허필터함수들이며, 세번째와 네번째는 허용필터함수와 불허필터함수가 혼재되어 있으며 차이점은 마지막으로 지정된 필터함수가 허용필터함수냐 불허필터함수냐는 것입니다.
지정된 필터명령과 일치하지 않는 func_d라는 함수가 있다면 각 경우에 func_d 함수는 어떻게 처리될까요? 결론부터 말씀드리자면 첫번째와 세번째 예에서는 실행되지 않고 두번째와 네번째 예에서는 실행됩니다.
실행하느냐 하지않느냐의 기준이 되는 것은 마지막으로 지정된 필터명령이 허용필터명령이냐 불허필터명령이냐 하는 것입니다. 마지막 필터명령이 허용필터명령이면 일치하지 않는 필터명령들은 불허필터명령이 되는 것이고 아니면 허용필터명령이 되는 것입니다.
세번째와 네번째 예는 아래와 같이 작성하여도 같은 결과를 얻을 수 있습니다.
③ {#FILE;allow_filter=func_a, func_c}./test.htm{/}
④ {#FILE;allow_filter=!func_c}./test.htm{/}

Posted by 방글24
phpsource/템플릿2006. 8. 1. 09:31
written: Sep 20 2006
템플릿 변수값을 출력버퍼에 저장하기
output(변수명)
이 함수는 템플릿 변수에 저장되어 있는 HTML 스크립트를 템플릿출력버퍼에 저장하는 기능을 담당합니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); [/code]
위와 같은 경우에 output() 함수는 템플릿 변수 MAIN의 값을 출력버퍼에 저장합니다. 출력버퍼에 저장된 HTML 스크립트는 register_shutdown_function() 함수로 지정된 콜백함수가 실행될 때 브라우저로 전송됩니다.
HTML 스크립트를 출력버퍼에 저장하기
output(HTML스크립트)
output() 함수에 HTML 스크립트를 직접 지정하여 출력버퍼에 그 값을 저장할 수 있습니다.
[code php;gutter:false] $tpl->output('<p>HTML스크립트</p>'); [/code]
위와 같이 output() 함수를 이용하여 HTML 스크립트를 직접 출력버퍼에 저장할 수 있습니다. 단, 기존에 디버깅을 위해 사용되던 예약어인 '-variable', '-template', '-cache'와 블록변수명으로 사용된 단어들은 지정할 수 없습니다.
output() 함수에서 지정된 HTML 스크립트는 후키템플릿의 자체 출력버퍼(템플릿출력버퍼)를 이용하며, 템플릿출력버퍼에 저장된 HTML 스크립트는 프로그램이 종료될 때 브라우저로 전송됩니다. 또한 템플릿 객체 생성후에 print 또는 echo 함수를 이용하여 출력된 HTML 스크립트들도 모두 자체 출력버퍼에 저장된 후 HTML 스크립트보다 나중에 브라우저로 전송됩니다.
따라서 get_assigned() 함수에서 획득한 HTML 스크립트를 순서대로 브라우저로 전송하려면 print 또는 echo 함수를 이용하면 안되며, 반드시 output()함수를 이용하시기 바랍니다.
[code php;gutter:false] $tpl->output($tpl->get_assigned('MAIN')); [/code]
output() 함수를 이용한 디버깅
아래와 같이 output() 함수의 배열인수를 통해 "-variable", "-template", "-cache"를 지정하면 템플릿 변수 정보, 템플릿 구조 정보, 템플릿 캐시 정보를 얻을 수 있습니다. 수집된 정보들은 HTML 스크립트와 마찬가지로 출력버퍼에 저장되며, 프로그램이 종료된 후 브라우저로 전송합니다.
[code php;gutter:false] $tpl->output( array( '-variable', '-template', '-cache' ) ); [/code]
-variable
현재까지 할당되어 있는 템플릿변수에 대한 정보를 수집합니다.
-template
현재까지 템플릿파일로부터 읽고 파싱된 템플릿 구조에 대한 정보를 수집합니다.
-cache
1.2.0 버전부터 제공되며, 캐시관련 정보를 수집합니다.
만약 디버깅 정보 전부가 아닌 일부 템플릿 변수(또는 템플릿 구조 정보, 캐시 관련 정보)에 대하여만 보고 싶다면 아래와 같이 보고싶은 정보 항목을 명시적으로 지정하면 됩니다.
[code php;gutter:false] $tpl->output( array( '-variable PAGEVIEWS HEAD_TITLE COUNTER', '-template MAIN', '-cache DOCUMENT' ) ); [/code]
이 기능에 대한 좀 더 자세한 정보는 "2.2.템플릿 변수 정보", "2.3.템플릿 구조 정보", "2.4.템플릿 캐시 정보"를 참조바랍니다.
헤더태그 내용의 출력 순서
헤더 이전 및 헤더에 포함된 태그의 출력순서는 아래와 같습니다.
[code html;gutter:false] <!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-kr"> <meta name="Generator">와 같은 메타 태그 기타 헤더 태그 </head> <body .....> [/code]
기타 헤더 태그 내용의 출력순서는 output() 함수로 처리한 순서대로 출력버퍼에 저장되며, 동일한 태그가 중복되어 나타나는 경우에는 첫번째 처리한 태그가 출력됩니다.
INCLUDE 파일이나 get_assigned() 함수로 획득한 템플릿 스크립트(서브 템플릿 스크립트)에 포함된 헤더태그 내용은 이를 포함하고 있는 메인 템플릿 파일(메인 템플릿 스크립트)에 포함된 헤더태그 내용 뒤에 추가됩니다. 한 파일 내에 포함된 서브 템플릿 스크립트가 여러 개 있을 때는 위쪽에 있는 서브 템플릿 스크립트부터 출력버퍼에 저장됩니다. 헤더태그 내와 바디태그 내 모두에 서브 템플릿 스크립트가 있을 때는 헤더태그 내에 있는 서브 템플릿 스크립트부터 출력버퍼에 저장됩니다.

Posted by 방글24