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