hTemplate – 6.2.미리정의된 템플릿변수

후키템플릿은 기본적으로 미리 정의되어 제공되는 템플릿 변수들이 있습니다. 이 템플릿 변수들은 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}을 템플릿 파일에 응용하는 예입니다.

사실 이를 사용자가 직접 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’라고 가정하지요.

위의 템플릿 문서를 후키템플릿으로 해석한 후 output() 함수로 생성된 HTML 문서는 아래와 같습니다.

_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 파일 업로드할 때 업로드하는 파일 정보를 담는데 사용됩니다.

예를 들어 위와 같은 HTML 폼을 통해 파일 ‘Autoexec.bat’를 업로드를 하게 되면 file-upload.php 문서로 넘어오는 수퍼 글로벌 변수 $_FILES의 값은 아래와 같습니다(각 항목의 값은 시스템 상황에 따라 다른 값이 나타날 수 있습니다).

수퍼 글로벌 변수 $_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} 를 이용한 리소스 리디렉션 처리

예를들어 아래와 같이 경로중에 템플릿변수가 포함되어 있는 경우에도 정상적으로 동작하기 위해서는 리소스 리디렉션해 주어야 합니다.

그러나 프로그램에서는 ‘src’ 속성을 평가하여 실제로 해당파일이 없는 경우에는 리소스 리디렉션을 하지 않습니다. 그렇다고 파일이 없는 경우까지도 리디렉션하게되면 아래와 같은 경우에 문제가 발생합니다.

‘images/btn_home_up.gif’은 ‘./templates/images/btn_home_up.gif’와 같이 리디렉션되는 것이 정상적이지만 ‘layer_submenu1’도 ‘./templates/layer_submenu1’와 같이 원치않는 리디렉션이 일어납니다.

리소스 URL에 템플릿변수를 사용할 경우에는 템플릿 디렉토리를 나타내는 멤버템플릿변수 {::_PATH_TO_TPLS}를 이용합니다.

위와 같이 표기할 수 있습니다. 멤버템플릿변수 {::_PATH_TO_TPLS}에는 현재 php문서(_SERVER.PHP_SELF)를 기준으로 현재의 템플릿문서파일의 상대경로를 기록되어 있습니다.

예를들어, 아래와 같이 php문서와 이 문서에서 사용하고 있는 2개의 템플릿문서가 있습니다.

템플릿문서 test1.htm과 test2.htm의 내용에는 모두 아래와 같은 내용이 포합되어 있습니다.

이럴 때 test1.htm의 멤버템플릿변수 {::_PATH_TO_TPLS}에는 ‘./tpl1’이 기록되어 있고, test2.htm의 멤버템플릿변수 {::_PATH_TO_TPLS}에는 ‘./tpl2’가 기록되어 있습니다.

_VARIABLE

1.1.1 버전에서 추가된 템플릿변수로 템플릿 파일 내에서 템플릿변수를 정의하기 위하여 사용됩니다.

위와 같이 다이나믹블록명 ‘_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 내에서 멤버템플릿변수를 정의할 수 있습니다.

_VERSION

1.1.2 버전에 추가된 템플릿변수로 hTemplate 버전을 나타냅니다.

_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……} 형태(형편에 따라 변경될 수도 있음)로 추가하겠습니다.

답글 남기기