phpsource/템플릿2006. 11. 2. 11:02
written: Jan 28 2002
last modified: Nov 02 2006
후키템플릿은 기본적으로 미리 정의되어 제공되는 템플릿 변수들이 있습니다. 이 템플릿 변수들은 PHP에서 제공되는 수퍼 글로벌 변수(superglobals)와 관련되어 있습니다.
수퍼 글로벌 변수
_SERVER
PHP에서 제공되는 수퍼 글로벌 변수 $_SERVER(또는 $HTTP_SERVER_VARS)는 웹서버에 의해 설정된 환경변수 또는 현재의 스크립트 문서의 실행환경과 관계된 변수들입니다. 수퍼 글로벌 변수 $_SERVER에 의해 제공되는 환경변수들은 웹문서를 작성하는데 필요로 하는 다양한 정보를 담고 있기 때문에 충분히 이해할 필요가 있습니다.
< 생성된 템플릿 변수 목록 >
PHP 변수명 템플릿 변수명 변수값 예
$_SERVER ['DOCUMENT_ROOT'] {_SERVER.DOCUMENT_ROOT} /usr/apache/htdocs
$_SERVER ['HTTP_HOST'] {_SERVER.HTTP_HOST} hosting11.interpia98.net
$_SERVER ['REMOTE_ADDR'] {_SERVER.REMOTE_ADDR} 218.232.68.40
$_SERVER ['REMOTE_PORT'] {_SERVER.REMOTE_PORT} 2111
$_SERVER ['SCRIPT_FILENAME'] {_SERVER.SCRIPT_FILENAME} /my/public_html/t.php
$_SERVER ['REQUEST_URI'] {_SERVER.REQUEST_URI} /~my/t.php?tt=sample
$_SERVER ['SCRIPT_NAME'] {_SERVER.SCRIPT_NAME} /~my/t.php
$_SERVER ['PHP_SELF'] {_SERVER.PHP_SELF} /~my/t.php
위의 목록은 수퍼 글로벌 변수 $_SERVER에서 제공하는 모든 환경변수를 나타내지는 않았습니다. 더 자세한 환경변수에 대하여 관심이 있으면 관련 서적이나 phpinfo() 함수를 사용하여 살펴보시기 바랍니다.
$_SERVER의 환경변수 중에서 "GLOBALS"와 "HTTP_COOKIE"는 템플릿 변수를 생성하지 않고 무시해 버립니다. "GLOBALS"는 PHP 전역변수를 나타내는 것으로 이를 허용하기에는 불필요하게 덩치가 커지게 되며 또한 구현상 약간의 문제가 있어 제외시켰습니다. "HTTP_COOKIE"는 쿠키 정보를 나타내는 것으로 아래에서 설명할 수퍼 글로벌 변수 $_COOKIE와 중복되는 부분이라서 $_SERVER 정보에서는 제외시켰습니다.
수퍼 글로벌 변수 $_SERVER은 PHP 4.2.0부터 제공되는 것으로 이전 버전에서는 $HTTP_SERVER_VARS로 제공됩니다. $HTTP_SERVER_VARS 변수가 PHP 4.2.0에서도 제공되기는 하지만 향후 버전에서의 호환성을 보장하지 않으며 언젠가는 없어질 것으로 보입니다.
그러나 템플릿 변수 {_SERVER......}는 PHP 버전에 관계없이 동일하게 제공됩니다.
위의 환경변수 중에 PHP_SELF의 경우는 실행될 스크립트에 대한 가상 경로를 나타내는 것으로 현 문서에 대한 링크를 표시할 때 많이 사용하고 있습니다. 아래는 이와 관련된 템플릿 변수 {_SERVER.PHP_SELF}을 템플릿 파일에 응용하는 예입니다.
[code html;gutter:false] <A href="{_SERVER.PHP_SELF}?tt=board&tb=PhpclassQnA">물어보세요</A> [/code]
사실 이를 사용자가 직접 PHP 코딩한다는 것은 무척 귀찮은 일입니다. 아시다시피 PHP 4.2.0 부터는 기본적으로 predefined 변수의 경우 global 스코프를 지원하지 않습니다. 즉 $PHP_SELF라는 전역변수를 지원해 주지 않으며 이 변수를 사용하기 위해서는 수퍼 글로벌 변수 $_SERVER를 통해야만 합니다. 이로 인해 PHP 4.2.0 이전 버전에서 잘 동작되는 홈페이지가 PHP 4.2.0 버전으로 업그레이드한 후에 갑자기 동작되지 않는 경험을 많이 하셨을 것입니다.
이는 PHP 개발자가 보안상의 이유로 php.ini의 설정치 register_globals의 값을 off로 개선(?)하였기 때문입니다. 따라서 이전처럼 전역변수 $PHP_SELF를 사용하려면 register_globals의 값을 on으로 수정한 후 php를 다시 실행하세요. 그러나 php.net에서는 보안상 register_globals의 값을 off로 놓고 사용할 것을 추천하네요. 그러니 다소 불편하더라도 보안을 위해 전역변수 대신에 수퍼 글로벌 변수를 이용하는 것이 좋겠지요?
후키템플릿에서는 PHP 버전에 관계없이, 또  register_globals의 설정값에 관계없이 알아서 {_SERVER.PHP_SELF} 값을 지정해 줍니다. 물론 PHP_SELF 외의 다른 환경변수들도 같은 방법으로 지원하지요.
_ENV
PHP에서 제공되는 수퍼 글로벌 변수 $_ENV(또는 $HTTP_ENV_VARS)는 PATH와 같은 환경에 관련된 스크립트에 제공되는 변수들입니다.
< 생성된 템플릿 변수 목록 >
PHP 변수명 템플릿 변수명 변수값 예
$_ENV['PATH'] {_ENV.PATH} /sbin:/bin:/usr/sbin:/usr/bin
$_ENV['COMSPEC'] {_ENV.COMSPEC} C:\\WINDOWS\\COMMAND.COM
$_ENV['SHELL'] {_ENV.SHELL} /bin/bash
위의 목록은 수퍼 글로벌 변수 $_ENV에서 제공하는 모든 변수를 나타내지는 않았습니다. 서버 환경에 따라 제공되는 변수들이 많이 상이합니다. 그러니 현재 웹서버에서 제공되는 변수들을 알고 싶으면 phpinfo() 함수를 사용하여 살펴보시기 바랍니다.
_GET
HTML 폼이 HTTP GET 방식으로 PHP 스크립트로 전송(submit)되었을 때 폼에 있는 모든 내용들이 수퍼 글로벌 변수 $_GET(또는 $HTTP_GET_VARS)에 저장되어 넘어옵니다.
후키템플릿에서는 넘어온 수퍼 글로벌 변수 $_GET(또는 $HTTP_GET_VARS)의 값을 {_GET......} 형태로 된 템플릿 변수로 미리 정의하여 템플릿 파일에 넘겨줍니다.
예를 들어 템플릿문서가 아래와 같을 때 $_GET["tt"]의 값이 "sample"이고 현 스크립트 문서를 나타내는 $_SERVER["PHP_SELF"] 변수가 '/~my/test.php'라고 가정하지요.
[code html;gutter:false] <A href="{_SERVER.PHP_SELF}?tt={_GET.tt}">링크</A> [/code]
위의 템플릿 문서를 후키템플릿으로 해석한 후 output() 함수로 생성된 HTML 문서는 아래와 같습니다.
[code html;gutter:false] <A href="/~my/test.php?tt=sample">링크</A> [/code]
_POST
HTML 폼이 HTTP POST 방식으로 PHP 스크립트로 전송(submit)되었을 때 폼에 있는 모든 내용들이 수퍼 글로벌 변수 $_POST(또는 $HTTP_POST_VARS)에 저장되어 넘어옵니다.
후키템플릿에서는 넘어온 수퍼 글로벌 변수 $_POST(또는 $HTTP_POST_VARS)의 값을 {_POST......} 형태로 된 템플릿 변수로 미리 정의하여 템플릿 파일에 넘겨줍니다.
예를 들어 $_POST["tt"]의 값이 'sample'라면 템플릿 변수 {_POST.tt}를 정의하여 그 값을 'sample'로 지정하여 줍니다.
_FILES
PHP에서 제공되는 수퍼 글로벌 변수 $_FILES(또는 $HTTP_POST_FILES)는 HTTP POST 파일 업로드할 때 업로드하는 파일 정보를 담는데 사용됩니다.
[code html;gutter:false] <FORM action="file-upload.php" method="post" enctype="multipart/form-data"> Send this file: <INPUT type="file" name="upfile"> <INPUT type="submit" value="Send files"> </FORM> [/code]
예를 들어 위와 같은 HTML 폼을 통해 파일 'Autoexec.bat'를 업로드를 하게 되면 file-upload.php 문서로 넘어오는 수퍼 글로벌 변수 $_FILES의 값은 아래와 같습니다(각 항목의 값은 시스템 상황에 따라 다른 값이 나타날 수 있습니다).
[code php;gutter:false] $_FILES['upfile'] = array( 'name' => 'Autoexec.bat', 'type' => 'application/octet-stream', 'tmp_name' => 'c:\apache\php10D5.TMP', 'size' => 177 ) [/code]
수퍼 글로벌 변수 $_FILES(또는 $HTTP_POST_FILES)의 값은 아래와 같이 미리 정의된 템플릿 변수를 생성하여 주게 됩니다.
< 생성된 템플릿 변수 목록 >
PHP 변수명 템플릿 변수명 변수값 예
$_FILES['upfile']['name'] {_FILES.upfile.name} Autoexec.bat
$_FILES['upfile']['type'] {_FILES.upfile.type} application/octet-stream
$_FILES['upfile']['tmp_name'] {_FILES.upfile.tmp_name} c:\apache\php10D5.TMP
$_FILES['upfile']['size'] {_FILES.upfile.size} 177
(참고) 만약 php.ini 파일에 있는 register_globals의 값이 on으로 설정되어 있다면 HTML 폼으로부터 넘어 오는 파일정보는 수퍼 글로벌 변수 $_FILES와 함께 전역변수 $upfile_name, $upfile_type, $upfile, $upfile_size에 담겨져 있을 것입니다.
_COOKIE
PHP에서 제공되는 수퍼 글로벌 변수 $_COOKIE(또는 $HTTP_COOKIE_VARS)를 통해 원격 브라우저에 저장된 쿠키 데이터를 웹문서에 전달합니다.
후키템플릿에서는 전달된 수퍼 글로벌 변수 $_COOKIE(또는 $HTTP_COOKIE_VARS)의 값을 {_COOKIE......} 형태로 된 템플릿 변수로 미리 정의하여 템플릿 파일에 넘겨줍니다.
< 생성된 템플릿 변수 목록 >
PHP 변수명 템플릿 변수명 변수값 예
$_COOKIE ['PHPSESSID'] {_COOKIE.PHPSESSID} d3e808b889a06fe3a3ab4b4ba462ad46
_SESSION
PHP에서 제공되는 수퍼 글로벌 변수 $_SESSION(또는 $HTTP_SESSION_VARS)를 통해 서버에 저장된 세션 정보를 웹문서에 전달합니다.
후키템플릿에서는 전달된 수퍼 글로벌 변수 $_SESSION(또는 $HTTP_SESSION_VARS)의 값을 {_SESSION......} 형태로 된 템플릿 변수로 미리 정의하여 템플릿 파일에 넘겨줍니다.
::_PATH_TO_TPLS
1.1.0 버전부터 제공되는 멤버 템플릿변수로 현재 템플릿 파일의 PHP 스크립터 문서에 대한 상대경로가 기록되어 있습니다.
멤버템플릿변수 {::_PATH_TO_TPLS} 를 이용한 리소스 리디렉션 처리
예를들어 아래와 같이 경로중에 템플릿변수가 포함되어 있는 경우에도 정상적으로 동작하기 위해서는 리소스 리디렉션해 주어야 합니다.
[code html;gutter:false] <IMG src="images/{HEAD_IMG}"> [/code]
 
그러나 프로그램에서는 'src' 속성을 평가하여 실제로 해당파일이 없는 경우에는 리소스 리디렉션을 하지 않습니다. 그렇다고 파일이 없는 경우까지도 리디렉션하게되면 아래와 같은 경우에 문제가 발생합니다.
[code html;gutter:false] <A onmouseover= "menu1.src='images/btn_home_up.gif';showContents('layer_submenu1')" >...</A> [/code]
 
'images/btn_home_up.gif'은 './templates/images/btn_home_up.gif'와 같이 리디렉션되는 것이 정상적이지만 'layer_submenu1'도 './templates/layer_submenu1'와 같이 원치않는 리디렉션이 일어납니다.
리소스 URL에 템플릿변수를 사용할 경우에는 템플릿 디렉토리를 나타내는 멤버템플릿변수 {::_PATH_TO_TPLS}를 이용합니다.
[code html;gutter:false] <IMG src="{::_PATH_TO_TPLS}/icons/{HEAD_IMG}"> [/code]
 
위와 같이 표기할 수 있습니다. 멤버템플릿변수 {::_PATH_TO_TPLS}에는 현재 php문서(_SERVER.PHP_SELF)를 기준으로 현재의 템플릿문서파일의 상대경로를 기록되어 있습니다.
예를들어, 아래와 같이 php문서와 이 문서에서 사용하고 있는 2개의 템플릿문서가 있습니다.
+- test.php
|
+- tpl1 --- test1.htm
+- tpl2 --- test2.htm
 
템플릿문서 test1.htm과 test2.htm의 내용에는 모두 아래와 같은 내용이 포합되어 있습니다.
[code html;gutter:false] <IMG src="{::_PATH_TO_TPLS}/icons/{HEAD_IMG}"> [/code]
 
이럴 때 test1.htm의 멤버템플릿변수 {::_PATH_TO_TPLS}에는 './tpl1'이 기록되어 있고, test2.htm의 멤버템플릿변수 {::_PATH_TO_TPLS}에는 './tpl2'가 기록되어 있습니다.
_VARIABLE
1.1.1 버전에서 추가된 템플릿변수로 템플릿 파일 내에서 템플릿변수를 정의하기 위하여 사용됩니다.
{@_VARIABLE}
{var1::템플릿에서 할당된 변수 var1}
{var2::템플릿에서 할당된 변수 var2}
{var3::템플릿에서 할당된 변수 var3}
{var4::템플릿에서 할당된 변수 var4}
{/_VARIABLE}
위와 같이 다이나믹블록명 '_VARIABLE' 안에 템플릿 문서에서 사용할 템플릿변수를 정의하여 사용할 수 있습니다.
'_VARIABLE' 키워드로 지정된 블록은 복수의 템플릿 파일에서 동시에 사용할 수 있으며 브라우저에는 블록안의 내용이 출력되지 않습니다. 또한 그 안에 있는 내용은 템플릿변수에 대한 정보를 제외한 모든 코드가 컴파일 과정에서 삭제됩니다.
1.1.1 버전에서도 '_VARIABLE' 키워드를 사용하지 않고 일반적인 다이나믹블록으로도 템플릿변수 정의가 가능하기는 하지만 템플릿 파일마다 블록명을 다르게 설정하여야 하고 불필요한 코드가 캐시에 남아있게 됩니다.
그러나 향후 버전에서는 블록에서의 '_VARIABLE' 키워드 이외에는 그 호환성을 보증하지 않습니다. 주의해서 사용하시기 바랍니다.
블록에서의 템플릿변수 정의는 아래와 같은 형식으로 사용하면 됩니다.
{@_VARIABLE}{변수명::초기값}...{/_VARIABLE} 또는

<!--BEGIN DYNAMIC BLOCK: _VARIABLE -->
{변수명::초기값}...
<!-- END DYNAMIC BLOCK: _VARIABLE  -->
 
블록 _VARIABLE 내에 정의된 템플릿변수는 멤버 템플릿변수로 정의하여도 되고 반복문을 사용하여도 됩니다. 그러나 스위치문 등과 같이 나중에 PHP 스크립트에서 작업해야 하는 기능 등은 사용할 수 없습니다.
템플릿파일에 위와같이 템플릿변수를 정의해 놓으면 PHP 스크립트에서 별도로 해당 변수를 할당할 필요없이 템플릿 문서 아무데서나 정의된 변수를 사용하면 됩니다. 만약 템플릿파일에서 정의된 변수를 PHP 스크립트에서 사용할 필요가 있을 때는 get_assigned() 멤버를 이용하시면 됩니다.
블록 _VARIABLE 내에 멤버템플릿변수 정의하기
1.1.2 버전에서 추가되는 기능으로 아래와 같이 블록 _VARIABLE 내에서 멤버템플릿변수를 정의할 수 있습니다.
{@_VARIABLE}
{::var5::템플릿에서 할당된 변수 var5}
{/_VARIABLE}
 
_VERSION
1.1.2 버전에 추가된 템플릿변수로 후키템플릿 버전을 나타냅니다.
_SELF, _SELF.contents, _SELF.name
필터명령 내에서만 사용되는 템플릿변수들입니다.
{@BLOCK_VAR;;="{_SELF}";}블록변수의 초기내용{/}
템플릿변수 {_SELF}는 현재 변수가 저장하고 있는 변수내용을 의미합니다.
< 필터명령에서 사용되는 템플릿변수 _SELF >
기 능 템플릿 변수명 변수값 예
템플릿변수값 {_SELF} {_SELF.contents} 블록변수의 초기내용
템플릿변수명 {_SELF.name} BLOCK_VAR
필터명령 문장속에서의 이 변수의 정확한 표기법은 php 문장에서 변수 $_SELF를 사용하는 것처럼 사용하면 됩니다. 그렇다고해서 템플릿변수 {_SELF} 대신에 전역변수 $_SELF를 대신 쓸수는 없으며 단지 표기하는 방법만 동일하다는 의미입니다. 아래는 템플릿변수 {_SELF}를 잘못 사용한 경우의 예입니다.
{#FILEVAR;;='{_SELF}';}./include.htm{/}
{#FILEVAR;;="{_SELF}tailing...";}./include.htm{/}
위의 예는 마치 php 문장에서 전역변수 $_SELF를 아래와 같이 사용하면 정상적으로 동작하지 않는 것과 같습니다.
$TMPT = '$_SELF';
$TMPT = "$_SELFtailing...";
기타 미리 정의된 템플릿 변수
향후 필요하다면 {_TEMPLATE......} 형태(형편에 따라 변경될 수도 있음)로 추가하겠습니다.

Posted by 방글24