phpsource/템플릿2006. 10. 16. 13:31
written: Oct 16 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
동작 방식
전처리 명령의 동작방식은 php 명령의 동작방식과 동일합니다. 차이점은 전처리 명령의 결과값을 변수 내용에 저장하지 않고 무시한다는 것입니다. 따라서 변수 내용을 변경하지 않고 수행해야 하는 php 명령이 필요하다면 전처리 명령을 이용하여야 합니다.
{#SAMPLE;;
  initialize {%
   =*include_once("{./filter.php}");
 %}
}./include.htm{/}
위의 예제에 의해 initialize 실행시간에 php 내장함수인 include_once() 함수를 이용하여 filter.php 파일을 인클루드하지만 include.htm 파일 내용은 변경되지 않습니다.

Posted by 방글24
phpsource/템플릿2006. 10. 16. 13:29
written: Oct 16 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
초기값 지정 형식의 확장
1.2.0 버전부터는 아래와 같이 초기값으로 상수가 아닌 여러가지 형식의 PHP문을 사용할 수 있습니다.
{변수명;;=$a+1}
{?변수명;;=$a+1}사과|배|오렌지{/}
이와같이 PHP문으로 지정된 초기값은 템플릿 변수가 포함된 템플릿을 assign() 함수로 처리할 때 또는 처리한 직 후에 평가되여 그 결과값이 템플릿 변수에 저장되어 처리됩니다.
PHP문으로 초기값을 지정하기 위해서는 초기값의 첫문자를 '='로 지정합니다. 이전 버전과 마찬가지로 초기값에는 '{', '}', ',' 문자를 포함시킬 수 없으며 이를 포함시키기 위해서는 '\' 문자로 이스케이프시켜야 합니다.
초기값으로 지정된 PHP문은 PHP 내장함수인 eval()을 이용하여 처리하기 때문에 PHP문의 문법상의 이상유무, 발생하는 에러처리 및 반환 결과에 대하여는 eval() 함수의 처리결과에 따릅니다. 따라서 PHP문 형식이 문법상 정확하게 작성되지 않으면 eval() 함수에 의해 에러를 발생시킵니다.
초기값으로 지정된 PHP문의 평가
단순문, 스위치문에서의 PHP문에 대한 평가는 해당 템플릿변수가 포함된 템플릿을 assign() 함수로 처리할 때 이루어집니다.  
초기값으로 지정된 전역변수
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {TEXT;;="[".$gText."]"} </BODY> </HTML> [/code]
main.htm이라는 템플릿 파일을 이용하여 HTML 스크립트를 생성하기 위한 PHP 문서는 아래와 같습니다.
[code php;gutter:false] <?php /** * filename : test.php */ include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('main', 'main.htm'); $gText = '전역변수에 할당된 값'; $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
test.php 문서에 의해 main.htm로부터 생성된 HTML 스크립트를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <BODY> [전역변수에 할당된 값] </BODY> </HTML> [/code]
템플릿변수 TEXT는 이 변수가 포함된 템플릿 main을 test.php의 $tpl->assign('MAIN', 'main'); 문장에 의해 처리될 때 PHP문 "[".$gText."]"에 대한 평가가 이루어집니다. 따라서 초기값으로 지정된 전역변수의 값은 PHP 코드를 평가하기 전에 미리 할당되어 있어야 합니다.
초기값으로 지정된 전역함수
PHP 문에 함수를 포함하려면 아래와 같이 지정합니다. 지정 형식은 PHP에 내장된 eval() 함수로 실행하는데 필요한 정확한 문장형식을 갖추어야 합니다. 만약 포함된 함수가 사용자 정의함수인 경우에는 PHP 코드를 평가하기 전에 해당함수가 존재하여야 합니다.
{ROW;;=func(arg1,arg2,arg3)}
예를 들어 설명하겠습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {TEXT;;=userfunc('[',$gText,']'} </BODY> </HTML> [/code]
main.htm이라는 템플릿 파일을 이용하여 HTML 스크립트를 생성하기 위한 PHP 문서는 아래와 같습니다.
[code php;gutter:false] <?php /** * filename : test.php */ function userfunc($arg1, $arg2, $arg3) { return $arg1 . $arg2 . $arg3; } include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('main', 'main.htm'); $gText = '전역변수에 할당된 값'; $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
test.php 문서에 의해 main.htm로부터 생성된 HTML 스크립트를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <BODY> [전역변수에 할당된 값] </BODY> </HTML> [/code]
초기값으로 지정된 템플릿변수
{TEXT;;=[{tText}]}
예를 들어 설명하겠습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {TEXT;;=[{tText}]} </BODY> </HTML> [/code]
main.htm이라는 템플릿 파일을 이용하여 HTML 스크립트를 작성하기 위한 PHP 문서는 아래와 같습니다.
[code php;gutter:false] <?php /** * filename : test.php */ include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('main', 'main.htm'); $tpl->assign('tText', '템플릿변수에 할당된 값'); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
test.php 문서에 의해 main.htm로부터 생성된 HTML 스크립트를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <BODY> [템플릿변수에 할당된 값] </BODY> </HTML> [/code]

Posted by 방글24
phpsource/템플릿2006. 10. 16. 11:10
written: Oct 16 2006
변수옵션 ctype을 이용하면 변수에 들어갈 내용의 형식을 지정할 수 있습니다.
내용형식의 종류
템플릿 변수의 내용형식은 1.2.0 버전부터 지정할 수 있으며, 지정할 수 있는 내용형식(contents type)은 "템플릿문서", "텍스트문서", "PHP문서" 3가지 종류로 변수옵션 "ctype"을 이용하여 아래와 같이 지정합니다.
템플릿문서일 때 {#변수명}파일명{/}
텍스트문서일 때 {#변수명;ctype=text}파일명{/}
PHP 문서일 때 {#변수명;ctype=php}파일명{/}
템플릿문서일 때는 ctype을 지정하지 않으며, 지정하지 않았을 때는 템플릿문서로 인식하여 처리합니다.
파일변수뿐만 아니라 다른 모든 변수에도 ctype을 지정할 수 있도록 했습니다. 각 변수마다 ctype기능이 동작하는 방식에 약간의 차이가 존재하며, 각 ctype에 따른 동작은 컴파일할 때 이루어집니다.
변수내용(파일변수인 경우에는 파일내용) 형식이 text인 경우에는 문장 내에 템플릿변수가 있더라도 템플릿변수로 처리하지 않고 템플릿 문서가 아닌 일반 문서처럼 인식합니다.
템플릿변수의 내용형식이 php일 경우에 주의할 점
변수내용(파일변수인 경우에는 파일내용) 형식이 php인 경우에는 아래와 같은 절차에 따라 그 내용이 처리된다.
① 파일변수인 경우에는 파일내용을 읽어 변수내용에 저장함
② 변수내용에 존재하는 템플릿변수를 처리함
③ 변수내용을 php 스크립트로 인식하여 처리하며 그 결과를 돌려받아 변수내용에 저장함
④ 이후는 ctype이 text인 경우와 처리방법이 동일함
변수내용(파일변수인 경우에는 파일내용)은 완전한 php 스크립트 문장입니다. 일반 php 스크립트와의 차이점은 아래와 같이 문장 내에 템플릿변수가  존재할 수 있다는 것입니다.
[code php;gutter:false] <?php $contents = '템플릿버전은 {_VERSION}입니다.'; $contents = str_replace('템플릿버전', 'hTemplate 버전', $contents); return $contents; ?>[/code]
조건변수(스위치문)에서는 경우의 수를 분리하기 전에 위에서 기술한 4단계 절차에 따라 먼저 변수내용을 처리한 후 이 결과값을 가지고 경우의 수를 분리하여 처리합니다.    
지정된 php 문서의 시작과 끝에는 반드시 php 시작태그 <?php와 종료태그 ?>가 있어야 합니다.  
템플릿문서를 {#;ctype=php}./test.php{/}라고 작성하였다면 php 문서 파일 test.php에는 아래와 같이 문서 시작과 끝부분에 시작태그와 종료태그를 반드시 지정하여야 합니다.
[code php;gutter:false] <?php /** * filename : test.php */ return 'test.php'; ?>[/code]
{#; ctype=php}./test.php{/}의 결과는 php 문서의 반환값 'test.php'입니다. 만약 php 문서 내에 print, echo와 같은 함수를 이용하여 브라우저로 전송하는 문자가 발생하면 반환값 대신에 print, echo로 출력한 값이 {#;ctype=php}./test.php{/} 위치에 들어가게 됩니다.
php 문서를 실행 중에 에러가 발생한 경우에도 print, echo로 출력한 것과 같이 발생한 에러메시지를 돌려받게 됩니다.
블록변수의 내용을 php 내용형식으로 지정한 예를 들어보면 아래와 같습니다.
[code php;gutter:false] {@;ctype=php} <?php print '블록변수에 직접 php 문서를 삽입한 경우'; ?> {/}[/code]
위의 블록변수의 위치에는 print 함수로 출력한 '블록변수에 직접 php 문서를 삽입한 경우'가 들어갑니다.
GET 방식에 의해 php 문서로 변수 전달
파일변수의 내용형식이 php일 때 GET 방식에 의해 php 문서로 변수를 전달할 수 있습니다. 아래와 같이 php 문서 test.php 내에 GET 방식으로 전달받는 변수 $version이 있다고 가정하겠습니다.
[code php;gutter:false] <?php return "템플릿버전은 $version입니다."; ?>[/code]
위 문서는 php.ini 파일의 옵션 register_globals이 on(또는 1)으로 설정되었을 때에만 정상적으로 $version의 값을 돌려받을 수 있습니다. 만약 register_globals이 off(또는 0)로 설정되어 있다면 $version 대신에 $_GET['version']라고 기술해야 합니다.
이와 같은 php 문서의 GET 변수 $varsion의 값을 아래와 같이 템플릿문서 파일변수의 파일명에 GET 방식으로 전달할 수 있습니다.
[code php;gutter:false] {#SAMPLE;ctype=php}./test.php?version=1.2.0-dev-20060905{/}[/code]
참고로 내용형식이 php인 php 문서들은 템플릿툴 내에서는 하나의 함수로 처리됩니다. 이 때 강제로 지정되는 함수명은 hTemplateFunction_템플릿명()입니다. 위의 예에서 파일변수명이 SAMPLE이므로 이 파일변수에 해당하는 템플릿명은 변수명과 같은 SAMPLE입니다. php.ini 환경설정파일의 옵션 register_global의 값이 on으로 설정되었을 때 위 예제의 php 문서는 아래와 같이 함수명 hTemplateFunction_SAMPLE로 정의한 것과 같은 효과가 있습니다.
[code php;gutter:false] function hTemplateFunction_SAMPLE() { global $version; return "템플릿버전은 $version입니다."; }[/code]
템플릿을 디버깅하거나 에러가 발생할 때 위와 같은 hTemplateFunction_템플릿명으로 된 함수명이 나올 수 있으니 참조바랍니다.
또한 이 기능에 의하여 미리정의된 템플릿변수 {_GET.변수명}으로도 자동 처리됩니다.

Posted by 방글24