phpsource/템플릿2006. 9. 20. 13:47
written: Jan 28 2002
last modified: Sep 20 2006
블록 제어하기
이것은 Q & A 게시판에 "산적"님이 질문했던 내용입니다. 블록 부분을 상황에 따라 보여주기도 하고 감추기도 하기 위한 제어 방법입니다. 예를 들어 만약 "지출항목"과 "지출금액(원)"을 나타내는 제목 부분을 나타낼 때는 아래와 같이 보여주겠지요.
2001년 12월 가게부
지출항목 지출금액(원)
자동차유지비 200,000
반찬값 180,000
학원비 350,000
반면에 이 부분을 감춘다면 아래와 같을 것입니다.
2001년 12월 가게부
자동차유지비 200,000
반찬값 180,000
학원비 350,000
이것을 블록변수(다이나믹블록)로 처리했을 때 php 코드에서 제어하는 방법에 대하여 살펴보지요.
템플릿 파일 작성 main.htm
작성된 템플릿 main.htm을 보면 "지출항목"과 "지출금액(원)"을 나타내는 부분을 블록 IF_BLOCK로 묶어준 것을 볼 수 있습니다.
[code html;gutter:false] <TABLE border="1" width="297"> <TR> <TD colspan="2" width="287" align="center">2002년 6월 가게부</TD> </TR> <!--{@IF_BLOCK}--> <TR> <TD width="91" align="center">지출항목</TD> <TD width="190" align="center">지출금액(원)</TD> </TR> <!--{/}--> <TR> <TD align="center">자동차유지비</TD> <TD align="center">200,000</TD> </TR> <TR> <TD align="center">반찬값</TD> <TD align="center">180,000</TD> </TR> <TR> <TD align="center">학원비</TD> <TD align="center">350,000</TD> </TR> </TABLE> [/code]
PHP 코드 작성 test.php
$a가 true일 때만 블록 IF_BLOCK에 대한 템플릿 변수 IF_BLOCK에 대한 값을 할당합니다. 할당하지 않으면 기본적으로 템플릿 변수 IF_BLOCK에는 빈문자열이 할당되어 있지요.
[code php;gutter:false] <?php include_once('./class.hTemplate.php'); $tpl = new hTemplate('.'); $tpl->define( array( 'test' => 'main.htm' ) ); /** * 블록을 보여주고 싶으면 $a를 true로 설정하고 감추고 싶으면 $a를 false로 설정함 */ $a = false; //$a = true; if ($a) $tpl->assign('IF_BLOCK', 'IF_BLOCK'); else $tpl->assign('IF_BLOCK', ''); $tpl->assign('TEST', 'test'); $tpl->output('TEST'); ?> [/code]
define() 함수에 의해 main.htm을 파싱할 때 템플릿 파일에 포함된 모든 블록은 별도의 템플릿명으로 분리됩니다. 이 템플릿명이 바로 블록명과 동일하지요.
템플릿 test에 저장된 값
템플릿 파일 main.htm은 파싱된 후에는 아래와 같이 분석된 후 define으로 지시된 템플릿 test에 저장됩니다.
[code html;gutter:false] <TABLE border="1" width="297"> <TR> <TD colspan="2" width="287" align="center">2002년 6월 가게부</TD> </TR> {IF_BLOCK} <TR> <TD align="center">자동차유지비</TD> <TD align="center">200,000</TD> </TR> <TR> <TD align="center">반찬값</TD> <TD align="center">180,000</TD> </TR> <TR> <TD align="center">학원비</TD> <TD align="center">350,000</TD> </TR> </TABLE> [/code]
실제적으로 템플릿 test에 저장되는 것은 위와 같은 단순한 문자열은 아니고 좀더 복잡한 배열구조로 되어있지요. 다만 개념상 위와 같다는 것입니다.
저장된 내용을 보면 블록 부분이 없어지고 대신에 새로운 템플릿 변수명 {IF_BLOCK}이 자리를 차지하고 있는 것을 볼 수 있습니다.
템플릿 IF_BLOCK에 저장된 값
템플릿 test에 위와 같은 값이 저장됨과 동시에 블록에 해당하는 템플릿이 작성되지요. 즉, 블록명과 동일한 이름의 템플릿 IF_BLOCK에는 아래와 같은 값이 저장됩니다.
[code html;gutter:false] <TR> <TD width="91" align="center">지출항목</TD> <TD width="190" align="center">지출금액(원)</TD> </TR> [/code]
템플릿 변수 IF_BLOCK의 생성 및 초기화
또한 이와 동시에 블록에 해당하는 템플릿 변수가 생성되며 빈문자열로 초기화 됩니다. 즉,
[code php;gutter:false] $tpl->assign('IF_BLOCK', ''); [/code]
와 같은 초기화 작업이 내부적으로 이루어진다고 보면 됩니다. 따라서 아래의 코드 중에 else 문 이하의 문장은 실제로 없어도 되는 부분입니다.
[code php;gutter:false] if ($a) $tpl->assign('IF_BLOCK', 'IF_BLOCK'); else $tpl->assign('IF_BLOCK', ''); [/code]
결국 템플릿 IF_BLOCK를 이용하여 템플릿 변수 IF_BLOCK의 값을 재할당하지 않으면 템플릿 변수 IF_BLOCK에는 초기값인 빈문자열이 있게 되는 것입니다. 따라서 $a가 false일 때는 블록 IF_BLOCK 부분이 사라지게 되는 것이지요.
 블록의 경우는 블록명과 템플릿명과 템플릿 변수명이 동일하여 혼동되기 쉬우니 주의하시기 바랍니다.

Posted by 방글24