phpsource/템플릿2006. 9. 20. 13:48
written: Jan 28 2002
last modified: Sep 20 2006
중첩 블록을 이용하기
FastTemplate은 블록들의 깊이를 하나로 제한합니다. 이것은 블록 안에 또 다른 블록(이하 중첩 블록)을 넣을 수 없다는 것을 말합니다. 따라서 중첩 블록이 필요하다면 해결방법은 오직 블록을 별도의 파일로 분리하는 것입니다.
하나의 웹페이지를 블록의 기능 제한때문에 분리 관리한다는 것은 불합리합니다. FastTemplate의 이러한 문제를 해결하기 위하여 중첩 블록을 허용하도록 Roland Roberts에 의해 수정된 rFastTemplate가 이미 공개되어 있습니다. 후키템플릿도 같은 이유로 FastTemplate을 수정하게 되었습니다. 물론 다른 이유도 있었지만......
중첩 블록을 이용하는 방법이라고 특별히 사용방법이 다르지는 않습니다. 위의 가게부 예제를 가지고 살펴보겠습니다. 여기서는 한 페이지 내에 12월 한달만이 아닌 2001년 4/4분기 4달을 전부 나타내도록 해 보지요.
2001년 4/4분기 가게부
2001년 9월 가게부
지출항목 지출금액(원)
자동차유지비 100,000
반찬값 80,000
학원비 350,000
2001년 10월 가게부
지출항목 지출금액(원)
자동차유지비 150,000
반찬값 130,000
학원비 350,000
2001년 11월 가게부
지출항목 지출금액(원)
자동차유지비 160,000
반찬값 140,000
학원비 350,000
2001년 12월 가게부
지출항목 지출금액(원)
자동차유지비 200,000
반찬값 180,000
학원비 350,000
위 문서를 가지고 템플릿을 작성해 보면 아래와 같이 될 것입니다.
{YEAR}년 {BRANCH}분기 가게부
{MONTH}월
지출항목 지출금액(원)
{ITEM} {MONEY}
템플릿 파일 작성
위의 템플릿에 대한 HTML 소스는 대략 다음과 같을 것입니다.
[code html;gutter:false] <!-- NAME: table.htm --> <TABLE align="center" width="280" bgcolor="#ECF5FF" border="1" cellpadding="0" cellspacing="0"> <TR class="td"> <TD bgcolor="#FFFFCC" width="100%" align="center"> {YEAR}년 {BRANCH}분기 가게부 </TD> </TR> <!-- BEGIN DYNAMIC BLOCK: month_row --> <TR class="td"> <TD align="center"> <TABLE border="1" width="100%" cellpadding="0" cellspacing="0"> <TR class="td"> <TD width="100%" colspan="2" align="center"> {MONTH}월 </TD> </TR> <TR bgcolor="#8AB7E3" class="td"> <TD width=50% align="center">지출항목</TD> <TD width=50% align="center">지출금액(원)</TD> </TR> <!-- BEGIN DYNAMIC BLOCK: row --> <TR bgcolor="#8AB7E3" class="td"> <TD align="center">{ITEM}</TD> <TD align="center">{MONEY}</TD> </TR> <!-- END DYNAMIC BLOCK: row --> </TABLE> </TD> </TR> <!-- END DYNAMIC BLOCK: month_row --> </TABLE> [/code]
PHP 코드 작성 book.php
이제는 중첩 블록이 포함된 템플릿을 위한 PHP 문서를 구성하여 보겠습니다.
[code php;gutter:false] <?php /** * file : book.php * * 일반적으로 지출항목 및 지출금액은 데이터베이스로부터 읽어오게 될 것이다. * 아래와 같이 데이터베이스로부터 읽어들인 값이 $item과 $money 배열에 * 순서대로 저장되었다고 가정합니다. * * $item[0] = "자동차유지비"; * $item[1] = "반찬값"; * $item[2] = "학원비"; * * 9월 : * $money[9][0] = 100000; * $money[9][1] = 80000; * $money[9][2] = 350000; * * 10월 : * $money[10][0] = 150000; * $money[10][1] = 130000; * $money[10][2] = 350000; * * 11월 : * $money[11][0] = 160000; * $money[11][1] = 140000; * $money[11][2] = 350000; * * 12월 : * $money[12][0] = 200000; * $money[12][1] = 180000; * $money[12][2] = 350000; */ include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates); $tpl->define( array( 'table' => 'table.htm' ) ); $tpl->assign( array( 'YEAR' => '2001', 'BRANCH' => '4/4' ) ); for ($k=9;$k<13;$k++) { for ($i=0;$i<3;$i++) { $tpl->assign( array( 'ITEM' => $item[$i], 'MONEY' => $money$money[$k][$i] ) ); $tpl->assign('row', 'row', true); } $tpl->assign('MONTH', $k); $tpl->assign('month_row', 'month_row', true); $tpl->assign('row', ''); } $tpl->assign('TABLE', 'table'); $tpl->output('TABLE'); ?> [/code]
rFastTemplate와의 호환성
후키템플릿과 마찬가지로 블록의 중첩을 허용하고 있는 rFastTemplate와의 호환성을 유지하려면 일부 문장을 아래와 같이 수정하세요. 그러면 양쪽 모두에서 정상적으로 동작할 것입니다.
assign('row', 'row', true); --> parse('DUMMY', '.row');
assign('month_row', 'month_row', true); --> parse('DUMMY', '.month_row');
assign('row', ''); --> clear_dynamic('row')
assign('TABLE', 'table'); --> parse('TABLE', 'table');
rFastTemplate에서 parse 함수의 첫 번째 인수에 지정된 이름은 의미없는 이름으로 어떠한 이름을 지정하여도 관계없습니다.

Posted by 방글24