phpsource/템플릿2006. 9. 20. 11:07

written: Jan 28 2002
last modified: Sep 20 2006
반복문 구문 형식의 제한
{변수명,경우의수}과 {변수명}와 같은 1.2.0 이전 버전까지 사용하던 템플릿변수 표현식에서는 아래와 같이 HTML의 스타일 문장의 예처럼 {font-family:verdana, arial}과 {font-family:굴림} 부분이 템플릿 변수의 구문형식과 동일하여 이 부분을 템플릿변수로 처리하는 해결하기 곤란한 버그가 있었습니다.
[code html;gutter:false] <STYLE> BODY, table {font-family:verdana, arial} myTD {font-family:굴림} </STYLE> [/code]
1.2.0 버전부터는 {변수명:반복문,경우의수}과 {변수명:반복문}과 같은 구문형식을 허용하지 않습니다. 1.2.0 버전에서 반복문을 사용하기 위하여는 아래와 같이 1.2.0 버전부터 추가된 새로운 구문형식을 이용하여야 합니다.
{변수명;반복문}
{?변수명;반복문}경우의수{/}
정리하면 아래와 같습니다.
< 템플릿 구문 형식 >
종 류 舊구문형식 新구문형식
구문형식 예제 구문형식 예제
단순변수 {변수명::초기값} {VAR}
{VAR::100}
{변수명;반복문;초기값} {VAR;1-3}
{VAR;1-3;100}
스위치문 {변수명::초기값,경우의수} {VAR,A|B|C}
{VAR::2,A|B|C}
{?변수명;반복문;초기값}경우의수{/} {?VAR;1-3}A|B|C{/}
{?VAR;1-3;2}A|B|C{/}
css 문과의 충돌을 피하기 위하여 반복문과 초기값을 구분하는 구분자를 콜론(:) 대신에 세미콜론(;)을 사용하도록 하였습니다.
변수 옵션 repeat
1.2.0 버전부터는 반복문 위치에 반복문 외에도 여러가지 변수 옵션을 지정할 수 있습니다. 지정할 수 있는 변수 옵션으로는 반복문을 의미하는 repeat 외에도 ctype, allow_filter, tr이 있습니다. 반복문 옵션인 repeat 외의 변수 옵션에 대하여는 5.1.템플릿 변수를 참조바랍니다.
{?VAR;1-3}A|B|C{/}
위는 조건변수에 반복문을 적용한 경우입니다. 이러한 반복문은 변수옵션 repeat를 이용하여 아래와 같이 작성할 수 있습니다.
{?VAR;repeat=1-3}A|B|C{/}
위의 2가지 조건변수들은 동일한 결과를 나타냅니다.
반복문
0.0.2 버전에서는 조건변수(스위치문)에서만 가능했던 반복문을 0.0.3 버전부터는 단순변수에까지 반복할 수 있도록 하였습니다.
아래와 같이 템플릿 파일 main.htm을 작성하면 템플릿 변수 {REPEAT}를 3번 반복하여 생성시킬 수 있습니다.
[code html;gutter:false] <!-- NAME: main.htm --> {REPEAT;6-8} <!-- END: main.htm --> [/code]
difine() 메소드에 의해 템플릿 파일이 분석될 때 템플릿 변수 {REPEAT}가 {REPEAT.6}, {REPEAT.7}, {REPEAT.8}으로 반복해서 생성될 것입니다.
[code php;gutter:false] <?php include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'main' => 'main.htm', ) ); $tpl->assign( array( 'REPEAT.6' => '6<br>', 'REPEAT.7' => '7<br>', 'REPEAT.8' => '8<br>' ) ); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
이를 출력하면 아래와 같겠지요. 이와 같이 조건변수(스위치문)가 아니더라도 모든 템플릿 변수를 반복하여 생성시킬 수 있습니다.
6
7
8
반복되는 조건변수
대부분의 게시판 목록보기를 보면 아래와 같이 각 페이지에 직접 접근할 수 있도록 하단에 페이지 링크(이하 페이지 블록이라 칭함)를 제공합니다. 이것을 조건변수(스위치문)를 이용하여 템플릿에서 작성하려면 많은 노력이 필요할 것입니다. 그래서 대부분은 페이지 블록을 템플릿 변수 하나로 할당하여 나타내는 것이 일반적이지요.
< 게시판 목록보기의 페이지 블록의 예 >
페이지 블록의 전체 HTML 코드를 PHP 코드에서 assign() 함수를 이용하여 할당한다면 페이지 블록에 대한 디자인을 변경할 때 그 작업을 디자이너가 아닌 PHP 프로그래머가 담당해야 할 것입니다. 이는 템플릿툴을 이용하는 근본 취지에서 벗어나는 좋지 못한 방법이 될 것입니다.
이러한 문제를 극복하기 위하여 페이지 블록을 조건변수를 반복적으로 사용하여 작성할 수 있겠지요.
[code html;gutter:false] {?Flag.0} {Num.0} | <A href="xxx">[{Num.0}]</A> {/} {?Flag.1} {Num.1} | <A href="xxx">[{Num.1}]</A> {/} {?Flag.2} {Num.2} | <A href="xxx">[{Num.2}]</A> {/} {?Flag.3} {Num.3} | <A href="xxx">[{Num.3}]</A> {/} {?Flag.4} {Num.4} | <A href="xxx">[{Num.4}]</A> {/} {?Flag.5} {Num.5} | <A href="xxx">[{Num.5}]</A> {/} {?Flag.6} {Num.6} | <A href="xxx">[{Num.6}]</A> {/} {?Flag.7} {Num.7} | <A href="xxx">[{Num.7}]</A> {/} {?Flag.8} {Num.8} | <A href="xxx">[{Num.8}]</A> {/} {?Flag.9} {Num.9} | <A href="xxx">[{Num.9}]</A> {/} [/code]
위에서 {Flag.0}부터 {Flag.9}까지 동일한 구성으로 반복되는 것을 볼 수 있습니다. 이와 같이 구성이 반복되는 조건변수의 경우에는 아래와 같이 간단하게 나타낼 수 있습니다.
[code html;gutter:false] {?Flag;9} {Num;} | <A href="xxx">[{Num;}] {/} [/code]
만약 0이 아닌 0보다 큰 수부터 시작하고 싶으면 아래와 같이 시작하는 정수 인덱스를 지정하면 됩니다. 시작하는 정수 인덱스는 위에서와 같이 생략할 수 있지만 마지막 정수 인덱스는 항상 지정하여야 합니다.
[code html;gutter:false] {?Flag;5-9} {Num;} | <A href="xxx">[{Num;}] {/} [/code]
이것은 hTemplateParser 클래스에 의해 아래와 같이 전개됩니다.
[code html;gutter:false] {?Flag.5} {Num.5} | <A href="xxx">[{Num.5}]</A> {/} {?Flag.6} {Num.6} | <A href="xxx">[{Num.6}]</A> {/} {?Flag.7} {Num.7} | <A href="xxx">[{Num.7}]</A> {/} {?Flag.8} {Num.8} | <A href="xxx">[{Num.8}]</A> {/} {?Flag.9} {Num.9} | <A href="xxx">[{Num.9}]</A> {/} [/code]
페이지 블록의 HTML 코드를 PHP 코드로 생성하지 않고 이와 같이 반복되는 조건변수를 이용하면 디자인을 나모와 같은 웹에디터에서 보다 쉽게 변경할 수 있을 것입니다.
[주의] 버전 0.0.2 패치1부터는 반복되는 조건변수 내의 변수 중 반복해야할 변수에는 {Num;}와 같이 ';' 문자 붙여야 하며 반복해서는 안될 변수에는 {_SERVER.PHP_SELF}와 같이 ';' 문자를 붙여서는 안됩니다.
[주의] 버전 1.2.0부터는 콜론(:) 문자 대신에 세미콜론(;) 문자를 사용합니다.
[code html;gutter:false] {?Flag;2} {Num;} | <A href="{_SERVER.PHP_SELF}?page={Num;}>[{Num;}]</A> {/} [/code]

Posted by 방글24