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