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
phpsource/템플릿2006. 10. 13. 13:38
written: Oct 16 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
내장 필터 함수
내장 필터함수는 템플릿 문서를 작성하는데 도움이 될 만한 함수를 후키템플릿 클래스에 포함시켜 제공됩니다. 내장 필터함수를 위한 클래스 파일 class.hTemplateFilter.php가 1.2.0 버전에 추가되었습니다.
* [주의] - 2006.10.26

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

현재 : {@변수명;;=>내장필터함수}내용{/}
수정(안) : {@변수명;;=)내장필터함수}내용{/}
내장필터함수 url() 사용법
아래와 같이 템플릿변수에서 내장필터함수 url()을 이용하면 URL 리디렉션을 템플릿변수에서 처리할 수 있도록 해줍니다.
{=>url("./images/my.htm")}
지금까지 URL 리디렉션을 할 수 있는 구성요소는 HTML 스크립트 <IMG> 태그의 "src" 속성과 같이 HTML 규약 상에 정의된 주소부분에 한정하였습니다. 이 외에 URL 리디렉션은 아래와 같이 자바스크립트 태그 <SCRIPT> 에서 속성 "tpl" 값을 "URL"로 설정했을 때만 제한적으로 허용하고 있습니다.
[code html;gutter:false] <script language="javascript" tpl="URL"> <!-- imagePath = "./images/tree"; //--> </script> <script language="javascript"> objTreeMenu_1 = new TreeMenu(imagePath, ......); objTreeMenu_1.showTooltips = true; </script> [/code]
이러한 방법은 URL 리디렉션 기능 구현이 쉽지않아 - 주소를 나타내는 부분과 그렇지 않은 부분을 구별하기가 어려워 - 임시방편적으로 제공된 방법이었습니다. 이제는 내장필터함수 url()을 이용하면 그 위치에 제한을 받지않으면서도(자바스크립트 뿐만 아니라 HTML 스크립트 내 어느곳에서나 사용할 수 있다는 의미) 손쉽게 URL 리디렉션을 할 수 있습니다.
[code html;gutter:false] <script language="javascript"> objTreeMenu_1 = new TreeMenu("{=>url('./images/tree')}", ......); objTreeMenu_1.showTooltips = true; [/code]
물론 다른 URL 리디렉션과 마찬가지로 컴파일옵션 "active_absolute_path"에 따라 생성된 HTML 스크립트 문서에서는 상대경로로 나타날 수도 있고 절대경로로 나타날 수도 있습니다.
아래 예에서와 같이 변수내용에 이미 주소가 저장되어 있는 경우에는 내장필터함수 url() 함수에 주소값을 입력할 필요가 없습니다.
{@_VARIABLE}
{ADDR;;./images/my.gif}
{/}

{ADDR;;=>url()}
1.2.0 버전부터 제공되는 단순변수 구문형식을 이용하면 아래와 같이 나타낼 수 있습니다.
{&ADDR;;=>url()}./images/my.gif{/}

'phpsource > 템플릿' 카테고리의 다른 글

{후키템플릿}8.4.php 명령  (0) 2006.10.16
{후키템플릿}7.2.내용 형식  (0) 2006.10.16
{후키템플릿}7.9.TR 용법  (0) 2006.10.13
{후키템플릿}6.1.특수문자의 표현  (0) 2006.10.09
{후키템플릿}8.8.래핑(wrapping)  (0) 2006.09.29
Posted by 방글24
phpsource/템플릿2006. 10. 13. 12:30
written: Sep 20 2006
TR 용법은 1.2.0 버전부터 사용할 수 있으나 확정된 기능이 아니라 여러분의 의견을 수렴할 목적으로 미리 공개되는 제안서(proposal)입니다. 따라서 향후 업그레이드할 때 아래서 설명한 내용과 다르게 동작할 수 있으니 주의하시기 바랍니다.
TR 용법
TR(Table Record) 용법은 위즈윅 HTML 에디터를 가지고 템플릿 문서를 편집할 때 유용하게 사용될 수 있을 것입니다. 아래와 같이 테이블의 각 행을 반복적으로 처리하는 경우에 블록변수 시작 및 종료태그가 <table> 태그와 <tr> 태그 사이에 위치하게 됩니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> <!-- BEGIN DYNAMIC BLOCK: DSP_BLOCK_ARTICLES --> <tr> <td style='padding-left:5;'> {block_articles} </td> </tr> <!-- END DYNAMIC BLOCK: DSP_BLOCK_ARTICLES --> </table> [/code]
이 문을 위즈윅 HTML 에디터로 보면 블록변수가 보이지 않으며, 따라서 HTML 문서를 수정할 때 매우 조심하여 작업하지 않으면 블록변수 태그가 손실될 우려가 높습니다. 블록변수를 보이게 하기 위하여 주석문 형식 대신에 {@DSP_BLOCK_ARTICLES} ... {/} 형식을 사용하게 되면 위즈윅 HTML 에디터가 소스를 변형하는 경우도 발생하며, 또 HTML 문서 규약에 맞지도 않기때문에 제대로 보이지 않습니다.
만약 블록변수 태그가 위즈윅 HTML 에디터에 나타난다면 HTML 스크립트 편집 작업이 훨씬 수월할 것입니다. 오래전부터 이 문제를 어떻게 개선할 수 없을까 고민하다가 일단 proposal로 그 구문형식을 제안합니다.
위에서 예를 든 블록변수를 새로 제안된 TR 블록변수로 작성한다면 아래와 같을 것입니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> <tr> <td style='padding-left:5;'> {@DSP_BLOCK_ARTICLES;tr=1}{block_articles}{/} </td> </tr> </table> [/code]
위 문자에서와 같이 변수옵션 tr을 1로 지정하게 되면 템플릿 문서를 컴파일할 때 아래와 같이 지정된 tr 옵션에 의해 변수의 위치가 <tr>...</tr> 태그 밖으로 이동되어 컴파일됩니다.
[code html;gutter:false] <table cellpadding="0" cellspacing="0" border="0"> {@DSP_BLOCK_ARTICLES} <tr> <td style='padding-left:5;'> {block_articles} </td> </tr> {/} </table> [/code]
이와같이 TR 태그의 위치를 변수 옵션 tr에 의해 조정할 수 있다는 의미에서 'TR 용법'이라고 이름지어 봤습니다.
3겹으로 중첩된 블록변수에서의 TR 용법
TR 용법을 응용하여 좀 더 복잡한 템플릿 문서를 작성하여 보겠습니다. 3겹으로 중첩된 블록변수로 작성된 문서입니다.
[code html;gutter:false] <!-- filename : block.htm --> <TABLE border="1"> <TR> <TD> {@a;tr=1}{sample_a} <TABLE border="1"> <TR> <TD> {@b;tr=1}{sample_b} <TABLE border="1"> <TR> <TD> {@c;tr=1}{sample_c}{/} </TD> </TR> </TABLE> {/} </TD> </TR> </TABLE> {/} </TD> </TR> </TABLE> [/code]
위의 템플릿 문서를 처리하기 위한 PHP 문장은 아래와 같습니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', .....); $tpl->define( array( 'main' => 'block.htm' ) ); for($i=0;$i<3;$i++) { $tpl->assign('sample_a', 'SAMPLE_a'.$i.'', true); $tpl->assign('sample_b', ''); for($j=0;$j<3;$j++) { $tpl->assign('sample_b', 'SAMPLE_b'.$j.'', true); $tpl->assign('sample_c', ''); for($k=0;$k<3;$k++) { $tpl->assign('sample_c', 'SAMPLE_c'.$k.'', true); } $tpl->assign('c', 'c'); } $tpl->assign('b', 'b'); } $tpl->assign('a', 'a'); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 PHP 문장을 실행하면 브라우저에는 아래와 같이 나타날 것입니다.
SAMPLE_a0SAMPLE_a1SAMPLE_a2
SAMPLE_b0SAMPLE_b1SAMPLE_b2
SAMPLE_c0SAMPLE_c1SAMPLE_c2
생성된 HTML 스크립트 소스는 아래와 같습니다.
[code html;gutter:false] <table border="1"> <tr> <td> SAMPLE_a0SAMPLE_a1SAMPLE_a2 <table border="1"> <tr> <td> SAMPLE_b0SAMPLE_b1SAMPLE_b2 <table border="1"> <tr> <td> SAMPLE_c0SAMPLE_c1SAMPLE_c2 </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> [/code]
참고로 템플릿 문서 block.htm을 위즈윅 HTLM 에디터에서 본다면 아래와 같이 나타날 것입니다. 이제는 에디터에서 블록변수의 위치를 확인하면서 작업할 수 있을 것입니다.
{@a;tr=1}{$sample_a}
{@b;tr=1}{$sample_b}
{@c;tr=1}{$sample_c}{/}
{/}
{/}
같은 템플릿 문서를 가지고 PHP 문장만 변형시켜 TR 태그를 반복시켜 보겠습니다. 수정된 PHP 문장은 아래와 같습니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', .....); $tpl->define( array( 'main' => 'block.htm' ) ); for($i=0;$i<2;$i++) { $tpl->assign('sample_a', 'SAMPLE_a'.$i.''); $tpl->assign('b', ''); for($j=0;$j<2;$j++) { $tpl->assign('sample_b', 'SAMPLE_b'.$j.''); $tpl->assign('c', ''); for($k=0;$k<2;$k++) { $tpl->assign('sample_c', 'SAMPLE_c'.$k.''); $tpl->assign('c', 'c', true); } $tpl->assign('b', 'b', true); } $tpl->assign('a', 'a', true); } $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 PHP 문장을 실행하면 브라우저에는 아래와 같이 나타날 것입니다.
SAMPLE_a0
SAMPLE_b0
SAMPLE_c0
SAMPLE_c1
SAMPLE_b1
SAMPLE_c0
SAMPLE_c1
SAMPLE_a1
SAMPLE_b0
SAMPLE_c0
SAMPLE_c1
SAMPLE_b1
SAMPLE_c0
SAMPLE_c1
각 변수에서의 TR 용법
TR 용법은 블록변수뿐만 아니라 단순변수, 조건변수, 파일변수에서도 사용할 수 있습니다.
단순변수일 때 {&변수명;tr=1}변수내용{/}
조건변수일 때 {?변수명;tr=1}경우의수{/}
블록변수일 때 {@변수명;tr=1}블록내용{/}
파일변수일 때 {#변수명;tr=1}파일명{/}
그러나 각 변수마다 TR기능이 동작하는 방식에 약간의 차이가 존재합니다.

Posted by 방글24
phpsource/템플릿2006. 10. 9. 10:45
written: Jan 28 2002
last modified: Nov 09 2006
템플릿 파일에서 특수문자를 표현하는 방법
템플릿 파일에서 특수하게 사용하고 있는 몇몇 특수문자를 특수문자가 아닌 그 문자 자체의 의미로 사용하려면 특수 문자 앞에 역슬래시(\) 문자를 붙여 escape시켜야 합니다. 후키템플릿에서 escape시켜야 하는 특수문자로는 '{', '}', '|'(수직바), ','(콤마), ' '(스페이스)가 있습니다.
0.0.3 버전부터는 특수문자('{', '}', '|')를 템플릿 파일에 삽입하기 위해서는 템플릿 파일 어느 곳이든지 상관없이 앞에다 역슬래시(\)를 붙여주면 됩니다. 이전 버전에서는 그 위치에 많은 제한을 받고 있습니다.
1.0.0 버전부터는 나타낼 수 있는 특수문자로 콤마 및 스페이스 문자가 추가되었습니다.
'{' - 열린 중괄호
'}' - 닫힌 중괄호
'|' - 수직바
',' - 콤마
' ' - 스페이스 문자
스페이스 문자(' ')는 조건변수(스위치문) 안에서만 쓰이는 특수문자이고 나머지는 템플릿 파일 전체에서 쓰이는 특수문자입니다.
특수문자의 용법
특수문자 '{' 와 '}'
특수문자 '{'는 템플릿 파일에서 템플릿 변수를 나타내는데 사용됩니다. 때에 따라서는 특수문자 '{'를 템플릿 변수가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 '{' 앞에 역슬래시(\)를 붙이게 되면 템플릿 변수로 해석하지 않고 일반문자 '{'로 화면에 나타낼 수 있습니다. 예를 들어 템플릿 파일을 아래와 같이 작성하였다고 하지요.
<P>\{TITLE\}은 템플릿 변수를 의미합니다.</P>
이 템플릿 파일을 파싱한 후 출력하면 화면에는 아래와 같이 보일 것입니다.
{TITLE}은 템플릿 변수를 의미합니다.
그러나 만약 '{' 문자를 escape하지 않고 아래와 같이 '{TITLE}'라고 기술한 경우를 생각해 보겠습니다.
<P>{TITLE}은 템플릿 변수를 의미합니다.</P>
이 템플릿 파일을 파싱한 후 출력하면 "{TITLE}"라는 문자 자체가 나타나지 않고 템플릿 변수로 해석하여 assign() 함수로 지정된 값으로 처리되었을 것입니다. assign() 함수로 지정된 값이 없었다면 아래와 같이 빈문자열로 처리될 것입니다.
은 템플릿 변수를 의미합니다.
'{'  문자와는 달리 '}' 문자의 경우는 escape를 시키지 않더라도 별 문제없이 나타낼 수 있습니다. 그러나 0.0.3부터 지원하기 시작한 템플릿 변수에 초기값을 지정할 때 초기값 내에서 '}' 문자를 나타내기 위해서는 반드시 escape 시켜야 합니다.
{ROW;;이곳에 초기값을 설정하면 템플릿 변수 \{ROW\}에 초기값이 할당됨}
초기값을 지정하는 위치가 아닌 곳은 이전과 같이 '}'에 대하여는 escape를 시키지 않아도 되나 전체적인 표기의 통일을 위하고 향후 버전의 호환성을 위해 무조건 escape를 시킬 것을 권합니다.
특수문자 ','
특수문자 ','(콤마)는 템플릿 파일에서 조건변수(스위치문)를 나타내는데 사용됩니다. 때에 따라서는 특수문자 ','를 특수문자가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 ',' 앞에 역슬래시(\)를 붙이게 되면 switch문에서 사용하는 특수문자로 해석하지 않고 일반문자 ','로 화면에 나타낼 수 있습니다.
예를 들어 템플릿 파일을 아래와 같이 작성한 경우를 생각해 보겠습니다.
변수의 초기값에 \,를 사용한 예 : {COMMA;;초기값으로 콤마(\,)를 넣을 수 있음}
이 템플릿 파일을 파싱한 후 템플릿 변수 {COMMA}에 아무값도 할당하지 않으면 아래와 같이 초기값인 '초기값으로 콤마(,)를 넣을 수 있음'이 출력됩니다.
변수의 초기값에 ,를 사용한 예 : 초기값으로 콤마(,)를 넣을 수 있음
특수문자 ','(콤마)는 1.0.0 버전부터 정상적으로 출력할 수 있습니다.
1.2.0 버전부터 지원되는 아래와 같은 형식에서는 콤마(,)를 이스케이프하지 않아도 됩니다.
{?SW;;=|userfunc('arg1','arg2');} 사과 | 배 {/}
특수문자 '|'
특수문자 '|'(수직바)는 템플릿 파일에서 복수 case문을 나타내는데 사용됩니다. 때에 따라서는 특수문자 '|'를 특수문자가 아닌 그 문자 그대로를 나타낼 필요가 있겠지요. 이런 경우에 특수문자 '|' 앞에 역슬래시(\)를 붙이게 되면 복수 case문으로 해석하지 않고 일반문자 '|'로 화면에 나타낼 수 있습니다.
[0.0.2버전] 특수문자 "{"와는 달리 특수문자 '|'는 템플릿 파일 모든 영역에서 이와 같이 해석되지는 않고 단지 조건변수(스위치문) 안에서만 escape시켜야 합니다. 조건변수(스위치문) 밖에서 '\|'라고 하게 되면 '|'라고 출력되는 것이 아니라 '\|'라는 문자가 그대로 출력됩니다.
[0.0.3버전] 0.0.2 버전과는 달리 특수문자 '|'는 템플릿 파일 모든 영역에서 반드시 escape시켜주십시요. 조건변수(스위치문) 밖에서 '\|'라고 하게 되면 이전 버전과는 달리 '\|'라고 출력되는 것이 아니라 '|'문자만 출력됩니다. 조건변수(스위치문) 안에서만 escape시키고 그 밖에서는 escape시키지 않더라도 별문제 없이 나타낼 수 있으나 특수문자 '{', '}' 와 마찬가지로 전체적인 표기의 통일을 위하여 그리고 향후 버전의 호환성을 위해 무조건 escape를 시킬 것을 권합니다.
예를 들어 템플릿 파일을 아래와 같이 작성한 경우를 생각해 보겠습니다.
복수 case문에서 \|를 사용한 예 : {VAR, \|case-1\| | \|case-2\| | \|case-3\|}
이 템플릿 파일을 파싱한 후 템플릿 변수 {VAR}에 2를 할당한 후 출력하면 화면에는 아래와 같이 보일 것입니다.
복수 case문에서 |를 사용한 예 : |case-2|
스페이스 문자 " "
스페이스 문자는 조건변수(스위치문)의 각 case 값 앞뒤에 스페이스 문자를 붙일 수 있도록 해줍니다.
템플릿 파일에 조건변수 COLOR가 아래와 같이 정의되어 있는 경우의 예를 들어 보겠습니다. 이 때 조건변수 COLOR 값이 1이면 '파란색', 2면 '빨간색', 3이면 '노랑색', 4면 '하늘색', 5이면 '초록색'이 출력됩니다. 이 때 각 case 값 앞뒤에 있는 스페이스 문자는 모두 없어집니다.
{COLOR,
파란색 |
빨간색 |
노랑색 |
하늘색 |
초록색
}
만약 각 case 값 앞뒤에 스페이스 문자를 넣고 싶다면 아래와 같이 역슬래쉬로 스페이스 문자를 escape시킵니다. 그러면 조건변수 COLOR 값이 1이면 ' 파란색 ', 2면 ' 빨간색 ', 3이면 ' 노랑색 ', 4면 ' 하늘색 ', 5이면 ' 초록색 '이 출력됩니다. 각 case 값 앞뒤에 있는 스페이스 문자가 그대로 유지됩니다.
{COLOR,
\ 파란색\ |
\ 빨간색\ |
\ 노랑색\ |
\ 하늘색\ |
\ 초록색\
}

Posted by 방글24
phpsource/템플릿2006. 9. 29. 13:40
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
래핑(wrapping)
이미 작성된 템플릿 문서와 php 문서를 전혀 건드리지 않고 이 문서 앞 뒤로 새로운 템플릿 문서를 추가하거나 기작성된 템플릿 문서를 필터명령으로 수정할 수 있도록 하는 기능입니다.
그림에서 보듯이 내용물이 동일하더라도 포장을 어떻게 하느냐에 따라 결과물을 전혀 다르게 보일 수 있습니다. 이와 같이 랩핑 기능을 이용하면 기작성되어 있는 템플릿 문서와 php 문서를 손대지 않고도 전혀 다른 결과물을 얻을 수 있습니다.
기작성되어 있는 템플릿 문서가 아래와 같을 경우를 살펴보겠습니다.
[code html;gutter:false] <!-- template file : main.htm --> 오른쪽에 우리집이 있다. [/code]
일반적으로 php 문서에서 main.htm 문서를 처리하면 "오른쪽에 우리집이 있다"라는 HTML 스크립트를 생성할 수 있습니다. 이 문서를 래핑 기능과 필터 기능을 이용하면 아래와 같이 수정할 수 있습니다.
[code html;gutter:false] <!-- wrapping file : wrap.main.htm --> {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }{/} [/code]
기작성된 템플릿 문서 main.htm을 래핑하는 래핑 문서 wrap.main.htm을 같은 디렉토리 또는 그 상위 디렉토리에 저장하는 것으로 래핑 기능을 사용할 준비는 다 된 것입니다.
래핑 파일(wrap.main.htm) 내에 파일명이 생략된 파일변수가 존재하면 아래와 같이 wrapped 파일명(main.htm)을 지정한 것 문서와 같은 동작을 합니다.
[code html;gutter:false] {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }main.htm{/} [/code]
php 스크립트에서는 main.htm 대신에 wrap.main.htm을 define 처리합니다. 이 부분까지가 래핑 기능이 하는 역할입니다. 나머지는 이미 소개한 필터 기능에 의하여 "오른쪽에 우리집이 있다" 대신에 "왼쪽에 우리집이 있다"라는 HTML 스크립트를 생성하게 됩니다.
래핑 문서의 파일명은 기작성 템플릿 문서 파일명 앞에 서두문자 "wrap."을 붙이면 됩니다.
앞에서 설명한 바와 같이 래핑 문서를 기작성 템플릿 문서와 동일한 디렉토리에 저장할 수도 있고 그 상위 디렉토리에 저장할 수도 있습니다. 만약 두 곳 모두에 래핑 문서가 존재한다면 기작성 템플릿 문서와 동일한 디렉토리에 있는 래핑 문서에 우선권이 있습니다..
< 특정 템플릿에 종속된 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리와 blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 각각 동일한 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리되며, blogmeme_yellow 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리됩니다.
만약에 동일한 디렉토리 내에 다양한 이름을 가진 템플릿 문서를 모두 처리할 수 있는 래핑 문서를 작성하려면 그 이름을 아래와 같이 wrap._global.html로 지정하면 됩니다..
< 모든 템플릿에서 접근할 수 있는 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리에 있는 템플릿 문서 skin_1.html, skin_2.html, skin_3.html은 모두 동일한 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리되며, blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리됩니다.
위의 4가지 경우의 래핑문서가 모두 존재한다면 그 우선순위는 아래와 같습니다.
① 동일 디렉토리의 wrap.skin.html
② 차상위 디렉토리의 wrap.skin.html
③ 동일 디렉토리의 wrap._global.html
④ 차상위 디렉토리의 wrap._global.html

Posted by 방글24
phpsource/템플릿2006. 9. 29. 13:33
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
필터 함수
필터함수에는 사용자정의 필터함수(user defined filter function)와 내장 필터함수(built-in filter function)로 구분할 수 있습니다. 내장 필터함수는 템플릿 문서를 작성하는데 도움이 될 만한 함수를 후키템플릿 클래스에 포함시켜 제공됩니다. 사용자정의 필터함수는 사용자가 직접 필요한 필터함수를 정의하여 사용할 수 있습니다.
필터함수 정의하기
모든 필터함수는 아래와 같은 형식으로 정의되어야 합니다.
function 필터함수명($contents, $config [, ......]) {
......
return $contents;
}
필터함수는 템플릿 문서 내용이 첫번째 인자 $contents를 통해 전달받는데 각 실행시간에 따라 $contents의 형식과 내용이 다소 다릅니다. 전달받는 $contents의 형식과 내용에 대하여는 각 실행시간별로 살펴보겠습니다.
두번째 인자로 지정된 변수 $config는 템플릿 객체생성할 때 설정된 컴파일옵션과 템플릿명이 아래와 같은 배열 형식으로 설정되어 있습니다.
[config] => (array)
(
[active_absolute_path] => (boolean) false 또는 true
[active_html_compress] => (boolean) false 또는 true
[active_html_header] => (boolean) false 또는 true
[active_html_parse] => (boolean) false 또는 true
[active_tag_lowercase] => (boolean) false 또는 true
[active_url_redirection] => (boolean) false 또는 true
[template_name] => (string) 필터함수가 정의된 템플릿 문서의 템플릿명
)
사용자가 지정하지 않더라도 첫번째와 두번째 인자는 자동으로 필터함수로 넘어옵니다. 만약 $contents와 $confilg 정보 외에 다른 정보를 필터함수로 전달하기 위해서는 아래의 템플릿 문서의 예와 같이 필요한 정보를 필터함수와 함께 기술해주면 됩니다.
{#FILE;; =|user_filter("{_VERSION}", $global_var, "템플릿툴을 통한 홈페이지 제작 방안") }./test.htm{/}
위의 템플릿 문서 예에서 지정한 사용자정의 필터함수 user_filter()에는 사용자에 의해 템플릿변수 {_VERSION}, 전역변수 $global_var, 문자열 "템플릿툴을 통한 홈페이지 제작 방안"이 추가적으로 전달되고 있습니다. 추가된 정보를 필터함수에서 전달받기 위해서는 필터함수를 아래와 같이 정의하여야 합니다.
function user_filter($contents, $config, $version, $gVar, $str) {
......
return $contents;
}
사용자가 필터함수에 추가적으로 기술한 정보들은 필터함수의 세번째 인자부터 차례로 전달됩니다.
각 실행시간별로 필터함수를 정의하는 예를 살펴보기 위하여 우선 아래의 예제와 같은 템플릿 문서에 작성된 파일 변수에 지정된 각각의 필터함수를 정의해 보겠습니다.
{#FILE;;
initialize {%
=|initialize_skin();
%}
premacro {%
=|premacro_skin();
%}
precompile {%
=|precompile_skin();
%}
postcompile {%
=|postcompile_skin();
%}
preassign {%
=|preassign_skin();
%}
postassign {%
=|postassign_skin();
%}
output {%
=|output_skin();
%}
}./test.htm{/}
필터함수 이름은 사용자가 임의로 명명하여도 되지만 php 내장함수를 포함한 현재 페이지에서 사용 중인 사용자 정의 전역함수 이름과 중복하여 명명할 수 없습니다.
initialize 실행시간 필터함수 정의하기
initialize 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있으며, 아래와 같은 형식으로 정의합니다.
function initialize_skin($contents, $config [, ......]) {
......
return $contents;
}
initialize 실행시간 필터함수에 넘어오는 변수 $contents는 아무런 의미없는 빈문자열입니다. 리턴값 역시 별 의미가 없기 때문에 생략해도 됩니다만 향후 버전과의 호환성을 위하여 생략하지 말기 바랍니다.
premacro 실행시간 필터함수 정의하기
premacro 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있고 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function premacro_skin($contents, $config [, ......]) {
......
return $contents;
}
premacro 실행시간 필터함수에 넘어오는 변수 $contents에는 파일변수에서 지정된 파일의 내용이 그대로 담겨있습니다.
템플릿 문서를 컴파일하려면 아래의 몇가지 예와 같이 각 버전별로 상이한 템플릿 변수 형식을 통일시키는 등의 문자열 치환 작업(매크로 작업)이 필요합니다.
① <!--{ 을 { 으로 치환
② }--> 을 } 으로 치환
③ <!-- BEGIN DYNAMIC BLOCK: 블록명 --> 을 {@ 블록명} 으로 치환
④ <!-- END DYNAMIC BLOCK: 블록명 --> 을 {/} 으로 치환
⑤ <!--#include file="파일명"--> 을 {#파일명} 으로 치환
⑥ 기타 등등
이러한 매크로 작업은 템플릿툴이 컴파일하기 전에 자동으로 처리하는데 premacro 실행시간 필터함수는 템플릿툴이 미리 지정된 매크로 작업을 하기 전에 사용자가 먼저 템플릿 문서 내용을 넘겨받아 처리해야 할 필요가 있을 때 작성하는 함수입니다.
precompile 실행시간 필터함수 정의하기
precompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function precompile_skin($contents, $config [, ......]) {
......
return $contents;
}
precompile 실행시간 필터함수에 넘어오는 변수 $contents에는 여러가지 문자열 치환 작업(매크로 작업)을 한 직후의 템플릿 내용이 문자열 형식으로 담겨있습니다.
postcompile 실행시간 필터함수 정의하기
postcompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function postcompile_skin($contents, $config [, ......]) {
......
return $contents;
}
postcompile 실행시간 필터함수에 넘어오는 변수 $contents에는 컴파일된 템플릿 문서 내용이 배열형식으로 들어있습니다. 컴파일된 템플릿 문서 형식은 각 버전별로 상이하며 향후 버전에서도 상황에 따라 수시도 변경될 수 있으니 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다. 이 함수에서 리턴된 값은 바로 캐시에 저장됩니다.
preassign 실행시간 필터함수 정의하기
preassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function preassign_skin($contents, $config [, ......]) {
......
return $contents;
}
preassign 실행시간 필터함수는 아래의 예에서 볼 때 assign() 함수를 수행하는 시작부분에서 템플릿에 존재하는 변수들을 할당(assign)하기 직전에 수행합니다.
[code php;gutter:false] $tpl->assign('test','test'); [/code]
preassign 실행시간 필터함수에 넘어오는 변수 $contents에는 캐시에 저장되었던 템플릿 문서 내용이 담겨있습니다. 따라서 후키템플릿 고유의 배열형식으로 postcompile 실행시간 필터함수에서 설명한 것과 마찬가지로 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다.
postassign 실행시간 필터함수 정의하기
postassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function postassign_skin($contents, $config [, ......]) {
......
return $contents;
}
postassign 실행시간 필터함수는 assign() 함수를 수행하는 마지막부분에서 템플릿을 할당(assign)한 직후에 수행합니다.
postassign 실행시간 필터함수에 넘어오는 변수 $contents에는 템플릿 문서에 포함된 모든 템플릿 변수들이 처리된 문자열 형식의 순수 HTML 스크립트 문서가 담겨있습니다. 주의할 점이 원래 템플릿 파일에 있는 내용 중에서 BODY 태그 내에 있는 내용만 전달되며 BODY 태그 밖에 있는 HEAD 태그 내의 내용 등은 없습니다. BODY 태그 밖에 있는 내용을 처리하기 위해서는 output 실행시간 필터함수를 이용하여야 합니다.
output 실행시간 필터함수 정의하기
output 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function output_skin($contents, $config [, ......]) {
......
return $contents;
}
output 실행시간 필터함수는 php 스크립트의 실행이 종료되기 직전 출력버퍼 내용으로 부터 HTML 스크립트 문서를 생성한 직후에 실행됩니다. 따라서 $contents에는 생성된 HTML 스크립트 문서의 내용이 담겨있으며 이 함수에 의해 리턴된 값이 브라우저로 전송됩니다.
각 템플릿 문서에 허용필터명령을 지정한 경우에 output 실행시간에 처리되는 필터함수는 모든 템플릿 문서에 적용된 허용필터명령의 조건을 모두 만족해야 합니다.

Posted by 방글24
phpsource/템플릿2006. 9. 29. 09:46
written: Jan 28 2002
last modified: Oct 26 2006
템플릿변수에 관련된 용어 정리
후키템플릿에서 지원되는 템플릿변수(template variable)는 변수, 스위치문, 다이나믹 블록, 하위템플릿 인클루드입니다. 그동안 이들 변수를 호칭할 때 단순문, 블록문, 인클루드문 등 통일되지 못한 용어를 사용하여 왔습니다. 이를 정리할 필요가 있어 앞으로는 아래 표에서와 같이 단순변수, 조건변수, 블록변수, 파일변수라는 용어로 통일하여 호칭하고자 합니다.
< 템플릿변수 용어(1.2.0 버전부터) >
변경전 변경후 구문형식 예
변수,템플릿변수,단순문 단순변수 {VAR}
스위치문 조건변수 {VAR, caseA | caseB}
다이나믹 블록,블록문 블록변수 {@VAR}블록내용{/}
하위템플릿 인클루드,인클루드문 파일변수 {#./test.htm}
템플릿변수의 구문 형식
1.2.0 버전부터 템플릿변수의 구문 형식이 아래와 같이 정리되었습니다. 반복문 위치에는 여러가지 변수옵션을 지정할 수 있으며, 초기값 위치에는 필터명령을 지정할 수 있습니다.
< 변수 구문 형식 >
종 류 1.1.1 버전까지의 구문형식 1.2.0 버전부터의 구문형식
단순변수 {변수명::초기값} {변수명;변수옵션;필터명령}
{&변수명;변수옵션;필터명령}변수내용{/} *1
조건변수 {변수명::초기값,경우의수} {변수명;;초기값,경우의수}*2
{?변수명;변수옵션;필터명령,경우의수}*3
{?변수명;변수옵션;필터명령}경우의수{/}
블록변수 {@변수명}블록내용{/변수명} {@변수명;변수옵션;필터명령}블록내용{/}
파일변수 {#파일명} {#변수명;변수옵션;필터명령}파일명{/}
*1 [주의] - 2006.10.26

단순변수의 새로운 구문형식 {&변수명}{/}을 웹에디터에서 사용할 때 문제가 좀 있습니다.

"&" 문자가 HTML 에디터에서 "&nbsp;", "&lt;", "&gt;", "&amp;", "&quot;", "&#039;" 등에서 자주 사용되다보니 발생하는 문제입니다.

따라서 단순변수의 새로운 구문형식인 {&변수명}{/}을 1.2.0 패치버전(또는 다음버전)에서는 더 이상 사용하지 않겠습니다.
*2 [상위호환성 삭제] - 2008.06.06

상위버전에서는 이 형식({변수명;;초기값,경우의수})을 지원하지 않습니다.
*3 [오기수정] - 2008.06.06

{?변수명;변수옵션;필터명령,경우의수}은 허용하지 않는 구문형식입니다.
{VAR1;;100}
{&VAR1;;100}{/}
위의 2가지 단순변수들은 동일한 결과를 나타냅니다. 템플릿 변수 VAR1을 컴파일하면 단순변수 VAR1에는 "100" 값이 저장됩니다.
1.2.0 버전부터는 css 문과의 충돌을 피하기 위하여 반복문과 초기값을 구분하는 구분자를 콜론(:) 대신에 세미콜론(;)을 사용합니다.
{변수명:반복문,경우의수}과 {변수명:반복문}을 제외한 舊구문형식에서 콜론문자(:)를 사용한 구문형식은 1.2.0 버전에서도 계속 사용할 수 있으나 향후에 버전업될 버전과의 호환성을 보증할 수는 없으니 콜론문자(:) 대신에 세미콜론문자(;)를 이용하여 템플릿 문서를 작성하시기 바랍니다.
변수 옵션
변수 옵션은 1.2.0 버전부터 지정할 수 있으며 지정할 수 있는 변수 옵션으로는 repeat, ctype, allow_filter, tr가 있습니다. 자세한 것은 아래표의 각 항목을 참조바랍니다.
< 변수 옵션 >
변수 옵션 기 능 참 조
repeat 반복문 7.1.반복문
ctype 내용 형식 7.2.내용 형식
allow_filter 필터 처리 8.2.필터 명령
tr TR 용법 7.9.TR 용법
{&VAR2;repeat=1-3;="[[["."{_SELF}"."]]]"}변수내용{/}
템플릿변수 VAR2을 컴파일/할당하면 VAR2.1, VAR2.2, VAR2.3에는 모두 "[[[변수내용]]]" 값이 저장됩니다.
{?VAR;1-3;2}A|B|C{/}
{?VAR;repeat=1-3;2}A|B|C{/}
위의 2가지 조건변수들은 동일한 결과를 나타냅니다.
[code html;gutter:false] {@BLOCK;ctype=text&allow_filter=userfunc;=|userfunc()} 블록내용 {/} {#;allow_filter=func_a,func_b,=;=|func_a(); ="{_SELF}"."tail_value"; =|func_b(); }./test.htm{/}[/code]
위와 같은 표현들도 새로운 구문형식에 맞게 작성된 것으로 정상적으로 동작합니다. 그러나 템플릿 문서에서는 가능한 너무 복잡한 표현은 피하라고 권하고 싶습니다.
필터 명령
지정할 수 있는 필터 명령에는 필터 상수, php 명령, 초기화 명령, 사용자 정의 필터 함수, 내장 필터 함수가 있습니다. 자세한 것은 "8.2.필터 명령"을 참조바랍니다.
변수명 생략
모든 템플릿변수(단순문,스위치문,블록문,인클루드문)의 변수명를 생략할 수 있습니다.
변수명을 생략하면 새롭게 추가된 변수명 예약어인 "_AUTO"(예약어 _AUTO는 향후 버전에서 그 이름이 변경될 수 있으므로 사용자가 직접 사용할 수 없음)로 시작되는 변수명이 자동 지정됩니다.
{&}{/} --->> {&_AUTO}{/}
{?}a|b|c{/} --->> {?_AUTO}a|b|c{/}
{@}블록내용{/} --->> {@_AUTO}블록내용{/}
{#}파일명{/} --->> {#_AUTO}파일명{/}
블록변수의 변수명을 생략한 경우에는 블록변수에 대한 assign() 함수를 지정하지 않아도 자동 할당되어 처리됩니다. 자세한 것은 "5.3.블록변수"의 "자동 할당 기능"을 참조바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 21:46
written: Jan 28 2002
last modified: Sep 20 2006
4가지 자료구조
후키템플릿에서 사용하는 템플릿에 관련된 자료구조는 4가지 형태입니다.
  1. 템플릿 문서(파일 또는 NO파일)
  2. 템플릿 구조
  3. 템플릿 변수
  4. HTML 문서
< 자료구조 >
< 템플릿 관련 자료구조 >
자료 구조 저장 위치
템플릿 문서 파일은 서버 디스크, NO파일은 php 문서에서 문자열로 지정
템플릿 구조 서버 메모리
템플릿 변수 서버 메모리
HTML 문서 서버 메모리, 인터넷망, 웹브라우저
템플릿 문서(template document)
템플릿 문서는 일반적인 HTML 문서와 동일합니다. 차이점은 그 안에 템플릿 변수가 들어있다는 것뿐입니다. 템플릿 문서는 대부분 파일 형태로 제공됩니다. 이러한 템플릿 파일은 나모 웹에디터 또는 드림위버와 같은 HTML 제작툴을 이용하면 멋진 문서를 아주 쉽고도 빠르게 작성할 수 있습니다.
1.0.0 버전부터는 템플릿이 파일이 아니라 DB 등에 저장되어 문자열 형태로 제공될 수 있으며 이러한 템플릿 형식을 NO파일이라 합니다.
템플릿 구조(template structure)
define() 함수를 이용하여 템플릿 문서를 메모리상에 올려놓을 수 있습니다. 템플릿 문서 구조와는 자료 구조 형태가 다소 다릅니다. 템플릿 문서에는 HMTL과 템플릿 변수가 뒤썩여있지만 메모리에 올려진 템플릿 구조를 보면 HTML 문서와 템플릿 변수가 질서정연하게 분류되어 저장되어 있습니다. 아울러 파일에 관한 정보(파일명, 파일이 최종 수정된 시간, 내포된 블록에 대한 정보 등)가 잘 정돈되어 있습니다.
< 템플릿 구조의 구성 >
< 템플릿 저장 장소 >
구분 FastTemplate 후키템플릿
사용 함수 define(
 array(
   "템플릿명"=>"템플릿 파일명"
 )
)
parse("템플릿 변수명", "템플릿명")
define("템플릿명", "템플릿파일명")

또는

define("템플릿명", "템플릿문자열")
템플릿 저장위치 parse 함수 실행시 $this->템플릿명에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨. $this->템플릿 구조[템플릿명]에 템플릿 문서로부터 읽어들인 템플릿을 컴파일하여 템플릿환경, HTML문서와 템플릿변수가 분리되어 저장됨.
후키템플릿에서 사용하는 템플릿 구조의 자료구조는 잘 정리되어 있습니다. 템플릿 구조의 자료구조를 살펴보기 위해 아래와 같은 템플릿 예를 들어보겠습니다. define() 함수에 의해 구조분석이 끝나게 되면 생성된 객체의 템플릿 구조에는 아래와 같이 템플릿 내용이 저장됩니다. 아래 내용은 print_r() 함수로 표시한 예입니다.
 Array
(
[table] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => FILE
[filename] => table.htm
[filemtime] => 1011593178
[parent] =>
[child] => Array
(
[0] => row_block
)
)
)

[row_block] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => BLOCK
[parent] => table
[child] => Array
(
)
)
)

[*var_in_tpl] => Array
(
[row_block] =>
)
)
각 템플릿에 대한 일반적인 정보
위 자료구조의 내용을 개략적으로 살펴보면 "table", "row_block"은 템플릿명을 가리킨다. 이중에 "table"은 템플릿 파일인 table.htm로 부터 읽어들인 데이터를 분석한 템플릿 정보를 저장하였음을 나타내고 있고, "row_block"은 table.htm 내에 존재하는 블록변수(다이나믹블록)에 대한 템플릿 정보를 저장하고 있음을 나타내고 있습니다. 이러한 템플릿 환경에 대한 일반적인 정보는 "tpl_info"에 기록되어 있습니다. 블록변수(다이나믹블록)로부터 추출된 템플릿의 이름은 블록명과 동일합니다.
FastTemplate와는 다르게 후키템플릿에서는 블록변수(다이나믹블록)가 별도의 템플릿으로 기록되어 있습니다. 이것은 마치 FastTemplate에서 블록을 별도의 파일로 처리했을 때에 볼 수 있는 현상입니다. 결국 후키템플릿에서는 HTML 블록이 별도의 파일로 처리되나 아니면 블록변수(다이나믹블록)로 처리되나 템플릿 구조에 기록되는 결과는 거의 같습니다.
차이점이 있다면 템플릿을 별도의 파일로 구성하면 템플릿명을 임의로 지정할 수 있으나 블록변수(다이나믹블록)로 구성하면 템플릿명을 지정할 수 없으며 블록명이 곧 템플릿명이 된다는 것입니다.
후키템플릿에서는 define_dynamic 함수가 필요없다고 하였는데 그것은 템플릿 구조의 자료구조에서 보듯이 각 템플릿의 [템플릿명][tpl_info][child]를 보면 알 수 있기 때문입니다. 해당 템플릿에 포함된 블록이 이곳에 모두 기록되지요. 단, 모든 하위 블록이 모두 기록되는 것은 아니고 바로 밑에 있는 하위 블록만 기록됩니다.
각 템플릿은 양방향의 linked-list 자료구조로 설계되어 있기 때문에 만약 템플릿(또는 블록)에 포함된(중첩된) 하위 블록의 리스트를 알고 싶으면 템플릿 구조에서 [템플릿명(또는 블록명)][tpl_info][child]을 보면 그 하위 블록의 리스트를 연속적으로 얻을 수 있습니다.
각 템플릿 내용 분석
이제는 템플릿의 내용이 어떻게 기록되어 있는지 살펴보겠습니다. 템플릿 구조의 자료구조에서 각 템플릿에는 일반적인 정보를 나타내는 "tpl_info" 외에 템플릿의 실제 내용이 저장되는 "body_contents"가 있습니다. "body_contents"에는 바로 템플릿 내용을 템플릿 변수와 순수 HTML 소스로 분리하여 저장하는 곳입니다. 이를 원래 템플릿 내용으로 복원하려면 아래와 같이 하면 됩니다.
원래 템플릿 내용 =
body_contents[0] + {body_contents[1]} +
body_contents[2] + {body_contents[3]} +
body_contents[4] + {body_contents[5]} +
....... + ....... +
body_contents[마지막 첨자]
각 템플릿에 존재하는 템플릿 변수
마지막으로 설명 안된 부분이 "*var_in_tpl"입니다. 이것은 define() 함수를 실행하는 중에 발생한, 즉 템플릿 구조분석을 하는 중에 발생한 템플릿 변수를 기록하는 곳으로 각 템플릿 파일에 선언된 템플릿 변수와 블록변수(다이나믹블록)명에 해당하는 템플릿변수가 이곳에 기록됩니다.
템플릿 table에 포함된 블록변수(다이나믹블록)에 해당하는 템플릿 변수 {row_block}의 초기값(null로 지정되어 있음)을 지정하는 곳이 바로 "*var_in_tpl"입니다. 여기에 기록된 템플릿 변수값들은 임시로 기록되어 있는 값이며 define() 함수가 종료될 때 "*var_in_tpl"의 내용이 템플릿 변수 영역에 일괄 할당됩니다.
템플릿 변수(template variable)
assign() 함수에 의해 각 템플릿 변수에 대한 변수값이 지정됩니다. 변수값으로는 문자열을 직접 할당할 수도 있고, 템플릿(또는 블록)의 내용을 할당할 수도 있습니다. 템플릿(또는 블록)의 내용을 할당할 때는 할당하기 전에 템플릿 내에 있는 또 다른 변수부터 미리 지정된 값으로 대치하게 됩니다.
결국 템플릿 변수에 할당된 값에는 또 다른 변수가 포함될 수 없습니다. 템플릿 변수에 있는 값들은 output() 함수에 의해 바로 브라우저로 전송할 수 있는 상태로 존재하고 있습니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); $tpl->assign( array( 'YEAR' => '2001', 'MONTH' => '12' ) ); $tpl->assign('MAIN', 'cal'); [/code]
예를 들어 템플릿 파일 "calendar.htm"에 "{YEAR}년 {MONTH}월"라는 내용이 들어있을 때, 위와 같이 PHP 코드를 수행한다면 템플릿 변수에는 아래와 같이 총 3개의 변수값이 존재합니다.
템플릿 변수["YEAR"] = "2001"
템플릿 변수["MONTH"] = "12"
템플릿 변수["MAIN"] = "2001년 12월"
구분 FastTemplate 후키템플릿
사용 함수 assign("템플릿 변수명1", "문자열") parse("템플릿 변수명2", "템플릿명") assign("템플릿 변수명1", "문자열") assign("템플릿 변수명2", "템플릿명")
템플릿 저장위치 $this->PARSEVARS[템플릿 변수명]에 assign() 함수로 지정된 문자열과 parse 함수에 의해 템플릿을 해석한 결과값이 저장됨. parse 함수를 수행하게 되면 동시에 $this->템플릿 변수명에도 템플릿을 해석한 결과값이 저장됨 $this->템플릿 변수[템플릿 변수명1]에는 assign() 함수로 지정된 문자열이 저장되며 $this->템플릿 변수[템플릿 변수명2]에는 템플릿의 내용(템플릿 내의 또 다른 변수가 처리된 후)이 저장됨
HTML 문서(페이지 문서)
템플릿 변수에는 항상 순수 HTML 코드만 들어 있으며 여기에는 어떠한 템플릿 변수도 포함되어 있지 않습니다. output 함수(1.2.0 이전 버전에서는 FastPrint() 함수)에 의해 웹브라우저로 보내지게 되는 템플릿 변수 내용이 바로 웹페이지를 구성하는 HTML 문서가 됩니다.
템플릿명 및 변수명을 정할 때 규칙
FastTemplate에서의 규칙
FastTemplate에서는 파싱결과를 템플릿 변수명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 또한 템플릿 파일로 부터 읽어들이는 템플릿도 템플릿명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 이러한 이유로 해서 클래스 내부에서 정의하여 사용되고 있는 멤버변수와 충돌이 일어날 가능성이 있지요.
FastTemplate에서 클래스 내부에서 정의하여 사용하고 있는 멤버변수로는 $FILELIST, $DYNAMIC, $PARSEVARS, $LOADED, $HANDLE, $ROOT, $WIN32, $ERROR, $LAST, $STRICT 등이 있습니다. 이와 같이 내부에서 정의하여 사용하고 있는 멤버변수와 동일하게 템플릿명 또는 템플릿 변수명으로 사용한다면 충돌이 일어나 프로그램이 정상적으로 동작하지 않게 될 것입니다.
템플릿명과 템플릿 변수명를 기반으로 단순변수 형태의 멤버변수를 정의하여 사용하기 때문에 템플릿명과 템플릿 변수명은 반드시 일반 PHP 변수명을 정할 때 지켜야 할 규칙을 따라야 합니다. 즉, 영문자, 숫자 및 밑줄 만을 이용하여야 별 문제가 생기지 않을 것입니다.
후키템플릿에서의 규칙
후키템플릿에서는 템플릿 또는 템플릿 변수를 별도의 멤버로 구분하여 저장하도록 되어 있습니다.
사용 함수 저장 위치
define("템플릿명", "템플릿 파일명") $this->템플릿 구조[템플릿명]에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨
assign("변수명", "문자열") $this->템플릿 변수[변수명]에 "문자열"이 저장됨
assign("변수명", "템플릿명") $this->템플릿 변수[변수명]에 템플릿 내에 있는 또 다른 변수가 모두 처리된 후 그 결과값이 저장됨
위와 같이 후키템플릿에서는 템플릿명과 템플릿 변수명을 서로 다른 배열 변수(템플릿 구조 및 템플릿 변수)에 배열 첨자를 기반으로 기록하기 때문에 충돌가능성을 원천적으로 방지하고 있습니다. 따라서 템플릿명 또는 템플릿 변수명을 지을 때 알파벳, 숫자, 밑줄만으로 구성되어져 있다면 어떤 이름을 사용하더라도 상관없습니다. 사실 FastTemplate와는 다르게 템플릿명과 템플릿 변수명이 배열 첨자로 사용되기 때문에 #, (, ), ? 등과 같은 특수문자를 이름으로 사용할 수도 있겠으나 향후 상위 버전과의 호환성을 염두에 둔다는 의미에서 이를 지원하지 않겠습니다.
따라서 후키템플릿에서는 일반적인 언어에서와 같이 변수명을 영문자, 숫자, 밑줄 및 하이픈으로 제한하며 첫문자는 반드시 영문자이어야 합니다. 영문자는 대소문자를 구별합니다. 이러한 규칙을 지킨다면 어떠한 이름을 사용하여도 관계없습니다. 단 한가지 예외사항으로 "GLOBALS"를 변수명으로 사용하지 말기 바랍니다. 이것조차 지원하려고 하였으나 PHP 전역변수 처리와 관련하여 충돌되는 부분이 있어 어쩔 수 없이 예외로 처리하게 되었습니다.
그리고 클래스 내부에서 이미 "*var_in_tpl"를 템플릿 구조의 배열 첨자로 사용하고 있습니다. 이러한 특수문자들은 향후에도 클래스 내부에서 어떠한 형태로든지 사용될 수 있으므로 템플릿명과 템플릿 변수명을 정할 때는 이러한 특수문자들을 사용하지 말기 바랍니다.
템플릿 변수명을 정할 때 또 하나 주의할 것이 있습니다. 템플릿 내에 블록이 존재하는 경우 이 블록의 이름(블록명)은 클래스 내부에서 임의대로 템플릿명과 템플릿 변수명으로도 사용되므로 블록명에 해당하는 템플릿명과 템플릿 변수명은 사용하지 말기 바랍니다.

Posted by 방글24