phpsource/템플릿2007. 9. 1. 17:21
written: Sep 1 2007
Template Variable
Template variable is enclosed with the begin tag {?= and end tag ?}. Template variable to be replace is written like this. {?=$TEMPO_VAR?}.
[code html;gutter:false] <p>[[[ {?=$TEMPO_VAR?} ]]]</p> [/code]
< Template file : tempo.sample.htm >
[code php;gutter:false] <?php require_once('class.Tempo.php'); $tempo = new Tempo; $tempo->parse('sample', 'tempo.sample.htm'); $TEMPO_VAR = 'The value assigned by PHP global variable'; print $sample->assign(); $tempo->close($sample); ?> [/code]
< PHP coding >
[code html;gutter:false] <p>[[[ The value assigned by PHP global variable ]]]</p> [/code]
< Result >
BLOCK element
BLOCK allows you to set dynamic content within a static template. The notation of the block element of TEMPO and the Zope ZPT is similar. Well, with tempo you now can write :
[code html;gutter:false] <table> <tr> <th>classify</th> <th>column1</th> <th>column2</th> <th>column3</th> </tr> <tr tempo:id="eLoop"> <td>{?=$this->column0?}</td> <td>{?=$this->column1?}</td> <td>{?=$eLoop->column2?}</td> <td>{?=$eLoop->column3?}</td> </tr> </table> [/code]
< Template contents >
TEMPO attribute statements
These are the TEMPO attribute statements:
  • tempo:id - block handle. it is a unique identifier.
  • tempo:omit - remove tag, contents or block.
  • tempo:ctype - set contents type(text, html, php or not).
Tag attribute statement has a name and its value.
tempo:id statement
The block element on which a statement is defined is a unique identifier in the current HTML document. For example,
tempo:id="eLoop"
tempo:omit statement
remove tag, contents or block.
[code html;gutter:false] <html tempo:omit="tag"> <head tempo:omit="block"> <title tempo:id="docTitle" tempo:omit="tag">Template file open</title> </head> <body tempo:omit="tag"> <p><?php print $docTitle->outerHTML; ?></p> <p>Welcome to tempo.phpclass.com!</p> <p tempo:omit="content">(oct 3, 2007)</p> </body> </html> [/code]
< Template contents : tempo.sample.htm >
[code php;gutter:false] <?php require_once('class.Tempo.php'); $tempo = new Tempo; $tempo->parse('sample', 'tempo.sample.htm'); print $sample->assign(); $tempo->close($sample); ?> [/code]
< PHP coding >
[code html;gutter:false] <p>Template file open</p> <p>Welcome to tempo.phpclass.com!</p> <p></p> [/code]
< Result(code) >
tempo:ctype statement
[code php;gutter:false] <table border=1> <tr> <th>ctype</th><th>result</th> </tr> <tr> <td>default</td><td><div><span style="color:red;"><?=$VAR?></span></div></td> </tr> <tr> <td>text</td><td><div tempo:ctype="text"><span style="color:red;"><?=$VAR?></span></div></td>v </tr> <tr> <td>html</td><td><div tempo:ctype="html"><span style="color:red;"><?=$VAR?></span></div></td> </tr> <tr> <td>php</td><td><div tempo:ctype="php"><span style="color:red;"><?=$VAR?></span></div></td> </tr> </table> [/code]
< Template contents : tempo.sample.htm >
[code php;gutter:false] <?php require_once('class.Tempo.php'); $tempo = new Tempo; $tempo->parse('sample', 'tempo.sample.htm'); $VAR = 'apple'; print $sample->assign(); $tempo->close($sample); ?> [/code]
< PHP coding >
ctype result
default
apple
text <span style="color:red;"><?=$VAR?></span>
html <?=$VAR?>
php <span style="color:red;">apple</span>
tempo:include statement
You can specify which file to include in template file. (Like header.html and footer.html).
[code php;gutter:false] [[[ {?=$TEMPO_VAR?} ]]] [/code]
< Template file : tempo.sub.htm >
[code html;gutter:false] <p tempo:include="tempo.sub.htm"></p> [/code]
< Template file : tempo.main.htm >
[code php;gutter:false] <?php require_once('class.Tempo.php'); $tempo = new Tempo; $tempo->parse('eRoot', 'tempo.main.htm'); $TEMPO_VAR = "The value assigned by PHP global variable"; print $eRoot->assign(); $tempo->close('eRoot'); ?> [/code]
< PHP coding >
[code html;gutter:false] <p>[[[ The value assigned by PHP global variable ]]]</p> [/code]
< Result >
Auto adjust path
Tempo will automatically adjust HTML resource(image, link etc) path.

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

{Tempo}5.Example - Repeat Block  (0) 2007.09.01
{Tempo}4.Class Methods  (0) 2007.09.01
{Tempo}2.Step by step  (0) 2007.09.01
{Tempo}1.Introduction  (0) 2007.09.01
{후키템플릿}9.5.게시판 목록보기 구현  (0) 2006.11.03
Posted by 방글24
phpsource/템플릿2007. 9. 1. 17:17
written: Sep 1 2007
Learn howto step by step
The main steps are:
  1. Prepare Template contents
  2. Include the tempo class(tempo)
  3. Instantiate class
  4. Parse the template contents
  5. Set variable
  6. Assign the template contents
  7. Output the assigned contents
  8. Clear the parsed contents
1. Prepare Template contents
A template contents(file or string) is basically an HTML document that also contain variable substitutions (enclosed with the begin tag {?= and end tag ?}) and special HTML tag attributes "tempo:statemants".
[code html;gutter:false] <table> <tr> <th>column1</th> <th>column2</th> <th>column3</th> </tr> <tr tempo:id="eLoop"> <td>{?=$column1?}</td> <td>{?=$column2?}</td> <td>{?=$column3?}</td> </tr> </table> [/code]
2. Include the tempo class
You should first include the tempo class(class.tempo.php) by require_once() or include_once(). Here is how you create an instance of Tempo in your PHP scripts.
[code php;gutter:false] require_once('somewhere/class.Tempo.php'); [/code]
3. Instantiate class
Instantiate class using operator new.
[code php;gutter:false] $tempo = new Tempo; [/code]
4. Parse the template contents
Parse the template contents(file or string) by its method parse() or parse_str(). First parameter is the template handle corresponding the template contents to be processed.
[code php;gutter:false] $tempo->parse('eRoot', 'templates/tempo.sample.htm'); [/code]
5. Set variable
There is no method for setting variable. You are able to use global variables in PHP.
[code php;gutter:false] $column1 = 'apple'; $column2 = 'banana'; $column3 = 'orange'; [/code]
6. Assign the template contents
This inserts the values of all the variables that have been set into the template. First parameter of parse() method, template handle name is the created template object name.
[code php;gutter:false] $resultHTML = $eRoot->assign(); [/code]
7. Output the assigned contents
You are able to use the PHP built-in function print or etc to output the assigned contents.
[code php;gutter:false] print $resultHTML; [/code]
8. Clear the parsed contents
This clear the parsed contents. Using method close() isn't usually necessary, the parsed contents is automatically cleared at the end of the script's execution.
[code php;gutter:false] $tempo->clear('eRoot'); [/code]

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

{Tempo}4.Class Methods  (0) 2007.09.01
{Tempo}3.Template contents  (0) 2007.09.01
{Tempo}1.Introduction  (0) 2007.09.01
{후키템플릿}9.5.게시판 목록보기 구현  (0) 2006.11.03
{후키템플릿}8.3.필터 상수  (0) 2006.11.03
Posted by 방글24
phpsource/템플릿2007. 9. 1. 17:09
written: Sep 1 2007
 
This document is not the official document in the version which is to in the process of developing. When the hereafter official document is announced consequently, the contents could more or less be changed.
Table of Contents
What is Tempo?
TEMPO(acronym for "TEMPlate Object") is a template engine for PHP. A template is an HTML document with variables in it. Tempo template engine provide basic variable substitution and dynamic block functionality. Here is a simple template with one variable ('{?=$name?}');
[code html;gutter:false] <p>Hello {?=$name?}. How are you?</p> [/code]
When a template is parsed, the variables are interpolated to HTML document.
[code html;gutter:false] <table> <tr> <th>column1</th> <th>column2</th> <th>column3</th> </tr> <tr tempo:id="eLoop"> <td>{?=$column1?}</td> <td>{?=$column2?}</td> <td>{?=$column3?}</td> </tr> </table> [/code]
The notation of the block element 'eLoop' and the Zope ZPT is similar(see zope websize).
Installation
Simply copy the class file somewhere where your script can include it, and then include it.
[code php;gutter:false] <?php require_once('somewhere/class.Tempo.php'); . . . ?> [/code]
License
hwooky's tempo(template object) is licensed using LGPL.
Copyright (c) 2006-2007 Wookyung Hwang(hwooky@phpclass.com).
All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

-GNU LESSER GENERAL PUBLIC LICENSE (LGPL)

Address Bug Reports or Comments on THIS LIBRARY ONLY to
Wookyung Hwang, hwooky@phpclass.com
The latest version of this class should be available from the following locations:
http://tempo.phpclass.com

For more info about hwooky's tempo(template object),
visit www.phpclass.com

Posted by 방글24
phpsource/템플릿2006. 11. 3. 14:00
written: Jan 28 2002
last modified: Nov 03 2006
게시판 목록보기에서의 템플릿 적용
[code html;gutter:false] <!-- NAME: listform.htm --> <!-- hTemplate Ver: 1.2.0 --> <HTML> <HEAD> <TITLE>{w.HEAD_TITLE}</TITLE> <STYLE> a:link { text-decoration:none; color:steelblue; } a:visited { text-decoration:none; color:steelblue; } a:active { text-decoration:underline; color:steelblue; } a:hover { text-decoration:underline; color:black; } BODY, table, tr, th, td, input, textarea { font-family: 굴림, 굴림체, verdana, arial, helvetica, sans-serif; } </STYLE> <SCRIPT language=javascript> <!-- function hBoardGoHref(href) { location.href = href; } //--> </SCRIPT> </HEAD> <BODY> <TABLE border="0" cellpadding="0" cellspacing="0" width="700" align="center"> <TR> <TD> <TABLE border="0" cellpadding="0" cellspacing="0" width="100%"> <TR> <TD height="47" align="center"><B><FONT color="navy"> *** 게시판 목록보기 실험 ***</FONT></B> </TD> </TR> </TABLE> <TABLE border="0" cellpadding="0" cellspacing="0" width="100%"> <TR> <TD height="30" align="right"> 총 게시물수 : {w.TOTAL_ARTICLE} / 총 페이지수 : {w.TOTAL_PAGE} </TD> </TR> </TABLE> <TABLE border="1" cellspacing="0" bordercolordark="white" bordercolorlight="#FF99FF" width="100%"> <TR> <TD bgcolor="#FFCCFF" height="30" align="center" width="7%">번호</TD> <TD bgcolor="#FFCCFF" height="30" align="center" width="12%">성명</TD> <TD bgcolor="#FFCCFF" height="30" align="center" width="60%">제목</TD> <TD bgcolor="#FFCCFF" height="30" align="center" width="12%">날짜</TD> <TD bgcolor="#FFCCFF" height="30" align="center" width="9%">조회수</TD> </TR> <!-- BEGIN DYNAMIC BLOCK: block_list --> <TR> <TD height="24" align="center">{r.NO}</TD> <TD height="24" align="center">{r.NAME} </TD> <TD height="24" align="left">{r.TIELE} </TD> <TD height="24" align="center">{r.DATE} </TD> <TD height="24" align="center">{r.HITS} </TD> </TR> <!-- END DYNAMIC BLOCK: block_list --> </TABLE> <TABLE border="0" cellpadding="0" cellspacing="0" width="100%"> <TR> <TD height="30" align="center"> {w.PP, <A href="javascript:hBoardGoHref('{w.PP_HREF}')"> <IMG src="imgs/i_prev.gif" border="0" width="33" height="17" alt="이전 페이지로 이동"> </A> } {w.NP, <A href="javascript:hBoardGoHref('{w.NP_HREF}')"> <IMG src="imgs/i_next.gif" border="0" width="32" height="17" alt="다음 페이지로 이동"> </A> } {w.PB, <A href="javascript:hBoardGoHref('{w.PB_HREF}')"> <IMG src="imgs/prev_pageblock.gif" border="0" width=14 height=12 alt="이전 페이지 블록으로 이동"> </A> } {w.FP, <A href="javascript:hBoardGoHref('{w.FP_HREF}')" title="첫 페이지로 이동"> [1] </A> ... } {s.FLAG;9, {s.NUM;} | <A href="javascript:hBoardGoHref('{s.HREF;}')" title="{s.NUM;} 페이지로 이동"> [{s.NUM;}] </A> } {w.LP, ... <A href="javascript:hBoardGoHref('{w.LP_HREF}')" title="마지막 페이지로 이동"> [{w.LN}] </A> } {w.NB, <A href="javascript:hBoardGoHref('{w.NB_HREF}')"> <IMG src="imgs/next_pageblock.gif" border="0" width=14 height=12 alt='다음 페이지 블록으로 이동'> </A> } </TD> </TR> </TABLE> </TD> </TR> </TABLE> </BODY> </HTML> [/code]
브라우저 화면에 나타난 템플릿 파일
위의 템플릿 파일 listform.htm을 브라우저에서 보면 아래와 같을 것입니다.
{w.TOTAL_ARTICLE}, {w.TOTAL_PAGE}, {r.NO}, {r.NAME}, {r.TITLE}, {r.DATE}, {r.HITS}
"2.1.템플릿 자료 구조"에서 변수명을 지정할 때는 일반적인 언어에서와 같이 변수명을 영문자, 숫자, 밑줄 및 하이푼으로 제한하며 첫문자는 반드시 영문자이어야 한다고 하였습니다. 변수명을 나타낼 수 있는 또 다른 특수문자가 있는데 그 중에 하나가 마침표(.)입니다.
마침표는 assign() 함수에서 하나의 템플릿 변수의 값으로 배열을 지정할 때 사용되는 특수문자입니다. 이에 대한 문법적인 자세한 내용은 "3.4.assign()"에서 "assign() 함수의 두 번째 인수로 배열을 지정할 때" 항목을 참조하기 바랍니다.
case가 하나뿐인 조건변수(스위치문)들
< 템플릿의 단일 조건변수(스위치문) >
조건변수(스위치문)에 대한 자세한 것은 "5.2.조건변수"을 참조하기 바랍니다.
이 문법에 의하면 템플릿 변수 {w.PP}, {w.NP}, {w.PB}, {w.FP}, {w.LP}, {w.NB}의 값이 0이면 조건변수(스위치문) 뒤에 있는 내용을 출력하지 않고 1이면 출력합니다. 예를 들면 {w.FP} 값이 1이면 조건변수(스위치문) 뒤의 내용인 "[1]..."가 브라우저에 보이게 되는 것이지요.
case가 여러개인 조건변수(스위치문)와 반복문
< 템플릿의 복수 case문 & 반복문 >
템플릿 파일 내용 중에 이 부분이 가장 난해(?)할 것입니다. 이 문장은 둘로 나누어 생각해 볼 수 있습니다.
우선 ';' 문자를 제외한 나머지 부분 "{s.FLAG, {s.NUM}|[{s.NUM}]}"을 보면 이는 case가 2개인 조건변수(스위치문)입니다. 이 문법에 의하면 템플릿 변수 {s.FLAG}의 값이 1이면 {s.NUM}를 출력하고, 2이면 "[{s.NUM}]"를 출력합니다.
그 다음은 템플릿 변수명 중에서 ';9' 부분입니다. ';9'은 반복문을 나타냅니다.
현재 페이지가 14페이지라면 현재 페이지 블록은 아래와 같이 나타날 것입니다.
< 14페이지에 대한 페이지 블록 >
이러한 페이지 블록에 대하여 작성된 템플릿 파일을 보면 대략 아래와 같을 것입니다.
< 페이지 블록의 템플릿화 작업 >
이와 같이 동일한 구조로 반복되는 조건변수(스위치문)는 ';9'를 추가함으로 간단히 나타낼 수 있습니다.
PHP 코드 작성
아래는 템플릿 파일 listform.htm을 이용하여 게시판 목록보기를 구현한 PHP 코드입니다. 여기서는 게시물 내용 자체는 데이터베이스로부터 읽어와야 하기 때문에 이 부분은 생략되어 있습니다.
[code php;gutter:false] <?php /** * 페이지 하이퍼 링크에 대한 정보 수집 */ function get_page_info($total_pages, $curr_page, $list_perblock) { $prev_page = ($curr_page > 1) ? $curr_page - 1 : 0; $next_page = ($curr_page+1 <= $total_pages) ? $curr_page + 1 : 0; if ($total_pages <= 1) { $first_page = 1; } else { $t=(int)(($curr_page - 1) / $list_perblock) + 1; if ($t>1) $prev_block = $te = ($t - 2) * $list_perblock + 1; if ($total_pages>=$list_perblock && $curr_page>$list_perblock) $first_page = 1; $first_serial = 1+($t-1)*$list_perblock; $last_serial = ($t-1)*$list_perblock+$list_perblock; $last_serial = ($last_serial > $total_pages) ? $total_pages : $last_serial; if ($t*$list_perblock<$total_pages) { if ($total_pages>=$list_perblock&&$curr_page<$total_pages) $last_page = $total_pages; $next_block = $t*$list_perblock+1; } } return array($first_page, $last_page, $prev_page, $next_page, $prev_block, $next_block, $first_serial, $last_serial); } function href($query) { global $_SERVER; return $_SERVER['PHP_SELF'].($query ? "?$query" : ''); } function get_list_info($total_items, $curr_page, $items_perpage=15, $list_perblock=10) { $data = array(); /** * 총 페이지수를 구함 */ $total_pages = (int)(($total_items - 1) / $items_perpage + 1); /** * 현재페이지가 0보다 작거나 지정이 없으면 1페이지로 지정 */ if ((!$curr_page) || ($curr_page<=0) || ($curr_page>$total_pages)) $curr_page = 1; list($first_page, $last_page, $prev_page, $next_page, $prev_block, $next_block, $first_serial, $last_serial) = get_page_info($total_pages, $curr_page, $list_perblock); if ($last_serial) { if ($prev_block) { $data['whole']['PB_HREF'] = href("pg=$prev_block"); } if ($next_block) { $data['whole']['NB_HREF'] = href("pg=$next_block"); } if ($first_page) { $data['whole']['FP_HREF'] = href('pg=1'); } if ($last_page) { $data['whole']['LP_HREF'] = href("pg=$last_page"); $data['whole']['LN'] = $last_page; } } if ($prev_page) { $data['whole']['PP_HREF'] = href("pg=$prev_page"); } if ($next_page) { $data['whole']['NP_HREF'] = href("pg=$next_page"); } $data['whole']['PB'] = $data['whole']['PB_HREF'] ? true : false; $data['whole']['NB'] = $data['whole']['NB_HREF'] ? true : false; $data['whole']['FP'] = $data['whole']['FP_HREF'] ? true : false; $data['whole']['LP'] = $data['whole']['LP_HREF'] ? true : false; $data['whole']['PP'] = $data['whole']['PP_HREF'] ? true : false; $data['whole']['NP'] = $data['whole']['NP_HREF'] ? true : false; if ($last_serial) { $data['serial'] = array(); if ($first_serial && $last_serial) { for ($page=$first_serial; $page<=$last_serial; $page++) { $index = $page-$first_serial; $data['serial']['NUM'][$index] = $page; if ($page==$curr_page) { $data['serial']['FLAG'][$index] = 1; } else { $data['serial']['FLAG'][$index] = 2; $data['serial']['HREF'][$index] = href("pg=$page"); } } } } else { $data['serial']['FLAG'][0] = 0; $data['serial']['NUM'][0] = "1"; } $data['whole']['TOTAL_PAGE'] = $total_pages; $data['whole']['TOTAL_ARTICLE'] = $total_items; /** * 목록보기에 나타낼 시작 번호 및 마지막 번호를 구함 */ $start_num = $total_items - ($curr_page - 1) * $items_perpage; $last_num = $start_num - $items_perpage + 1; if ($last_num < 1) $last_num = 1; $data['whole']['START_NUM'] = $start_num; $data['whole']['LAST_NUM'] = $last_num; for ($i=$start_num;$i>=$last_num; $i--) { $data['list'][$start_num-$i]['NO'] = $i; /** * NAME, TITLE, DATE, HITS 값은 데이터베이스에서 가져올 수 있는 값 */ $data['list'][$start_num-$i]['NAME'] = ''; $data['list][$start_num-$i]['TITLE'] = ''; $data['list'][$start_num-$i]['DATE'] = ''; $data['list'][$start_num-$i]['HITS'] = ''; } return $data; } /** * No Cache */ header('expires: Thu, 19 Nov 1981 08:52:00 GMT'); header('cache-control:no-store,no-cache,must-revalidate,post-check=0,pre-check=0'); header('pragma: no-cache'); /** * hwooky Template */ include_once('./class/template/class.hTemplate.php'); if (!isset($_SERVER)) { $_SERVER = & $HTTP_SERVER_VARS; } $CACHE_PATH = null; // default(/tmp/hCache) 이용 $tpl = new hTemplate('./templates', array( 'update' =>$update, 'id' =>'test', 'path' => $CACHE_PATH, ) ); $tpl->define( array( 'list' => 'listform.htm' ) ); /** * get_list_info($total_items, $curr_page, $items_perpage=15, $list_perblock=10) * $items_perpage : 페이지당 항목수(초기 설정값 15) * $list_perblock : 블록당 페이지수(초기 설정값 10) * $total_items : 총 항목수(디비로부터 얻어냄) * $curr_page : 현재 페이지 */ $list = get_list_info(1000, $pg); $tpl->assign('w', $list['whole']); $tpl->assign(array( 's' => $list['serial'] )); if (is_array($list['list'])) { foreach($list['list'] as $subkey) { $tpl->assign('r', $subkey); $tpl->assign('block_list', 'block_list', true); } } $tpl->assign('LISTFORM', 'list'); $tpl->output('LISTFORM'); ?> [/code]
$list = get_list_info(1000, $pg)
이 함수를 통해 게시판 목록보기에 필요한 모든 정보를 돌려받습니다. 여기는 게시판을 만드는 것을 설명하는 곳이 아니며 단지 후키템플릿을 응용하는 방법을 설명하기 위하여 예로 작성된 함수이므로 게시판 소스로는 부족한 것이 있더라도 이해하여 주시기 바랍니다.
[code php;gutter:false] $list = array( 'whole' => array(게시판 전체에 필요한 정보), 'serial' => array(현재 페이지 블록에 대한 정보), 'list' => array(게시물 자체에 대한 정보) ); [/code]
각 정보별로 어떠한 데이터가 들어있는지 하나하나 자세히 살펴보도록 하겠습니다.
$tpl->assign('w', $list['whole']);
get_list_info(1000, $pg);에 의해 넘겨받은 $list 값 중에 $list['whole']의 값을 살펴보면 아래와 같습니다.
[code php;gutter:false] $list['whole'] = array( 'PB_HREF' => '/test/test.php?pg=1', 'NB_HREF' => '/test/test.php?pg=21', 'FP_HREF' => '/test/test.php?pg=1', 'LP_HREF' => '/test/test.php?pg=67', 'LN' => 67, 'PP_HREF' => '/test/test.php?pg=13', 'NP_HREF' => '/test/test.php?pg=15', 'PB' => 1, 'NB' => 1, 'FP' => 1, 'LP' => 1, 'PP' => 1, 'NP' => 1, 'TOTAL_PAGE' => 67, 'TOTAL_ARTICLE' => 1000, 'START_NUM' => 805, 'LAST_NUM' => 791 ); [/code]
이 값은 $tpl->assign('w', $list['whole']);에 의해 템플릿 변수 'w'에 할당하게 되면 아래와 같은 'w'에 속한 여러 개의 템플릿 변수가 생성됩니다.
< 생성된 템플릿 변수 >
템플릿 변수명 변수값 의미 출력값
{w.PB_HREF} /test/test.php?pg=1 Previous page Block 주소 /test/test.php?pg=1
{w.NB_HREF} /test/test.php?pg=21 Next page Block 주소 /test/test.php?pg=21
{w.FP_HREF} /test/test.php?pg=1 First Page 주소 /test/test.php?pg=1
{w.LP_HREF} /test/test.php?pg=67 Last Page 주소 /test/test.php?pg=67
{w.LN} 67 Last page Number 67
{w.PP_HREF} /test/test.php?pg=13 Previous Page 주소 /test/test.php?pg=13
{w.NP_HREF} /test/test.php?pg=15 Next Page 주소 /test/test.php?pg=15
{w.PB} 1 Previous page Block의 ON/OFF 스위치
{w.NB} 1 Next page Block의 ON/OFF 스위치
{w.FP} 1 First Page의 ON/OFF 스위치 [1]...
{w.LP} 1 Last Page의 ON/OFF 스위치 ...[67]
{w.PP} 1 Previous Page의 ON/OFF 스위치
{w.NP} 1 Next Page의 ON/OFF 스위치
{w.TOTAL_PAGE} 67 총 페이지수 67
{w.TOTAL_ARTICLE} 1000 총 항목수 1000
{w.START_NUM} 805 목록보기에 나타낼 시작 번호 805
{w.LAST_NUM} 791 목록보기에 나타낼 마지막 번호 791
$tpl->assign(array( 's' => $list['serial']));
get_list_info(1000, $pg);에 의해 넘겨받은 $list 값 중에 $list['serial']의 값을 살펴보면 아래와 같습니다.
[code php;gutter:false] $list['serial'] => array( 'FLAG' => array( '0' => 2, '1' => 2, '2' => 2, '3' => 1, '4' => 2, '5' => 2, '6' => 2, '7' => 2, '8' => 2, '9' => 2 ), 'NUM' => array( '0' => 11, '1' => 12, '2' => 13, '3' => 14, '4' => 15, '5' => 16, '6' => 17, '7' => 18, '8' => 19, '9' => 20 ), 'HREF' => array( '0' => '/test/test.php?pg=11', '1' => '/test/test.php?pg=12', '2' => '/test/test.php?pg=13', '4' => '/test/test.php?pg=15', '5' => '/test/test.php?pg=16', '6' => '/test/test.php?pg=17', '7' => '/test/test.php?pg=18', '8' => '/test/test.php?pg=19', '9' => '/test/test.php?pg=20' ) ); [/code]
이 값은 assign('s', $list['serial']);에 의해 템플릿 변수 's'에 할당하게 되면 아래와 같은 's'에 속한 여러 개의 템플릿 변수가 생성됩니다.
< 생성된 템플릿 변수 >
FLAG FLAG 값 NUM NUM 값 HREF HREF 값
{s.FLAG.0} 2 {s.NUM.0} 11 {s.HREF.0} /test/test.php?pg=11
{s.FLAG.1} 2 {s.NUM.1} 12 {s.HREF.1} /test/test.php?pg=12
{s.FLAG.2} 2 {s.NUM.2} 13 {s.HREF.2} /test/test.php?pg=13
{s.FLAG.3} 1 {s.NUM.3} 14 {s.HREF.3}  
{s.FLAG.4} 2 {s.NUM.4} 15 {s.HREF.4} /test/test.php?pg=15
{s.FLAG.5} 2 {s.NUM.5} 16 {s.HREF.5} /test/test.php?pg=16
{s.FLAG.6} 2 {s.NUM.6} 17 {s.HREF.6} /test/test.php?pg=17
{s.FLAG.7} 2 {s.NUM.7} 18 {s.HREF.7} /test/test.php?pg=18
{s.FLAG.8} 2 {s.NUM.8} 19 {s.HREF.8} /test/test.php?pg=19
{s.FLAG.9} 2 {s.NUM.9} 20 {s.HREF.9} /test/test.php?pg=20
페이지 블록에 대한 템플릿 파일 listform.htm의 내용을 보면 아래와 같습니다.
[code html;gutter:false] {s.FLAG;9, {s.NUM;} | <A href="javascript:hBoardGoHref('{s.HREF;}')" title="{s.NUM;} 페이지로 이동"> [{s.NUM;}] </A> } [/code]
이 템플릿 내용은 define() 함수에서 반복문 처리에 의해 템플릿 list의 내용이 아래와 같이 확장될 것입니다.
[code html;gutter:false] {s.FLAG.0, {s.NUM.0} | <A href="javascript:hBoardGoHref('{s.HREF.0}')" title="{s.NUM.0} 페이지로 이동"> [{s.NUM.0}] </A> } {s.FLAG.1, {s.NUM.1} | <A href="javascript:hBoardGoHref('{s.HREF.1}')" title="{s.NUM.1} 페이지로 이동"> [{s.NUM.1}] </A> } {s.FLAG.2, {s.NUM.2} | <A href="javascript:hBoardGoHref('{s.HREF.2}')" title="{s.NUM.2} 페이지로 이동"> [{s.NUM.2}] </A> } {s.FLAG.3, {s.NUM.3} | <A href="javascript:hBoardGoHref('{s.HREF.3}')" title="{s.NUM.3} 페이지로 이동"> [{s.NUM.3}] </A> } {s.FLAG.4, {s.NUM.4} | <A href="javascript:hBoardGoHref('{s.HREF.4}')" title="{s.NUM.4} 페이지로 이동"> [{s.NUM.4}] </A> } {s.FLAG.5, {s.NUM.5} | <A href="javascript:hBoardGoHref('{s.HREF.5}')" title="{s.NUM.5} 페이지로 이동"> [{s.NUM.5}] </A> } {s.FLAG.6, {s.NUM.6} | <A href="javascript:hBoardGoHref('{s.HREF.6}')" title="{s.NUM.6} 페이지로 이동"> [{s.NUM.6}] </A> } {s.FLAG.7, {s.NUM.7} | <A href="javascript:hBoardGoHref('{s.HREF.7}')" title="{s.NUM.7} 페이지로 이동"> [{s.NUM.7}] </A> } {s.FLAG.8, {s.NUM.8} | <A href="javascript:hBoardGoHref('{s.HREF.8}')" title="{s.NUM.8} 페이지로 이동"> [{s.NUM.8}] </A> } {s.FLAG.9, {s.NUM.9} | <A href="javascript:hBoardGoHref('{s.HREF.9}')" title="{s.NUM.9} 페이지로 이동"> [{s.NUM.9}] </A> } [/code]
템플릿 list에 있는 템플릿 변수를 모두 할당하고 나면 브라우저에는 아래와 같이 나타날 것입니다.
< 14페이지에 대한 페이지 블록 >
$tpl->assign('r', $subkey);
get_list_info(1000, $pg);에 의해 넘겨받은 $list 값 중에 $list['list']의 값을 살펴보면 아래와 같습니다.
[code php;gutter:false] $list['list'] = array( 0 => array( 'NO' => 1000, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ), 1 => array( 'NO' => 999, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ), 2 => array( 'NO' => 998, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ), . . . 13 => array( 'NO' => 987, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ), 14 => array( 'NO' => 986, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ), ) [/code]
이 값은 아래의 php 코드 foreach 문에 의해 템플릿 변수 'r'에 반복적으로 할당하게 됩니다.
[code php;gutter:false] if (is_array($list['list'])) { foreach($list['list'] as $subkey) { $tpl->assign('r', $subkey); $tpl->assign('block_list', 'block_list', true); } } [/code]
$list['list']은 총 15개의 부분배열로 구성되어 있으므로 foreach 문은 15번 반복하게 됩니다. $list['list'][0]부터 $list['list'][14]까지 순서대로 실행되겠지요. foreache 문을 처음 실행할 때 $subkey은 $list['list'][0]의 값이 들어가며, 두 번째 실행할 때 $subkey은 $list['list'][1]의 값이 들어갑니다. 이와 같이 마지막 $list['list'][14]까지 순서대로 $subkey에 할당되면서 실행되겠지요.
그럼 처음 foreach 문이 실행될 때를 살펴보겠습니다. 이 때 $subkey에는 $list['list'][0]의 값이 들어가며 그 내용은 아래와 같습니다.
[code php;gutter:false] $list['list'][0] = array( 'NO' => 1000, 'NAME' => '', 'TITLE' => '', 'DATE' => '', 'HITS' => '' ) [/code]
이 때 $tpl->assign('r', $subkey); 문장에 의해 템플릿 변수 'r'에 할당하게 되면 아래와 같은 'r'에 속한 여러 개의 템플릿 변수가 생성됩니다.
< 생성된 템플릿 변수 >
템플릿 변수명 변수값 의미 출력값
{r.NO} 1000 게시물 순서 1000
{r.NAME} 빈문자열 게시물 등록자명  
{r.TITLE} 빈문자열 게시물 제목  
{r.DATE} 빈문자열 게시물 등록날짜  
{r.HITS} 빈문자열 게시물 조회수  
foreach 문을 반복할 때마다 위와같이 매번 새로운 게시물 내용이 템플릿 변수 'r'에 할당되며 그것은 $tpl->assign('block_list', 'block_list', true); 문장에 의해 블록에 있는 템플릿 변수를 할당하며 그 결과를 템플릿 변수 block_list에 계속 누적합니다.
기타
기타 게시판에 관련된 소스 코드에 대한 설명은 여기서 하지 않겠습니다. 게시판 작성 요령에 대하여는 관련 서적을 참고하시기 바랍니다.
PHP 코드를 실행하였을 때 브라우저에 나타난 목록보기 화면
< 목록보기 화면 >

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

{Tempo}2.Step by step  (0) 2007.09.01
{Tempo}1.Introduction  (0) 2007.09.01
{후키템플릿}8.3.필터 상수  (0) 2006.11.03
{후키템플릿}6.2.미리정의된 템플릿변수  (0) 2006.11.02
{후키템플릿}5.4.파일 변수  (0) 2006.11.02
Posted by 방글24
phpsource/템플릿2006. 11. 3. 13:25
written: Nov 03 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
1.1.1 버전까지 사용하던 초기값에 해당하는 것이 필터 상수입니다. 초기값은 0.0.3 버전부터 지정할 수 있습니다.
필터상수 설정
0.0.3 ~ 1.1.1 버전까지의 초기값 설정
0.0.3 버전부터는 템플릿 문서(템플릿 파일, 템플릿 문자열) 내에서 템플릿 변수에 대한 초기값(default)을 설정할 수 있습니다.
{ROW::이곳에 초기값을 설정}
반복문을 사용하는 경우의 예를 들어보면 다음과 같습니다.
{ROW:5-7:이곳에 초기값을 설정하면 \{ROW.5\}부터 \{ROW.7\}까지 모든 템플릿 변수에 초기값이 할당됨}
1.2.0 버전의 필터 상수 설정
콜론(:) 대신에 세미콜론(;)으로 변수명과 필터상수를 구분합니다.
{ROW;;이곳에 필터상수를 설정}
반복문을 사용하는 경우의 예를 들어보면 다음과 같습니다.
{ROW;5-7;이곳에 필터 상수를 설정하면 \{ROW.5\}부터 \{ROW.7\}까지
모든 템플릿 변수에 상수값이 할당됨}
조건변수(스위치문)을 사용하는 경우의 예를 들어보면 다음과 같습니다.
{변수명;;2, 사과 | 배 | 오렌지}
{?변수명;;2} 사과 | 배 | 오렌지 {/}
{?변수명;;2} {%사과%} {%배%} {%오렌지%} {/}
필터상수의 실행시간
필터 상수는 템플릿 문서를 컴파일할 때  그 값이 처리되어 캐시에 저장됩니다. 따라서 다른 필터 명령과는 달리 그 값을 php 문서에서 임의로 변경할 수 없다는 의미에서 상수라고 표현하였습니다.

Posted by 방글24
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
phpsource/템플릿2006. 11. 2. 10:42
written: Jan 28 2002
last modified: Nov 02 2006
사용방법
템플릿 파일 내에 하위템플릿을 포함하는 복잡한 구조의 템플릿을 구성하는 경우를 살펴보겠습니다.
이러한 경우에는 인클루드하려는 하위템플릿 파일을 상위템플릿 파일 내에 <!--#include file="하위템플릿파일명"--> 또는 {#하위템플릿파일명}와 같이 표기합니다. 이와 같이 변수내용을 별도의 파일로 작성되어 컴파일할 때 변수내용을 읽어들이도록 작성된 템플릿 변수를 파일변수(인클루드문)라고 합니다.
<!--#include file="파일명"-->
{#파일명}
<!--#include file="하위템플릿파일명"--> 표기법은 SSI(Server Side Include) 문법으로 서버(HTTPd)에서 처리되는 태그입니다. 이 표기법의 장점은 드림위버에서 편집할 때 인클루드되는 파일을 함께 보며 작업할 수 있다는 것입니다.
구문 형식의 확장
1.2.0 버전부터 {#변수명}파일명{/}와 같은 구문형식을 사용할 수 있으며, 이전 버전에서 사용하던 {#파일명}도 앞으로도 계속 사용할 수 있습니다.
{#변수명;변수옵션;필터명령}파일명{/}
변수옵션과 필터명령은 1.2.0 버전부터 사용할 수 있습니다. {#변수명}파일명{/} 형식과 {#파일명} 형식을 구분하는 기준은 {#string} 에서 string이 실제로 존재하는 파일명이면 {#파일명} 형식으로 처리하고 존재하지 않는 파일명이면 {#변수명}파일명{/} 형식으로 처리합니다.
하위 템플릿 파일의 경로
하위템플릿 파일 include.htm은 템플릿 변수가 포함되어 있는 또 다른 템플릿 파일입니다. 하위템플릿의 경로는 현재 템플릿 문서에 대한 상대경로로 지정됩니다. 단, 상위디렉토리는 지정할 수 없습니다.
<!--#include file="sub/sub_include.htm"--> 또는
<!--#include file="./sub/sub_include.htm"--> 또는
{#sub/sub_include.htm} 또는
{#./sub/sub_include.htm} 또는
{#}./sub/sub_include.htm{/} 또는
{#}sub/sub_include.htm{/}
아래와 같이 절대경로를 지정할 수도 있습니다.
<!--#include file="/other-templates/include.htm"--> 또는
{#/other-templates/include.htm} 또는
{#}/other-templates/include.htm{/}
복잡한 구조의 템플릿 파일의 예
아래의 예는 최상위 템플릿 파일 "Main.htm"을 기점으로 연속적으로 수많은 하위템플릿 파일이 인클루드되어 있는 경우입니다.
< 그림1 템플릿 파일의 구성 >
이러한 경우의 각 템플릿 파일의 내용이 아래와 같다고 하지요.
최상위 템플릿 파일 Main.htm 내용:

main.htm
+----<!--#include file="include-1.htm"-->
+----<!--#include file="include-2.htm"-->


하위 템플릿 파일include-1.htm 내용:

include-1.htm

하위 템플릿 파일include-2.htm 내용:

include-2.htm
.....+----<!--#include file="include-21.htm"-->
.....+----<!--#include file="include-22.htm"-->


하위 템플릿 파일include-21.htm 내용:

include-21.htm
..........+----<!--#include file="include-211.htm"-->
..........+----<!--#include file="include-212.htm"-->


하위 템플릿 파일include-22.htm 내용:

include-22.htm

하위 템플릿 파일include-211.htm 내용:

include-211.htm
...............+----<!--#include file="include-2111.htm"-->
...............+----<!--#include file="include-2112.htm"-->


하위 템플릿 파일include-212.htm 내용:

include-212.htm

하위 템플릿 파일include-2111.htm 내용:

include-2111.htm
....................+----<!--#include file="include-21111.htm"-->
....................+----<!--#include file="include-21112.htm"-->


하위 템플릿 파일include-2112.htm 내용:

include-2112.htm

하위 템플릿 파일include-21111.htm 내용:

include-21111.htm

하위 템플릿 파일include-21112.htm 내용:

include-21112.htm
이제는 하위템플릿을 인클루드하기 위한 PHP 문서를 구성하여 보겠습니다.
[code php;gutter:false] <?php include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'main' => 'Main.htm' ) ); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
최상위 템플릿 파일에 대하여 define(), assign(), output()를 순서대로 실행하게 되면 아래와 같은 결과가 브라우저에 표시될 것입니다.
< 그림2 실행 결과 >
하위템플릿 파일의 처리순서
하위템플릿 파일에서도 일반 템플릿 파일과 동일하게 모든 기능을 사용할 수 있습니다. 그러면 그림1과 같은 템플릿 구조에서 하위템플릿 파일에 포함된 템플릿변수에 값은 언제 할당될까요?
최상위 템플릿 파일에 해당하는 템플릿 main을 assign() 함수에서 처리할 때 그 하위에 있는 모든 템플릿을 먼저 처리하게 됩니다. 그림1과 같은 경우라면 assign 처리되는 순서는 아래와 같습니다.
include-1.htm
include-21111.htm
include-21112.htm
include-2111.htm
include-2112.htm
include-211.htm
include-212.htm
include-21.htm
include-22.htm
include-2.htm
Main.htm
위와 같이 최하위 템플릿을 가장 먼저 처리하며 최상위 템플릿을 가장 뒤에 처리하게 됩니다.
파일변수에서 파일명의 변수처리
1.2.0 버전부터는 파일명을 변수로 처리하기 위해서는 아래와 같이 단순변수의 필터명령을 이용할 수 있습니다.
{#varname}{=gText}{/}

Posted by 방글24
phpsource/템플릿2006. 11. 2. 09:49
written: Jan 28 2002
last modified: Nov 02 2006
조건문
PHP 문서에서 아래와 같은 조건문을 많이 보셨을 것입니다.
[code php;gutter:false] <?php if ($image_check) { print '<img src="./images/email.gif">'; } ?>[/code]
 위와 같은 조건문에서 $image_check의 값이 1 또는 true면 괄호 안의 내용을 실행하고, 0 또는 false면 실행하지 않습니다.
후키템플릿에서도 아래와 같이 조건변수(스위치문)를 이용하면 같은 기능을 수행하는 템플릿 문서를 작성할 수 있습니다.
[code html;gutter:false] {IMAGE_CHECK, <img src="./images/email.gif"> }[/code]
또는
[code html;gutter:false] {?IMAGE_CHECK} <img src="./images/email.gif"> {/}[/code]
조건변수 IMAGE_CHECK 값을 0 또는 false로 할당하면 스위치문 안의 내용은 브라우저에 나타나지 않으며 IMAGE_CHECK 값을 1 또는 true로 할당하면 나타납니다.
[code php;gutter:false] $tpl->assign(IMAGE_CHECK, 0); // 아무 것도 나타나지 않음 $tpl->assign(IMAGE_CHECK, 1); // 이미지 email.gif가 나타남[/code]
[주의] {?변수명}경우의수{/} 또는 {?변수명,경우의수}와 같은 구문형식은 1.2.0 버전부터 사용할 수 있습니다. 그 이전 버전에서는 {변수명,경우의수}라고 작성해야 합니다.
스위치문
PHP 문서에서 아래와 같은 스위치문을 많이 보셨을 것입니다.
[code php;gutter:false] <?php switch ($var_name) { case 'apple': print '나는 사과입니다.'; break; case 'pear': print '나는 배입니다.'; break; case 'orange': print '나는 오렌지입니다.'; break; } ?>[/code]
조건변수(스위치문)를 이용하면 아래와 같이 같은 기능을 수행하는 템플릿 문서를 작성할 수 있습니다.
{var_name,
%apple%나는 사과입니다.|%pear%나는 배입니다.|%orange%나는 오렌지입니다.
}
또는
{?var_name}
apple {%
나는 사과입니다.
%}

pear {%
나는 배입니다.
%}


orange {%
나는 오렌지입니다.
%}

{/}
[주의] {?변수명} 인덱스1 {%항목1%}  인덱스2 {%항목2%} ......{/} 또는 {?변수명, %인덱스1% 항목1 | %인덱스2%/ 항목2 ......}와 같은 구문형식은 1.2.0 버전부터 사용할 수 있습니다. 그 이전 버전에서는 {변수명,%인덱스1% 항목1 | %인덱스2%/ 항목2 ......}라고 작성해야 합니다.
이와같이 조건변수를 이용하면 PHP의 스위치문과 같이 한번의 평가에 의해 여러 개의 case를 동시에 표현하는 것이지요. 여러 개의 문자열(태그가 포함될 수 있음)을 템플릿에 정의해 놓고 상황에 따라 그 중에 하나만 선택하여 브라우저에 나타내려면 각 항목(case)를 구분해주는 구분자가 필요하고 또한 각 항목을 대표하는 인덱스 문자를 구분해주는 구분자가 필요합니다. 이러한 구분자들은 각 버전별로 다소 변화가 있습니다.
< 구분자의 버전별 변화 >
해당 버전 조건변수 구문형식 경우의수 구문형식
항목 구분자 인덱스 구분자
0.0.1p3 ~ 1.1.1 {변수명:반복문:초기값,경우의수} | (수직바) %
1.2.0 {변수명::초기값,경우의수} | (수직바) %
{?변수명;변수옵션;필터명령,경우의수}
{?변수명;변수옵션;필터명령}경우의수{/}
| (수직바) %
{% 과 %} white space
PHP 문서의 인덱스(index)
assign 함수에서 지정할 수 있는 인덱스 문자는 정수, 문자열, true, false입니다. 정수를 지정하면 assign 함수에 의해 문자열로 변환됩니다.
[code php;gutter:false] $tpl->assign('SW_VAR', 2);[/code]
지정된 정수 2는 문자열 '2'로 변환되어 해당되는 항목을 선택합니다. boolean형인 true와 false를 지정하면 이 형식을 가지고 항목을 선택합니다.
인덱스 문자를 지정하지 않았을 때
아래와 같이 각 항목에 인덱스 문자가 지정되지 않았을 때는 앞에서부터 1, 2, 3, 4, 5가 자동으로 지정됩니다.
{?VAR} 첫번째값 | 두번째값 | 세번째값 | 네번째값 | 다섯번째값 {/}
위의 예제에서 PHP에서 템플릿 변수 {VAR}에 할당되는 값에 따라 어떤 값이 출력되는지 살펴보면 아래와 같습니다.
PHP 소스 : $tpl->assign('VAR', 2);
출력항목 : 두번째값

PHP 소스 : $tpl->assign('VAR', 4);
출력항목 : 네번째값

PHP 소스 : $tpl->assign('VAR', 0);
출력항목 : 없음
문자열 인덱스
인덱스를 지정하지 않으면 앞 항목부터 1, 2, 3, 4, 5 가 자동으로 지정된다고 하였는데 아래와 같이 자동 지정되는 1, 2, 3, 4 ... 라는 문자를 다른 순서로 임의 지정한다면 어떻게 될까요?
{VAR, %4%첫번째값 | %3%두번째값 | %2%세번째값 | %1%네번째값 | %0%다섯번째값}
이 경우에 템플릿 변수를 할당할 때는 인덱스 키값을 직접 지정하는 경우가 그렇지 않은 경우보다 우선 순위가 높습니다(0.0.3p1부터 적용).
이에 따라 PHP에서 템플릿 변수 {VAR}에 할당되는 값에 따라 어떤 값이 출력되는지 살펴보면 아래와 같습니다.
PHP 소스 : $tpl->assign('VAR', 2);
출력 : 세번째값

PHP 소스 : $tpl->assign('VAR', 4);
출력 : 첫번째값

PHP 소스 : $tpl->assign('VAR', 0);
출력 : 다섯번째값
BOOLEAN 인덱스
각 case를 지정하는 값으로 false 또는 true를 지정하게 되면 마지막에 있는 두가지 경우 중 하나가 선택됩니다. false면 마지막 바로 앞의 경우를 선택하며, true이면 마지막 경우를 선택합니다.
[code html;gutter:false] {?NEW} <img src="./images/new1.gif"> | <img src="./images/new2.gif"> | <img src="./images/new3.gif"> {/}[/code]
[code php;gutter:false] $tpl->assign('NEW', false); // new2.gif가 출력됨 $tpl->assign('NEW', true); // new3.gif가 출력됨[/code]
인덱스 키 'default'
조건에 맞는 항목이 없을 때는 아무런 값도 출력하지 않습니다. 그러나 1.2.0 버전부터는 PHP의 스위치문에서처럼 예약어 'default' 라는 인덱스 키로 지정된 항목을 작성하면 조건에 맞는 항목이 없을 때 default로 지정된 항목을 출력할 수 있습니다.
{?VAR} 첫번째값 | 두번째값 | 세번째값 | 네번째값 | %default% 기본값 {/}
위의 예제의 경우에 PHP에서 템플릿 변수 VAR에 0과 같은 1, 2, 3, 4 이외의 값을 할당한다면default로 지정된 항목 "기본값"이 출력됩니다.
인덱싱(indexing)
이전 버전에서 각 항목을 인덱싱하는 방법을 보면 좀 혼란스러운 것 같아 1.2.0 버전에서는 이를 단순화하였습니다. assign() 함수에서 지정된 인텍스 문자를 가지고 다음과 같은 조건에 의해 해당 항목을 선택합니다.
  • 지정된 인덱스 문자가 문자열이면 각 항목에 기록된 인덱스와 비교하여 일치하는 항목을 되돌려 줍니다.
  • 지정된 인덱스 문자가 boolean형인 true면 가장 뒤에 있는 항목을 되돌려 줍니다.
  • 지정된 인덱스 문자가 boolean형인 false면 뒤에서 두번째 있는 항목을 되돌려 줍니다.
  • 위의 조건에 해당되는 것이 없을 때 인덱스 중에 'default'가 존재하면 이 항목을 되돌려 줍니다.
  • 위의 조건에 해당되는 것이 없으면 아무 값도 되돌려주지 않습니다.
중첩 switch문
1.0.0 버전부터는 switch문 내에 switch문을 제한없이 중첩할 수 있도록 개선하였습니다. 아래는 중첩 switch문을 이용한 템플릿 파일 예제입니다.
{?SW_VAR_1;;pear}
   apple {%
       사과
   %}
   pear {%
       배:
       {?SW_VAR_2;;나주}
           서울 {%
               서울배
           %}
              
           성환 {%
               성환배
           %}
              
           나주 {%
               {?SW_VAR_3;;나주2}
                   나주1 {% 나주1배 %}
                   나주2 {% 나주2배 %}
                   나주3 {% 나주3배 %}
                   나주4 {% 나주4배 %}
               {/}
           %}
       {/}
   %}
   orange {%
       오렌지
   %}
{/}
조건변수(스위치문)를 중첩되게 사용할 경우에 한 문장내에서는 여러가지 구문형식 중에 동일한 구문형식으로 작성하여야 하며 혼용하여 사용할 수 없습니다. 혼용하더라도 현재 버전에서는 정상적으로 동작하나 향후 상위버전과의 호환성을 보장할 수 없습니다.
각 항목의 앞 뒤에 공백붙이기
1.0.0 버전부터 각 항목의 앞뒤에 있는 공백이 모두 삭제됩니다. 만약에 각 항목의 앞뒤에 공백을 넣으려면 어떻게 할까요? 아래의 예와 같이 공백 앞에 역슬래시(\)를 붙여서 escape 시키면 됩니다.
{COLOR,
\ 파란색\ |
\ 빨간색\ |
\ 노랑색\ |
\ 하늘색\ |
\ 초록색\
}
역슬래시(\)를 붙여서 escape 시키는 대신에 아래와 같이 &nbsp; 코드를 이용하셔도 됩니다.
{COLOR,
&nbsp;파란색&nbsp; |
&nbsp;빨간색&nbsp; |
&nbsp;노랑색&nbsp; |
&nbsp;하늘색&nbsp; |
&nbsp;초록색&nbsp;
}
동일한 스위치 변수명으로 다른 조건 선택하기
동일한 변수값을 가지고 여러개의 다른 조건을 선택할 수 있습니다.
{SW_VALUE, a | b | c}
{SW_VALUE, A | B | C}
위의 예와 같이 템플릿 파일 내에 동일한 템플릿 변수 {SW_VALUE}에 대하여 그 조건문이 다르게 나타낼 수 있습니다. 이 때 {SW_VALUE}의 값이 2라면 {SW_VALUE, a | b | c}의 결과값은 'b'이고 {SW_VALUE, A | B | C}의 결과값은 'B'입니다. 위의 예에 있는 템플릿 파일을 컴파일하면 템플릿변수 구조는 대략 아래와 같이 변환됩니다. 여기서 변수 구조와 인덱스값은 템플릿 버전 및 템플릿 파일에 포함된 템플릿 변수의 위치에 따라 변경될 수 있습니다.
[*switch_1] => Array(
[var_name] => SW_VALUE
[case] => Array(
[1] => Array(
[0] => a
)

[2] => Array(
[0] => b
)

[3] => Array(
[0] => c
)
)
)

[*switch_2] => Array(
[var_name] => SW_VALUE
[case] => Array(
[1] => Array(
[0] => A
)

[2] => Array(
[0] => B
)

[3] => Array(
[0] => C
)
)
)

Posted by 방글24
phpsource/템플릿2006. 10. 30. 10:00
written: Jan 28 2002
last modified: Oct 30 2006
블록변수 구문 형식의 확장
① <!-- BEGIN DYNAMIC BLOCK: 블록명 -->
    블록내용
    <!-- END DYNAMIC BLOCK: 블록명 -->
② {@블록명}블록문내용{/블록명}
③ {@블록명}블록문내용{/}
④ <!--{@블록명}-->블록문내용<!--{/블록명}-->
⑤ <!--{@블록명}-->블록문내용<!--{/}-->
블록변수(다이나믹블록, 블록문) 구문형식중 ③, ⑤은 1.2.0 버전부터 지원되는 구문형식입니다. 1.2.0 버전부터는 이외에도 아래와 같은 형식으로 초기값 위치에 필터명령을 지정할 수 있습니다.
{@블록명;;필터명령}블록내용{/}
1.2.0 버전부터는 css 문과의 충돌을 피하기 위하여 반복문과 초기값을 구분하는 구분자를 콜론(:) 대신에 세미콜론(;)을 사용하도록 하였습니다. 그러나 {변수명:반복문,경우의수}과 {변수명:반복문}을 제외한 舊구문형식은 1.2.0 버전에서도 당분간(?) 계속 사용할 수 있습니다.
블록변수의 동작 메카니즘
우선 블록변수와 관련하여 알아두어야 할 것은 블록을 별도의 템플릿으로 처리하고 있다는 것입니다.
① 블록명을 이름으로 하는 템플릿에 블록내용을 저장한다.
② 블록을 포함하고 있는 템플릿의 블록 위치에는 블록명을 이름으로 하는 템플릿변수를 삽입한다.
③ assign 메소드로 블록을 포함하고 있는 템플릿을 지정하면 블록에 해당하는 템플릿을 우선 처리한 후
그 결과값을 블록위치의 템플릿변수에 저장한 후 블록을 포함한 템플릿을 처리한 후 그 결과값을 되돌려준다.
④ 돌려받은 결과값을 초기값 위치의 필터명령으로 필터처리한 후 되돌려준다.
①번부터 ③번까지는 이전버전과 동일한 처리방법입니다. ④번 과정이 1.2.0 버전에서 추가된 기능으로 필터처리를 위한 필터명령을 지정할 수 있습니다. 필터처리에 관한 자세한 내용은 "8.필터처리"를 참조바랍니다.
HTML 블록 구축하기
많은 웹페이지를 테이블과 같이 일정한 형태를 가지고 반복적으로 나타나는 구조들이 많이 나타납니다. 이와같이 반복적으로 나타나는 요소에 대하여는 HTML 블록을 구축하게 되면 간단히 표시될 수 있습니다.
2001년 12월 가게부
지출항목 지출금액(원)
자동차유지비 200,000
반찬값 180,000
학원비 350,000
위 문서를 가지고 템플릿을 작성해 보면 아래와 같이 될 것이다.
{YEAR}년 {MONTH}월 가게부
지출항목 지출금액(원)
{ITEM1} {MONEY1}
{ITEM2} {MONEY2}
{ITEM3} {MONEY3}
위 에서 아래에 있는 3개의 행은 동일한 구조의 반복이므로 이를 하나의 블록으로 구조화시킬 수 있습니다. 이제부터는 위의 테이블을 HTML 소스를 보면서 설명하겠습니다. 아래가 위 테이블에 대한 전체 HTML 소스(파일명 table.htm)입니다.
[code html;gutter:false] <!-- NAME: table.htm --> <TABLE border="1"> <TR> <TD colspan="2"> {YEAR}년 {MONTH}월 가게부 </TD> </TR> <TR> <TD>지출항목</TD> <TD>지출금액(원)</TD> </TR> <TR> <TD>{ITEM1}</TD> <TD>{MONEY1}</TD> </TR> <TR> <TD>{ITEM2}</TD> <TD>{MONEY2}</TD> </TR> <TR> <TD>{ITEM3}</TD> <TD>{MONEY3}</TD> </TR> </TABLE> <!-- END: table.htm --> [/code]
12번 행부터 23번 행까지가 반복되는 부분으로 이 부분을 별도의 템플릿 파일(파일명 row.htm)에 의해 구조화시키게 되면 아래와 같을 것입니다. {ITEM}은 {ITEM1}, {ITEM2}, {ITEM3}를 대표하며, {MONEY}는 {MONEY1}, {MONEY2}, {MONEY3}를 대표합니다.
[code html;gutter:false] <!-- NAME: row.htm --> <TR> <TD>{ITEM}</TD> <TD>{MONEY}</TD> </TR> <!-- END: row.htm --> [/code]
별도의 파일(파일명 row.htm)로 분리된 내용은 별도의 템플릿 변수로 정의하여 메인 파일인 table.htm에 삽입합니다. 이 변수를 {ROWS}라고 하면 table.htm은 아래와 같이 수정될 것입니다.
[code html;gutter:false] <!-- NAME: table.htm --> <TABLE border="1"> <TR> <TD colspan="2"> {YEAR}년 {MONTH}월 가게부 </TD> </TR> <TR> <TD>지출항목</TD> <TD>지출금액(원)</TD> </TR> {ROWS} </TABLE> <!-- END: table.htm --> [/code]
반복되는 부분을 별도의 템플릿 파일에 의해 구조화하게 되면 이와 같이 템플릿 파일이 2개로 작성될 것입니다.
PHP 코드 작성 book.php
우 리가 원하는 최종 문서인 "2001년 12월 가게부"를 생성하기 위해서는 우선 반복되는 부분인 row.htm을 3번 반복하여 3개의 행을 생성하여 템플릿 변수 {ROWS}에 저장하여야 하며 이후에 table.htm에 삽입된 {ROWS} 대신에 앞서 생성된 3개의 행으로 대치하면 될 것입니다. 이러한 작업을 수행하기 위해 PHP 문서로 웹문서를 구성하여 보면 아래와 같습니다.
[code php;gutter:false] <? /** * file : book.php * * 일반적으로 지출항목 및 지출금액은 데이터베이스로부터 읽어오게 될 것이다. * 아래와 같이 데이터베이스로 부터 읽어들인 값이 $item과 $money 배열에 * 순서대로 저장되었다고 가정합니다. * * $item[0] = "자동차유지비"; * $item[1] = "반찬값"; * $item[2] = "학원비"; * * $money[0] = 200000; * $money[1] = 180000; * $money[2] = 350000; */ include_once("class.hTemplate.php"); $tpl = &new hTemplate("./templates"); $tpl->define( array( "row" => "row.htm", "table" => "table.htm" ) ); $tpl->assign( array( "YEAR" => "2001", "MONTH" => "12" ) ); for ($i=0;$i<3;$i++) { $tpl->assign( array( "ITEM" => $item[$i], "MONEY" => $money[$i] ) ); $tpl->assign("ROWS", "row", true); } $tpl->assign("TABLE", "table"); $tpl->output("TABLE"); ?> [/code]
위 PHP 코드에서 for문 안의 내용이 3번 반복되며 한 번 반복될 때마다 템플릿 변수 ROWS에 테이블 한 행씩 추가됩니다.
블록변수를 이용하여 HTML 블록 구축하기
위 에서 언급된 HTML 블록 구축하기에서의 가장 큰 문제는 템플릿 파일이 불필요하게(또는 불편하게) 둘로 나누어져 있다는 것입니다. 그러나 블록변수를 이용하면 하나의 파일 내에 HTML 블록을 구축할 수 있습니다. 이렇게 하게 되면 소스 관리하기가 훨씬 쉬워지며 소스 코드의 가독성 또한 크게 개선될 것입니다. 블록변수를 이용하여 위의 예제와 동일한 기능을 수행하도록 작성해 보겠습니다.
[code html;gutter:false] <!-- NAME: table.htm --> <TABLE border="1"> <TR> <TD colspan="2"> {YEAR}년 {MONTH}월 가게부 </TD> </TR> <TR> <TD>지출항목</TD> <TD>지출금액(원)</TD> </TR> <!-- BEGIN DYNAMIC BLOCK: row --> <TR> <TD>{ITEM}</TD> <TD>{MONEY}</TD> </TR> <!-- END DYNAMIC BLOCK: row --> </TABLE> <!-- END: table.htm --> [/code]
별도의 파일을 구성하여 HTML 블록을 구성하는 것과 비교해 볼 때, 별다른 차이가 없음을 알 수 있습니다. 차이점이라고는 블록이 시작되는 부분과 끝나는 부분에 <!--{@row}--><!--{/}--> 이 붙여주어야 한다는 것 뿐입니다. FastTemplate와의 호환성을 위해 지원하던 블록변수 형식인 <!-- BEGIN DYNAMIC BLOCK: row --><!-- END DYNAMIC BLOCK: row -->을 대신에 사용할 수 있으나 블록의 시작과 끝을 나타내는 이 구문형식을 매우 엄격하게 다루기 때문에 대.소문자와 공백 문자를 포함하여 단 한자라도 틀리면 안됩니다.
PHP 코드 작성 book.php
이제는 블록변수가 포함된 템플릿을 위한 PHP 문서를 구성하여 보겠습니다.
[code php;gutter:false] <? /** * file : book.php * * 일반적으로 지출항목 및 지출금액은 데이터베이스로부터 읽어오게 될 것이다. * 아래와 같이 데이터베이스로 부터 읽어들인 값이 $item과 $money 배열에 * 순서대로 저장되었다고 가정합니다. * * $item[0] = "자동차유지비"; * $item[1] = "반찬값"; * $item[2] = "학원비"; * * $money[0] = 200000; * $money[1] = 180000; * $money[2] = 350000; */ include_once("class.hTemplate.php"); $tpl = new hTemplate("./templates"); $tpl->define( array( "table" => "table.htm" ) ); $tpl->assign( array( "YEAR" => "2001", "MONTH" => "12" ) ); for ($i=0;$i<3;$i++) { $tpl->assign( array( "ITEM" => $item[$i], "MONEY" => $money[$i] ) ); $tpl->assign("row", "row", true); } $tpl->assign("TABLE", "table"); $tpl->output("TABLE"); ?> [/code]
이 전의 book.php와 차이가 나는 것은 define() 함수에서 row => "row.htm" 이 삭제된 것 뿐입니다. FastTemplate에서는 다이나믹 블록이 포함된 템플릿을 처리할 때는 define() 함수를 실행한 직후에 아래와 같이 define_dynamic 함수를 실행하여야 합니다.
[code php;gutter:false] define_dynamic("row", "table"); [/code]
define_dynamic() 함수의 기능은 블록이 속한 템플릿을 알려주는 것이 전부입니다. 이 예에서 보면 "row"라는 블록은 "table"라는 템플릿에 있다는 것을 알려주는 것이지요. 후키템플릿에서는 이 문장이 필요없습니다. define() 함수를 실행할 때 템플릿 파일로부터 다이나믹 블록이 속한 템플릿을 자동으로 분석하여 클래스 내부에 기록하도록 되어 있습니다.
블록변수의 자동 할당 기능
자동 할당 기능은 1.2.0 버전부터 사용할 수 있습니다.
블록변수는 해당 템플릿변수를 assign 함수로 처리하여야 그 값이 지정됩니다. 그러나 1.2.0 버전부터 아래와 같이 블록변수명을 생략하면 블록변수에 대한 assign() 함수를 실행하지 않아도 자동으로 할당됩니다.
{@=html_substr("{_SELF}", 0, 50, true)}{post.post_title}{/}
일반적인 블록변수의 처리 수순을 보면 아래와 같습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {@phpclass}이곳은 PHPCLASS입니다{/} </BODY> </HTML> <!-- END: main.htm --> [/code]
템플릿 파일 main.htm의 4행에 있는 블록변수(phpclass)를 출력하기 위해서는 아래의 php 문장 5행에서와 같이 블록변수(phpclass)를 반드시 동일이름의 변수로 할당해 주어야 합니다.
[code php;gutter:false] <? include_once("class.hTemplate.php"); $tpl = new hTemplate("./templates"); $tpl->define("main", "main.htm"); $tpl->assign("phpclass", "phpclass"); $tpl->assign("MAIN", "main"); $tpl->output("MAIN"); ?> [/code]
그러나 블록변수의 변수명을 생략한 경우에는 위의 php 문서 5행을 생략하더라도(변수명을 모르니 assign() 함수를 사용할 수도 없음) 6행 문장을 처리할 때 자동으로 블록변수를 처리해줍니다. 그 결과 생략하지 않은 경우와 같은 문서를 생성할 수 있습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <BODY> {@}이곳은 PHPCLASS입니다{/} </BODY> </HTML> <!-- END: main.htm --> [/code]
템플릿 파일 main.htm 의 4행에 있는 블록변수의 변수명이 생략되었습니다.
[code php;gutter:false] <? include_once("class.hTemplate.php"); $tpl = new hTemplate("./templates"); $tpl->define("main", "main.htm"); $tpl->assign("MAIN", "main"); $tpl->output("MAIN"); ?> [/code]
블록변수를 처리하는 assign() 함수가 생략되었으나 아래에서 보는 바와 같이 블록변수의 내용이 자동 처리되어 HTML 문서를 생성합니다.
[code html;gutter:false] <HTML> <BODY> 이곳은 PHPCLASS입니다 </BODY> </HTML> [/code]
배열값에 의하여 블록내용을 자동으로 채우는 기능
이 기능은 1.2.0 버전부터 사용할 수 있으나 확정된 기능이 아니라 여러분의 의견을 수렴할 목적으로 미리 공개되는 제안서(proposal)입니다. 따라서 향후 업그레이드할 때 아래서 설명한 내용과 다르게 동작할 수 있으니 주의하시기 바랍니다.
우선 중첩되지 않은 단순블록문의 경우를 예를 들어 설명하겠습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <head> <META http-equiv="Content-Type" content="text/html; charset=euc-kr"> <title>{TITLE}</title> </head> <BODY> <table width="400" border="1"> <caption><{TITLE}></caption> <!--{@BLOCK_ARRAY}--> <tr> <td align="center">{A}</td> <td align="center">{B}</td> <td align="center">{C}</td> <td align="center">{D}</td> </tr> <!--{/}--> </table> </BODY> </HTML> <!-- END: main.htm --> [/code]
템플릿 파일 main.htm에 BLOCK_ARRAY라는 블록변수가 존재합니다. 이 블록변수 내에는 단순변수 {A}, {B}, {C}, {D}가 존재하며 이 값들은 아래와 같은 배열값에 의해 차곡차곡 채워집니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', array( 'id' => 'test', 'path' => './hCache/templates' ), array( 'active_absolute_path' => true ) ); $tpl->define( array( 'main' => 'main.htm', ) ); $tpl->assign('TITLE', '배열값에 의해 자동으로 채워지는 블록문'); $tpl->assign('BLOCK_ARRAY', array( array( 'A'=>'A1', 'B'=>'B1', 'C'=>'C1', 'D'=>'D1' ), array( 'A'=>'A2', 'B'=>'B2', 'C'=>'C2', 'D'=>'D2' ), array( 'A'=>'A3', 'B'=>'B3', 'C'=>'C3', 'D'=>'D3' ) ) ); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 php 문장을 실행하면 아래와 같은 테이블을 얻게됩니다.
< 배열값에 의해 자동으로 채워지는 블록문 >
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
이번에는 중첩된 블록변수의 경우를 예를 들어 설명하겠습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <head> <META http-equiv="Content-Type" content="text/html; charset=euc-kr"> <title>{TITLE}</title> </head> <BODY> <table width="400" border="1"> <caption><{TITLE}></caption> <!--{@BLOCK_ARRAY}--> <tr> <td align="center">{A}</td> <td align="center">{B}</td> <td align="center"> <table width="100%" border="1"> <!--{@C}--> <tr> <td align="center">{C_A}</td> <td align="center">{C_B}</td> <td align="center">{C_C}</td> </tr> <!--{/}--> </table> </td> <td align="center">{D}</td> </tr> <!--{/}--> </table> </BODY> </HTML> <!-- END: main.htm --> [/code]
템플릿 파일 main.htm에 BLOCK_ARRAY라는 블록문에 {A}, {B}, {D}라는 단순변수 외에 {@C}라는 중첩된 블록문이 존재합니다. {@C} 블록문 내에는 단순변수 {C_A}, {C_B}, {C_C}가 존재하며 이 모든 값들은 아래와 같은 배열값에 의해 차곡차곡 채워집니다.
[code php;gutter:false] <?php include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates', array( 'id' => 'test', 'path' => './hCache/templates' ), array( 'active_absolute_path' => true ) ); $tpl->define( array( 'main' => 'main.htm', ) ); $tpl->assign('TITLE', '배열값에 의해 자동으로 채워지는 중첩블록문'); $tpl->assign('BLOCK_ARRAY', array( array( 'A'=>'A1', 'B'=>'B1', 'C'=> array( array( 'C_A'=>'C1_A_1', 'C_B'=>'C1_B_1', 'C_C'=>'C1_C_1' ), array( 'C_A'=>'C1_A_2', 'C_B'=>'C1_B_2', 'C_C'=>'C1_C_2' ), array( 'C_A'=>'C1_A_3', 'C_B'=>'C1_B_3', 'C_C'=>'C1_C_3' ) ), 'D'=>'D1' ), array( 'A'=>'A2', 'B'=>'B2', 'C'=> array( array( 'C_A'=>'C2_A_1', 'C_B'=>'C2_B_1', 'C_C'=>'C2_C_1' ), array( 'C_A'=>'C2_A_2', 'C_B'=>'C2_B_2', 'C_C'=>'C2_C_2' ), array( 'C_A'=>'C2_A_3', 'C_B'=>'C2_B_3', 'C_C'=>'C2_C_3' ) ), 'D'=>'D2' ), array( 'A'=>'A3', 'B'=>'B3', 'C'=> array( array( 'C_A'=>'C3_A_1', 'C_B'=>'C3_B_1', 'C_C'=>'C3_C_1' ), array( 'C_A'=>'C3_A_2', 'C_B'=>'C3_B_2', 'C_C'=>'C3_C_2' ), array( 'C_A'=>'C3_A_3', 'C_B'=>'C3_B_3', 'C_C'=>'C3_C_3' ) ), 'D'=>'D3' ) ) ); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
위의 php 문장을 실행하면 아래와 같은 테이블을 얻게됩니다.
< 배열값에 의해 자동으로 채워지는 중첩블록문 >
A1 B1
C1_A_1 C1_B_1 C1_C_1
C1_A_2 C1_B_2 C1_C_2
C1_A_3 C1_B_3 C1_C_3
D1
A2 B2
C2_A_1 C2_B_1 C2_C_1
C2_A_2 C2_B_2 C2_C_2
C2_A_3 C2_B_3 C2_C_3
D2
A3 B3
C3_A_1 C3_B_1 C3_C_1
C3_A_2 C3_B_2 C3_C_2
C3_A_3 C3_B_3 C3_C_3
D3

Posted by 방글24
phpsource/템플릿2006. 10. 21. 16:43
written: Jan 28 2002
last modified: Oct 21 2006
1.2.0 (2006.10.21)
  • assign() 함수에서 두번째 인자로 지정하여 사용하던 dot 문자에 의한 append 기능을 삭제합니다.
  • 필터기능을 추가하였고, 이러한 필터기능은 미리 정의된 9가지의 실행시간(initialize, premacro, precompile, compile, postcompile, preassign, assign, postassign, output)을 사용자가 선택할 수 있도록 하였으며 지정된 실행시간에 따라 필터기능이 수행됩니다. 또한 템플릿문서에서 사용할 수 있는 허용필터명령을 지정할 수 있도록 하였습니다.
  • 래핑(wrapping)기능이 추가되었습니다. 래핑기능을 이용하면 기존에 작성된 템플릿 문서와 php 문서를 수정하지 않고도 이 문서의 기능을 임의로 수정할 수 있습니다.
  • 템플릿 변수의 구문형식이 수정, 보완되었습니다.
  • 템플릿변수의 내용형식이 기존의 template 문서 뿐만 아니라 일반 텍스트 문서(text document)와 php 스크립트(php script)까지 지정할 수 있도록 하였습니다.
  • 다이나믹블록(블록변수)의 자동할당기능이 추가되었습니다.
  • 자체출력버퍼를 이용하는 출력함수인 output()가 추가되었으며, 이 함수는 기존의 FastPrint() 함수가 가지고 있던 모든 기능을 포함하고 있습니다. 더불어 output() 함수를 이용하면 1.2.0 버전부터 출력관련 기능인 캐시정보보기, output 필터실행시간 처리하기 등의 기능을 수행할 수 있습니다.
  • PHP 4.2.0 버전에서 touch() 함수와 관련하여 "warning error"가 발생하던 버그를 수정하였습니다.
  • win32 플랫폼의 php 4.1.0 버전에서 is_file() 함수의 인자로 지정된 파일이 없을 때 warning 에러가 발생하는 버그를 수정하였습니다.
  • TR 용법을 PROPOSAL(제안서)로 추가하였습니다.
  • 웹서버 루트에서 절대경로 계산시 도메인명 아래에 슬래시가 두개 출력되던 버그를 수정하였습니다.
  • 자바스크립트 문장 내에 있는 인용문에서 인용부호를 이스케이프하였을 때 HTML 문서를 정상적으로 파싱하지 못하고 깨지는 버그를 수정하였습니다.
  • 배열값에 의하여 다이나믹블록(블록변수)의 내용을 자동으로 채우는 기능을 PROPOSAL(제안서)로 추가하였습니다.
  • 동일한 SCRIPT 파일이 중복되었을 때 동일한 파일임에도 불구하고 중복되어 출력되는 버그를 수정하였습니다.
  • 출력문서의 HTML 태그 대문자|소문자를 선택하는 기능이 추가되었습니다.
  • 일부 자바스크립트 문장 압축할 때 발생하던 버그를 수정하였습니다.
  • 캐시파일에 퍼미션을 지정할 수 있도록 하였습니다.
  • 캐시파일을 압축하여 저장할 수 있는 기능을 추가하였습니다.
  • no-file 용법을 PROPOSAL(제안서) 수준에서 정식 기능으로 포함시켰습니다.
1.1.1p3 (2005.4.1)
  • COMMAND 태그 관련 버그를 잡았습니다.
  • 템플릿 파일에 기록된 주소가 도메인에 대한 정보없이 단지 "http://"만이 포함되어있을 때 발생하던 에러를 정상처리하도록 하였습니다.
  • allow_call_time_pass_reference의 값이 Off일 때 발생하던 "Warning: Call-time pass-by-reference ......" 에러가 발생하지 않도록 수정하였습니다.
1.1.1-dev (2005.2.13)
  • 1.1.1 버전부터는 GPL 라이선스 대신에 LGPL 라이선스를 따릅니다.
  • class.hHtmlUrlRedirection.php을 삭제하고 대신에 class.hHtmlUrlParser.php 파일이 포함되었습니다.
  • class.hFastTemplate.php이 삭제되었으며 따라서 향후에는 기존의 FastTemplate 문서를 지원하지 않습니다.
  • php 4.3.10 이상 버전에서 캐시파일이 생성되지 않는 문제가 계속발생하여 func.version_compare.php를 추가하여 개선했습니다.
1.1.0 (2005.1.14)
업그레이드 및 패치(upgrade and patch)
  • class.hHtmlClassify.php에서 자바스크립트 파일 처리 방법을 변경하였습니다.
  • URL 자동변경 기능에서 리소스의 경로를 상대경로 대신에 절대경로로 변경할 수 있도록 하였습니다.
  • html 헤더의 출력유무를 설정할 수 있도록 하였습니다.
  • 새로운 멤버템플릿변수 {::_PATH_TO_TPLS}를 추가하였으며 이를 이용하여 리소스 리디렉션 처리에 좀 더 유연하게 할 수 있도록 하였습니다.
  • <?XML version="1.0"?> 태그를 처리할 수 있도록 하였습니다.
  • 현재 페이지에 대한 캐시 갱신방법을 개선하였습니다.
  • 생성자의 HTML 파서 정보에 두가지 정보를 추가로 설정할 수 있도록 하였습니다.
  • 스타일시트에서의 URL 리디렉션 처리를 개선하였습니다.
  • 템플릿 파일이 비어있는 경우에 발생하는 에러를 없앴습니다.
  • php 4.3.10 이상 버전에서 HW_PHPVERSION 상수 문제로 인해 캐시파일이 생성되지 않는 문제를 수정하였습니다.
  • 이전 버전에서는 member 디렉토리에 있던 class.hClassMember.php 파일을 1.1.0 버전부터 class 디렉토리로 옮겼습니다.
  • 템플릿 변수 구분자(template variable's delimiters)를 상황에 따라 적절히 사용할 수 있도록 "{변수명}" 외에 "<!--{변수명}-->"와 같이 나타낼 수 있도록 하였습니다.
  • 다이나믹 블록의 시작과 끝을 나타내는 구분자를 "<!-- BEGIN DYNAMIC BLOCK: name -->", "<!-- END DYNAMIC BLOCK: name -->" 대신에  "{@name}", "{/name}"로도 나타낼 수 있습니다.
  • 동일한 이름의 블록을 중복으로 나타낼 수 있습니다. 단 나중에 컴파일된 블록 내용으로 처리됩니다.
  • 템플릿파일에서 다른 템플릿 파일을 인클루드할 수 있는 기능("하위템플릿 인클루드")을 추가하였습니다. 자세한 것은 "하위템플릿 인클루드" 메뉴를 참조하세요.
  • get_assigned() 함수에서 지정한 변수명이 존재하지 않는 경우, 이전 버전은 에러를 발생시켰으나 false를 반환하도록 수정하였습니다. 반면에 FastPrint() 함수의 경우는 이전과 같이 지정한 변수명이 존재하지 않는다면 에러를 발생시킵니다.
  • 웹문서 리디렉션에서 다른 쿼리문이 있을 때 정상적으로 처리하지 못하는 문제를 수정
아래와 같은 템플릿 파일의 경우와 같이 링크된 문서에 쿼리문이 붙었을 때 웹문서 리디렉션 기능이 동작한다면
[code html;gutter:false] <!-- filename : a.html --> <P><H3>{TITLE}</H3></P> <P>a.html</P> <P><A href="b.html?tt=b_main">b.html</A></P> <P><A href="c.html?tt=c_main">c.html</A></P> [/code]
이전에는 아래와 같이 웹리디렉션용 쿼리문인 "template=템플릿파일명"이 다른 쿼리문과 구분되지 않았습니다.
[code html;gutter:false] <!-- filename : a.html --> <P><H3>{TITLE}</H3></P> <P>a.html</P> <P><A href="{_SERVER.PHP_SELF}?tt=b_maintemplate=b.html">b.html</A></P> <P><A href="{_SERVER.PHP_SELF}?tt=c_maintemplate=c.html">c.html</A></P> [/code]
이 문제를 수정하여 아래와 같이 다른 쿼리문과 구분되도록 하였습니다.
[code html;gutter:false] <!-- filename : a.html --> <P><H3>{TITLE}</H3></P> <P>a.html</P> <P><A href="{_SERVER.PHP_SELF}?tt=b_main&template=b.html">b.html</A></P> <P><A href="{_SERVER.PHP_SELF}?tt=c_main&template=c.html">c.html</A></P> [/code]
  • 템플릿 변수가 복수개로 정의되어 있거나 여러번 할당하는 경우, 변수의 형식에 관계없이 마지막 값만이 유효합니다.
  • hHtmlUrlRedirection 클래스에서 정의된 private 함수인 _get_script_info(), _get_file_info(), _relative_path() 메소드를 별도의 클래스 hGlobals(파일명 class.hGlobals.php)로 분리시켰습니다. 아울러 _get_file_info() 메소드에 약간의 문제가 있어 수정하였습니다.
  • 템플릿 변수 디버깅할 때 나타나는 "template file" 정보를 개선하였습니다.
  • hTemplateStructure 및 hTemplateDebug 클래스에서 정적변수 처리로 인한 오버헤드를 줄이기 위해 hTemplateStructure 및 hTemplateDebug 클래스 구조를 Singleton 패턴으로 수정하였습니다. 이에 따라 Singleton 패턴을 처리하는 클래스인 class.hSingleton.php가 추가되었습니다.
  • <BASE> 태그에서 "href" 속성없이 "target" 속성만 있을 때 <BASE> 태그가 사라지는 버그를 수정하였습니다.(지용호님 지적 내용)
  • 1.0.0 버전에서 Proposal(제안서)로 소개되었던 웹문서 리디렉션 기능에서 확장자가 "html"인 웹문서를 상대경로로 지정하게 되면 무조건 이 기능이 수행되었습니다. 그런데 이 기능 때문에 기존에 사용하던 HTML 문서 중에 확장자가 "html"이었던 문서와 충돌이 되어 후키템플릿이 정상적으로 동작되지 않는 경우가 있었습니다. 따라서 이 기능을 기본적으로 동작되지 않도록 수정하였습니다. 만약 이 기능을 사용하기를 원한다면 "웹문서 리디렉션"에 대한 설명서를 참조하여 해당 파일 내용을 수정하시기 바랍니다.
  • parse_url() 함수가 PHP 버전에 따라 반환값이 다르게 나타나는 관계로 hHtmlUrlRedirection 클래스에서 정의된 private 함수인 _url_redirection() 메소드에 문제가 있어 웹문서 리디렉션 기능이 정상적으로 동작하지 않을 때가 있어 수정합니다.
  • assign() 함수에서 "." 문자에 의한 append 지원방식을 삭제하였습니다.
  • class.hHtmlClassify.php 파일에서 아래와 같이 </HEAD> 바로 뒤에 나타나는 일반문자열(태그없이 나타나는 문자열)이 사라지는 버그를 수정합니다.
이전 버전에서는 아래와 같은 예를 class.hHtmlClassify.php으로 분류하게 되면 "태그 바깥쪽의 문자열" 부분이 없어지는 버그가 있었습니다. 이를 정상적으로 나타나도록 수정하였습니다.
[code html;gutter:false] <HEAD>......</HEAD> 태그 바깥쪽의 문자열 <P>태그 안쪽의 문자열</P> [/code]
1.0.0 (2003.4.30)
업그레이드(upgrade)
  • 객체 생성을 여러번 하는데 따른 문제점 개선 - 객체 생성 및 소멸
  • 템플릿 정보의 캐시 저장을 소멸자에서 실행하도록 수정 - 객체 생성 및 소멸
  • 복수 템플릿 파일에 존재하는 공통 부분(<HEAD> ~ </HEAD> 및 <BODY attrib>)을 클래스 hTemplate의 생성자에서 설정한 '사용자 정의 출력버퍼 콜백함수'를 수행할 때 단 한번만 출력하도록 하였습니다. - 복수 템플릿파일의 용법
  • 템플릿 변수 선언과 할당에 대한 상태를 파악할 수 있는 디버깅 기능 추가 - 템플릿 변수 정보
  • 템플릿 파일 정보를 확인할 수 있는 디버깅 기능 추가 - 템플릿 파일 정보
  • 멤버 템플릿 변수 지원 - 멤버 템플릿 변수
  • assign() 함수의 append 기능 개선 - assign()
  • switch문의 각 case 값 출력 문제 개선 - switch문
  • 중첩 switch문 지원 - switch문
  • <SCRIPT> 태그 파싱 개선
  • <PARAM> 태그 파싱 개선 - 리소스 리디렉션
  • FastTemplate용 문서 사용을 위한 hFastTemplate 클래스 제공 - FastTemplate 호환
  • 템플릿 파일 기본 디렉토리의 다중화 지원 - 객체 생성 및 소멸
  • HTML 파서 기능을 사용자가 선택 - 객체 생성 및 소멸
  • URL 리디렉션 기능을 사용자가 선택 - 객체 생성 및 소멸
  • HTML 문서 압축 기능을 사용자가 선택 - 객체 생성 및 소멸
  • 다중 템플릿 파일의 특수용법에서 공통 부분 처리 버그 수정
  • 캐시 접근을 위한 코드들이 캐시핸들러 1.0.0 버전에 맞게 수정되었습니다. - 캐시핸들러
  • 캐시를 이용할 때 $_POST[], $_GET[], $_SERVER[] 등 미리정의된 수퍼글로벌변수를 정상적으로 생성하지 못하는 문제 해결
  • 복수의 템플릿 파일로 구성된 문서에서 일부 템플릿만 갱신되는 경우에 출력이 정상적으로 이루어지지 않는 버그 수정
  • 캐시 파일명은 $PHP_SELF에 해당하는 문자열과 캐시 id의 조합으로 생성되며, 이전 버전의 조합방법이 다소 변경되었습니다. 따라서 캐시파일은 이전 버전과 호환성이 없습니다.
  • 캐시 id를 지정하지 않으면 $PHP_SELF에 해당하는 문자열만 가지고 캐시 파일이 생성됩니다. 이전 버전에서는 캐시 핸들러의 캐시 id 기본값으로 생성되었습니다.
  • 한 문서에서는 garbage collection을 디렉토리별로 한번만 수행
  • 캐시파일의 내용을 URL을 통해 불법적으로 접근하는 경우에 그 내용이 웹브라우저에 나타나지 않도록 개선
  • 자바스크립트 이벤트 핸들러에 의해 실행되는 자바스크립트 함수로 전달되는 URL 리디렉션 기능 추가 - URL 리디렉션
  • 1.0.0 베타버전에서의 class.hHtmlReboundUrl.php 파일명이 class.hHtmlUrlRedirection.php로 변경되었으며, 이 파일에 정의되어있는 클래스 hHtmlReboundUrl은 hHtmlUrlRedirection으로 변경되었습니다.
  • 생성자에 전달하는 HTML 파서 관련 설정값 중에 active_rebound_url을 active_url_redirection으로 변경하였습니다.
  • 클래스 HtmlUrlRedirection에 정의된 rebound_url 관련 함수명을 url_redirection 으로 변경하였습니다.
제안서(proposal)
  • no-file 용법 제안 - no-file 용법
  • 하이퍼링크로 연결된 웹문서의 리디렉션 - 웹문서 리디렉션
0.0.4 (2003.1.15)
  • 에러 발생 수준을 E_ALL로 설정한 후 발생하는 warning error을 전반적으로 수정하였습니다.
  • 에러 핸들링을 trigger_error() 함수를 이용하였습니다.
  • 현재 zend.com에서 개발 중인 Zend 엔진 2.0과의 소스 호환성을 위하여 객체 생성할 때 참조 연산자 "&"를 사용하지 않았습니다.
  • 웹서버의 플랫폼이 윈도우 기반인지를 판별하는 방법을 $this->iswin = ("WIN" == strtoupper(substr(PHP_OS, 0, 3))) ? true : false; 으로 변경하였습니다.
  • 템플릿 파일에서 사용가능한 특수문자로 콤마(,)가 추가되었습니다. 콤마는 switch문에서 사용하는 특수문자로 콤마 앞에다 역슬래시(\)를 붙여주면 되면 콤마를 출력할 수 있습니다. 템플릿 변수의 초기값을 나타내는 문자열에 콤마를 나타낼 때 이 방법을 이용하면 됩니다.
  • 템플릿 파일에서 사용가능한 특수문자로 콤마(,)가 추가되었습니다. 콤마는 switch문에서 사용하는 특수문자로 콤마 앞에다 역슬래시(\)를 붙여주면 되면 콤마를 출력할 수 있습니다. 템플릿 변수의 초기값을 나타내는 문자열에 콤마를 나타낼 때 이 방법을 이용하면 됩니다.
  • (버그)class.hTemplate.php의 assign_var() 메소드 수정 - 후키템플릿의 switch문(조건문) 설명을 보면 true일 때는 나열된 값의 마지막 값으로 출력하고 false일 때는 그 전값(끝에서 두번째값)으로 처리하도록 되어 있습니다. 그런데 문자열 인덱스인 경우를 제대로 처리하지 못하는 벌레가 있어 수정합니다. 수정하게 되면 설명서에 있는대로 키값에 관계없이 마지막 값과 그 전값을 출력합니다.
  • (버그)class.hTemplate.php의 merge_var() 메소드 수정 - 이 함수는 템플릿 변수를 등록하면서 초기화하는 함수로 이미 템플릿 변수가 등록되어 있는 경우는 새로이 등록하지 않고 넘어간다.
  • (버그)class.hTemplate.php의 $_POST[], $_GET[], $_SERVER[] 등에 해당하는 템플릿 변수 생성문제 - 예를 들어 $_POST["mode"], $_GET["table"], $_SERVER["PHP_SELF"]에 해당되는 템플리 변수 {_POST.mode}, {_GET.table}, {_SERVER.PHP_SELF}가 정상적으로 생성되지 못하네요.
  • (개선)class.hTemplateParser.php의 is_template_name() 메소드 수정
  • (버그)class.hTemplateParser.php의 relative_path() 메소드, rebound_url() 메소드 수정
  • (버그)class.hHtmlParser.php의 is_tag() 메소드 수정 - <tr >와 같이 속성없이 스페이스만 있는 경우에 정상적으로 해석하지 못하고 태그가 깨집니다.
  • class.hHtmlParser.php의 스택 자료구조를 위한 클래스를 별도의 클래스로 분리
  • class.hHtmlParser.php의 str_space_null($attrib) 메소드를 정규표현식으로 대체
  • (개선)class.hCache.php의 garbage collection 핸들러를 private 함수로 변경 - 이전 버전에서는 보통 객체 생성한 후에 garbage collection 핸들러를 명시적으로 실행하여야 하였으나 이를 open 함수 내에서 동작하도록 수정하였습니다. 한 문서에서는 객체 생성을 몇 번을 하던지 관계없이 단 한번만 garbage collection을 하도록 하였습니다.
0.0.3 (2002.9.20)
0.0.3으로 판올림되면서 경로문제로 현재 저장되어 있는 캐시 파일들이 모두 갱신되어야 합니다. 판올림하면서 템플릿 파일이 수정된다면 관계없으니 그렇지 않다면 판올림하기 전에 캐시 파일들을 모두 지워주시기 바랍니다.
  • 템플릿 파일에서 특수문자({, }, |)의 표시 기능을 개선함 - 특수문자({, }, |)를 템플릿 파일에 삽입하기 위해서는 어느 곳이든지 상관없이 앞에다 역슬래시(\)를 붙여주면 됩니다. 이전 버전에서는 그 위치에 많은 제한을 받고 있습니다.
  • switch문에서만 가능했던 반복문을 일반문까지 반복할 수 있도록 확대 적용
  • 템플릿 변수에 초기값(default) 설정
  • 템플릿에 지정된 경로가 현 스크립트 문서의 하위디렉토리에 있는 경우에는 현 스크립트 문서의 경로를 기준으로 상대 경로로 자동 변환
0.0.2-패치1 (2002.7.27)
후키 템플릿(class.hTemplate.php) 수정
  • (버그)행번호 137번 assign_str() 함수 수정 및 멤버변수 $ARRAYKEY 추가
후키 템플릿 파서(class.hTemplateParser.php) 수정
  • (버그)행번호 359번 attrib_to_string() 함수 수정
  • (버그)행번호 546번 process_head() 함수 수정
  • (버그)행번호 652번 head_parse_into_struct() 함수 수정
  • (개선)행번호 131번 set_case_var() 함수 수정
후키 HTML 파서(class.hHtmlParser.php) 수정
  • (버그)행번호 276번 attrib_to_array() 함수 수정
  • (개선)삼중 인용 부호 처리
홈페이지 문서(후키라이브러리>>후키템플릿) 수정
  • (오기?)"템플릿의 switch문" 중 "BOOLEAN 인덱스" 항목 내용 수정
  • (문법변경)"템플릿의 switch문" 중 ""반복 switch문" 항목 내용 수정
0.0.2 (2002.7.17)
  • FastTemplate와의 호환성을 지원하지 않음, FastTemplate와의 호환 버전은 필요하다면 LIGHT 버전으로 별도 공개하겠음
  • 미리 정의된 템플릿 변수 제공("미리 정의된 템플릿 변수" 참조)
  • switch문 강화("템플릿의 switch문" 참조)
  • URL 자동 변경 기능 보완
  • 복수 템플릿 파일에서 각 파일마다 독립적인 헤더 태그 내용 구성("복수 템플릿 파일의 용법" 참조)
  • PHP_OS 상수를 이용하여 서버가 윈도우 시스템인지 아닌지 자동 판별
  • 템플릿 변수를 나타내는 "{" 문자를 일반 문자로 템플릿에 포함할 수 있음
  • 복수 case문을 나타내는 "|" 문자를 일반 문자로 switch문 안에 포함할 수 있음
  • 논리 부정 연산자 "!" 제공
  • assign() 함수가 나타난 이후에도 define() 함수를 사용할 수 있음
  • "define(템플릿명, 템플릿 파일명)"에 의한 단일 템플릿 파일 지정 방법 추가
  • 파일시스템용 후키 캐시 파일명 변경(class.hCacheFile.php -> class.hCache.php)
  • 파일시스템용 후키 캐시만 지원
0.0.1-패치5 (2002년4월25일)
  • 서버가 윈도우 시스템인지 아닌지 자동 판별
  • switch문 내에서 템플릿 변수 사용시 문제 해결
  • URL 자동 변경 기능 개선
0.0.1-패치4 (2002년4월1일)
다양한 형태의 URL을 지원하기 위하여 rebound_url 함수를 수정하였습니다.
0.0.1-패치3 (2002년3월25일)
복수 case문에서의 각 case문을 콤마대신에 "|" 문자로 구분하도록 수정하였습니다. 문제점을 지적하여 주신 MagicStorm(궁금) 님에게 감사드립니다.
  • 멤버변수 $CASE_SEPARATOR 추가
  • set_tpl_body 함수 수정
  • tag_to_string 함수 추가 수정
0.0.1-패치2 (2002년3월21일)
궁금 님이 지적하신 문제(태그 내에 템플릿 변수가 있는 경우)를 해결하기 위하여 수정하였습니다.
  • set_path 함수 수정
  • rebound_url 함수 수정
  • rebound_attrib_url 함수 신설
  • attrib_to_string 함수 수정
  • tag_to_string 함수 수정
0.0.1-patch1 (2002년2월26일)
error reporting level을 NOTICE까지 포함하여 설정하게 되면 몇몇 문장에서 NOTICE 에러가 발생하는 것을 확인하였습니다. 아래는 수정된 행번호 및 내용입니다. 이 문제는 amocra 님이 지적하여 주었습니다.
  • 222행 수정 : if (!empty($arg["update"]));
  • 694행 수정 : if (isset($this->TPLS["*_VAR_defined_in_TPL_*"])) $this->VARS = $this->TPLS["*_VAR_defined_in_TPL_*"];
  • 777행 수정 : if (isset($this->VARS[$var_name]) && is_array($this->VARS[$var_name])) {
  • 855행 수정 : if (!$value || $this->empty_tpl('.'==$value[0] ? substr($value,1) : $value)) {
0.0.1-beta (최초 공개 버전,2002년1월26일)
  • FastTemplate와의 호환성에 중점을 두고 개발
  • 중첩 블록 기능 추가
  • 처리 속도 향상
  • 위지윅 방식으로 구현된 switch문
  • URL 자동 변경 기능

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

{후키템플릿}5.2.조건 변수  (0) 2006.11.02
{후키템플릿}5.3.블록 변수  (0) 2006.10.30
{후키템플릿}8.5.전처리 명령  (0) 2006.10.16
{후키템플릿}8.4.php 명령  (0) 2006.10.16
{후키템플릿}7.2.내용 형식  (0) 2006.10.16
Posted by 방글24