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
phpsource/템플릿2006. 9. 20. 11:05
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 변수의 사용범위(scope)
템플릿 파일에 포함된 템플릿 변수는 그 사용범위가 모든 템플릿 파일에 미칩니다. 이로 인해 동일한 템플릿 변수가 서로 다른 템플릿 파일에 나타내려고 할 때는 주의해야겠지요.
예를 들어 아래와 같이 템플릿 파일 test1.htm, test2.htm이 아래와 같이 작성되었다고 하지요.
[code html;gutter:false] <!-- test1.htm --> <P>{VAR}</P> <!-- test2.htm --> <P>{VAR}</P> [/code]
test1.htm의 {VAR}에는 '사과'라고 출력하려고 하며, test2.htm의 {VAR}에는 '바나나'라고 출력하려고 합니다.
이 때 이를 처리하기 위한 php 소스가 아래와 같다고 하지요.
[code php;gutter:false] include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate(); $tpl->define( array( 'test1' => 'test1.htm', 'test2' => 'test2.htm' ) ); $tpl->assign( array( 'VAR' => '사과', 'TEST1' => 'test1' ) ); $tpl->assign( array( 'VAR' => '바나나', 'TEST2' => 'test2' ) ); $tpl->output( array( 'TEST1', 'TEST2' ) ); [/code]
이 스크립트를 실행하면 아래와 같이 출력되겠지요.
사과
바나나
그런데 만약 위의 php 소스에서 피치못할 이유로 인해 아래와 같이 assign으로 처리하는 순서를 바꾸어야 한다고 하지요.
[code php;gutter:false] include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate(); $tpl->define( array( 'test1' => 'test1.htm', 'test2' => 'test2.htm' ) ); $tpl->assign( array( 'VAR' => '사과' ) ); . . . $tpl->assign( array( 'VAR' => '바나나' ) ); $tpl->assign( array( 'TEST1' => 'test1', 'TEST2' => 'test2' ) ); $tpl->output( array( 'TEST1', 'TEST2' ) );[/code]
위 소스의 결과는 어떻게 될까요? 아래와 같이 우리가 원하지 않는 결과가 나타나게 되지요.
바나나
바나나
이것은 템플릿 'test1'과 'test2'를 어디서 처리하느냐에 따라 그 결과가 달라진다는 것이지요. 웹문서 구조가 단순하다면 문제를 해결하는 것이 그다지 복잡하지는 않겠지만 웹문서 구조가 조금만 복잡해 지면 템플릿 변수명을 구별하기가 쉽지는 않을 것입니다.
멤버 템플릿 변수
만약 클래스의 멤버변수처럼 현재 템플릿 파일에서만 유효한 템플릿 변수를 정의할 수 있다면 매우 유용할 것입니다. 그러면 여러개의 템플릿 파일이 존재하더라도 템플릿 변수명때문에 다른 템플릿 파일을 확인할 필요는 없겠지요.
객체지향언어에서 범위연산자 '::'를 이용하여 '클래스명::정적멤버변수'와 같이 특정 클래스에 정의된 정적멤버변수에 접근할 수 있듯이 '템플릿명::템플릿변수명'과 같이 특정 템플릿 파일 내에서 정의된 템플릿에 접근할 수 있습니다. 이와같이 특정 템플릿 파일 내에서 사용되는 템플릿 변수를 멤버 템플릿 변수라고 합니다.
현재 템플릿 파일 내에서 사용되는 템플릿 변수를 정의할 때는 아래와 같이 템플릿명없이 범위연산자(::)와 변수명으로 정의하여 줍니다.
[code php;gutter:false] <!-- test1.htm --> <P>{::VAR}</P> <!-- test2.htm --> <P>{::VAR}</P>[/code]
php 소스에서는 특정 템플릿의 멤버 템플릿 변수에 접근하기 위하여는 아래와 같이 범위연산자 앞에 템플릿명을 표시하여야 합니다.
[code php;gutter:false] include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate(); $tpl->define( array( 'test1' => 'test1.htm', 'test2' => 'test2.htm' ) ); $tpl->assign( array( 'test1::VAR' => '사과' ) ); . . . $tpl->assign( array( 'test2::VAR' => '바나나' ) ); $tpl->assign( array( 'TEST1' => 'test1', 'TEST2' => 'test2' ) ); $tpl->output( array( 'TEST1', 'TEST2' ) ); [/code]
assign() 함수에서 범위연산자 앞에 'test1'과 'test2'는 define함수에서 지정한 템플릿명을 의미합니다. 아래와 같이 멤버 템플릿 변수를 이용하면 'test1'과 'test2'를 처리하는 assign() 함수의 위치에 관계없이 우리가 원하는 결과를 얻을 수 있을 것입니다.
사과
바나나
멤버 템플릿 변수도 다른 템플릿 변수와 마찬가지로 아래와 같이 초기값 등을 지정할 수 있습니다.
{::변수명:범위:초기값} <<<--- 1.1.1 버전까지의 구문형식
{::변수명;범위;초기값} <<<--- 1.2.0 버전부터의 구문형식

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:42
written: Jan 28 2002
last modified: Sep 20 2006
HTML 파서 정보
$tpl = new hTemplate(템플릿 파일 기본 디렉토리, 캐시 정보, 
array(
'active_html_parse' => false or not,
'active_url_redirection' => false or not,
'active_absolute_path' => true or not,
'active_html_compress' => true or not,
'active_html_header' => false or not,
'active_tag_lowercase' => true or not
)
);
후키템플릿 생성자의 세 번째 인수로 HTML 파서 정보가 전달됩니다.
active_html_parse
'active_html_parse' => false or not
HTML 파서 기능을 동작시키지 않으려면 false로 설정하며 기본값은 true입니다.
active_html_parse 값이 false로 설정되어 있으면 '다중템플릿 파일의 특수용법'과 같은 HTML 파서를 통해 제공되는 기능들을 이용할 수 없습니다.
active_url_redirection
'active_url_redirection' => false or not
URL 자동 변경 기능을 이용하지 않으려면 false로 설정하며 기본값은 true입니다.
URL 자동 변경 기능은 HTML 파서 기능에 포함된 서브 기능이므로 URL 자동 변경 기능을 이용하려면 먼저 HTML 파서 기능을 활성화시켜야 합니다. 따라서 active_html_parse가 false로 설정되어 있으면 active_url_redirection 값에 관계없이 URL 자동 변경 기능을 수행하지 않습니다.
active_absolute_path
'active_absolute_path' => false true or not
1.1.0 버전에서 추가된 기능으로 URL 경로를 절대경로로 변경할 때 true로 설정하며 기본값은 false입니다.
절대경로 변경 기능은 URL 자동 변경 기능에 포함된 서브 기능이므로 절대경로 변경 기능을 이용하려면 먼저 URL 자동 변경 기능을 활성화시켜야 합니다. 따라서 active_url_redirection가 false로 설정되어 있으면 active_absolute_path 값에 관계없이 절대경로 변경 기능을 수행하지 않습니다.
active_absolute_path가 true가 아니면 현재 웹문서의 절대경로를 최상위 경로(루트 디렉토리)를 경유하는 상대 경로로 변경해 줍니다.
active_html_compress
'active_html_compress' => true or not
HTML 문서 압축 기능을 수행하려면 'active_html_compress' 값을 true로 설정하며 초기값은 false입니다.
HTML 문서 압축 기능은 HTML 파서 기능에 포함된 서브 기능이므로 HTML 문서 압축 기능을 이용하려면 먼저 HTML 파서 기능을 활성화시켜야 합니다. 따라서 active_html_parse가 false로 설정되어 있으면 active_html_compress 값에 관계없이 HTML 문서 압축 기능을 수행하지 않습니다.
HTML 문서 압축 기능은 hTemplate 및 hHtmlClassify 클래스에서 수행하는 기능으로 출력되는 HTML 문서의 전송량을 줄이기 위하여 아래의 작업들을 수행합니다.
1. 자바스크립트 내에 있는 주석 태그를 제거
2. 리턴, 탭을 제거
3. 연속된 스페이스를 단일 스페이스로 수정
4. 단일 스페이스 문자는 제거
<pre>~</pre>의 내용의 경우에는 리턴, 탭, 스페이스를 원래대로 유지하여야 하기 때문에 <pre>~</pre>의 내용은 압축하지 않습니다.
이 기능은 웹브라우저에 출력하는데는 별문제가 없겠지만 소스보기를 할 때 가독성이 나빠지는 문제가 있으니 선택에 주의하여 주시기 바랍니다.
또한 아래의 예와 같은 자바스크립트 내에 있는 주석 태그를 제거하기 때문에 브라우저에 따라 정상적으로 동작하지 않을 수도 있습니다.
[code html;gutter:false] <SCRIPT language="JavaScript"> <!-- document.write("hello! JavaScript"); //-> </SCRIPT> [/code]
결과적으로 위 문장은 아래와 같이 압축하게 됩니다.
[code html;gutter:false] <SCRIPT language="JavaScript"> document.write("hello! JavaScript"); </SCRIPT> [/code]
3번째 작업(단일 스페이스 문자의 제거) 결과로 인해 문서가 정상적으로 출력되지 못하는 경우도 발생할 수 있습니다. 이러한 경우가 발생하면 "질문/건의/버그리포팅" 게시판을 통해 그 내용과 함께 알려주시기 바랍니다.
active_html_header
'active_html_header' => false or not
1.1.0 버전에서 추가된 기능으로 html 헤더 출력 유무를 선택할 때 사용하는 기능으로 <BODY>,</BODY> 태그 안쪽만 출력하려면 false를 설정하며 기본값은 true입니다.
active_tag_lowercase
'active_tag_lowercase' => true or not
생성되는 HTML 스크립트에 HTML 태그를 대문자 또는 소문자로 선택하여 나타낼 수 있도록 하는 기능입니다.
후키템플릿 생성자의 세 번째 인수로 HTML 파서 정보가 전달됩니다. 이곳에 active_tag_lowercase의 값을 true로 설정하여 전달하면 output() 함수로 출력되는 문서에 나타나는 HTML 태그를 소문자로 표시할 수 있습니다. 생략하면 기본값으로 true가 선택되어 있어 소문자로 표시됩니다. 이전버전과 같이 대문자로 출력하기 위해서는 active_tag_lowercase의 값을 false로 설정하여야 합니다.
[code php;gutter:false] $tpl = new hTemplate( array( $theme_dir ), array( 'path' => $cache_dir, 'id' => $tpl_id ), array( 'active_tag_lowercase' => false ) ); [/code]

Posted by 방글24