phpsource/템플릿2006. 9. 29. 13:40
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
래핑(wrapping)
이미 작성된 템플릿 문서와 php 문서를 전혀 건드리지 않고 이 문서 앞 뒤로 새로운 템플릿 문서를 추가하거나 기작성된 템플릿 문서를 필터명령으로 수정할 수 있도록 하는 기능입니다.
그림에서 보듯이 내용물이 동일하더라도 포장을 어떻게 하느냐에 따라 결과물을 전혀 다르게 보일 수 있습니다. 이와 같이 랩핑 기능을 이용하면 기작성되어 있는 템플릿 문서와 php 문서를 손대지 않고도 전혀 다른 결과물을 얻을 수 있습니다.
기작성되어 있는 템플릿 문서가 아래와 같을 경우를 살펴보겠습니다.
[code html;gutter:false] <!-- template file : main.htm --> 오른쪽에 우리집이 있다. [/code]
일반적으로 php 문서에서 main.htm 문서를 처리하면 "오른쪽에 우리집이 있다"라는 HTML 스크립트를 생성할 수 있습니다. 이 문서를 래핑 기능과 필터 기능을 이용하면 아래와 같이 수정할 수 있습니다.
[code html;gutter:false] <!-- wrapping file : wrap.main.htm --> {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }{/} [/code]
기작성된 템플릿 문서 main.htm을 래핑하는 래핑 문서 wrap.main.htm을 같은 디렉토리 또는 그 상위 디렉토리에 저장하는 것으로 래핑 기능을 사용할 준비는 다 된 것입니다.
래핑 파일(wrap.main.htm) 내에 파일명이 생략된 파일변수가 존재하면 아래와 같이 wrapped 파일명(main.htm)을 지정한 것 문서와 같은 동작을 합니다.
[code html;gutter:false] {#sample_wrap;; =str_replace("오른쪽", "왼쪽", {_SELF}); }main.htm{/} [/code]
php 스크립트에서는 main.htm 대신에 wrap.main.htm을 define 처리합니다. 이 부분까지가 래핑 기능이 하는 역할입니다. 나머지는 이미 소개한 필터 기능에 의하여 "오른쪽에 우리집이 있다" 대신에 "왼쪽에 우리집이 있다"라는 HTML 스크립트를 생성하게 됩니다.
래핑 문서의 파일명은 기작성 템플릿 문서 파일명 앞에 서두문자 "wrap."을 붙이면 됩니다.
앞에서 설명한 바와 같이 래핑 문서를 기작성 템플릿 문서와 동일한 디렉토리에 저장할 수도 있고 그 상위 디렉토리에 저장할 수도 있습니다. 만약 두 곳 모두에 래핑 문서가 존재한다면 기작성 템플릿 문서와 동일한 디렉토리에 있는 래핑 문서에 우선권이 있습니다..
< 특정 템플릿에 종속된 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리와 blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 각각 동일한 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리되며, blogmeme_yellow 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap.skin.html에 의해 처리됩니다.
만약에 동일한 디렉토리 내에 다양한 이름을 가진 템플릿 문서를 모두 처리할 수 있는 래핑 문서를 작성하려면 그 이름을 아래와 같이 wrap._global.html로 지정하면 됩니다..
< 모든 템플릿에서 접근할 수 있는 래핑문서 >
템플릿 문서와 래핑 문서가 위와 같은 구조로 구성된 경우를 살펴보면, blogmeme_cobalt 디렉토리에 있는 템플릿 문서 skin_1.html, skin_2.html, skin_3.html은 모두 동일한 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리되며, blogmeme_white 디렉토리에 있는 템플릿 문서 skin.html은 그 상위 디렉토리에 있는 래핑 문서 wrap._global.html에 의해 처리됩니다.
위의 4가지 경우의 래핑문서가 모두 존재한다면 그 우선순위는 아래와 같습니다.
① 동일 디렉토리의 wrap.skin.html
② 차상위 디렉토리의 wrap.skin.html
③ 동일 디렉토리의 wrap._global.html
④ 차상위 디렉토리의 wrap._global.html

Posted by 방글24
phpsource/템플릿2006. 9. 29. 13:33
written: Sep 29 2006
[버전1.2.0 제안서] 여기서 기술한 내용은 확정된 용법이 아니라 다음 버전을 발표할 때까지 여러분의 의견 수렴을 통해 더 검토되어야 하는 제안서(proposal)로 문법적인 내용이 다소 변경될 수 있음을 미리 밝혀둡니다.
다음 버전부터는 필터 기능을 지원하지 않습니다. 필터기능은 다른 방법으로 단순화시켜 제공할 생각입니다.
필터 함수
필터함수에는 사용자정의 필터함수(user defined filter function)와 내장 필터함수(built-in filter function)로 구분할 수 있습니다. 내장 필터함수는 템플릿 문서를 작성하는데 도움이 될 만한 함수를 후키템플릿 클래스에 포함시켜 제공됩니다. 사용자정의 필터함수는 사용자가 직접 필요한 필터함수를 정의하여 사용할 수 있습니다.
필터함수 정의하기
모든 필터함수는 아래와 같은 형식으로 정의되어야 합니다.
function 필터함수명($contents, $config [, ......]) {
......
return $contents;
}
필터함수는 템플릿 문서 내용이 첫번째 인자 $contents를 통해 전달받는데 각 실행시간에 따라 $contents의 형식과 내용이 다소 다릅니다. 전달받는 $contents의 형식과 내용에 대하여는 각 실행시간별로 살펴보겠습니다.
두번째 인자로 지정된 변수 $config는 템플릿 객체생성할 때 설정된 컴파일옵션과 템플릿명이 아래와 같은 배열 형식으로 설정되어 있습니다.
[config] => (array)
(
[active_absolute_path] => (boolean) false 또는 true
[active_html_compress] => (boolean) false 또는 true
[active_html_header] => (boolean) false 또는 true
[active_html_parse] => (boolean) false 또는 true
[active_tag_lowercase] => (boolean) false 또는 true
[active_url_redirection] => (boolean) false 또는 true
[template_name] => (string) 필터함수가 정의된 템플릿 문서의 템플릿명
)
사용자가 지정하지 않더라도 첫번째와 두번째 인자는 자동으로 필터함수로 넘어옵니다. 만약 $contents와 $confilg 정보 외에 다른 정보를 필터함수로 전달하기 위해서는 아래의 템플릿 문서의 예와 같이 필요한 정보를 필터함수와 함께 기술해주면 됩니다.
{#FILE;; =|user_filter("{_VERSION}", $global_var, "템플릿툴을 통한 홈페이지 제작 방안") }./test.htm{/}
위의 템플릿 문서 예에서 지정한 사용자정의 필터함수 user_filter()에는 사용자에 의해 템플릿변수 {_VERSION}, 전역변수 $global_var, 문자열 "템플릿툴을 통한 홈페이지 제작 방안"이 추가적으로 전달되고 있습니다. 추가된 정보를 필터함수에서 전달받기 위해서는 필터함수를 아래와 같이 정의하여야 합니다.
function user_filter($contents, $config, $version, $gVar, $str) {
......
return $contents;
}
사용자가 필터함수에 추가적으로 기술한 정보들은 필터함수의 세번째 인자부터 차례로 전달됩니다.
각 실행시간별로 필터함수를 정의하는 예를 살펴보기 위하여 우선 아래의 예제와 같은 템플릿 문서에 작성된 파일 변수에 지정된 각각의 필터함수를 정의해 보겠습니다.
{#FILE;;
initialize {%
=|initialize_skin();
%}
premacro {%
=|premacro_skin();
%}
precompile {%
=|precompile_skin();
%}
postcompile {%
=|postcompile_skin();
%}
preassign {%
=|preassign_skin();
%}
postassign {%
=|postassign_skin();
%}
output {%
=|output_skin();
%}
}./test.htm{/}
필터함수 이름은 사용자가 임의로 명명하여도 되지만 php 내장함수를 포함한 현재 페이지에서 사용 중인 사용자 정의 전역함수 이름과 중복하여 명명할 수 없습니다.
initialize 실행시간 필터함수 정의하기
initialize 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있으며, 아래와 같은 형식으로 정의합니다.
function initialize_skin($contents, $config [, ......]) {
......
return $contents;
}
initialize 실행시간 필터함수에 넘어오는 변수 $contents는 아무런 의미없는 빈문자열입니다. 리턴값 역시 별 의미가 없기 때문에 생략해도 됩니다만 향후 버전과의 호환성을 위하여 생략하지 말기 바랍니다.
premacro 실행시간 필터함수 정의하기
premacro 실행시간 필터함수는 내용형식(contents type)이 템플릿인 파일변수에서만 사용할 수 있고 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function premacro_skin($contents, $config [, ......]) {
......
return $contents;
}
premacro 실행시간 필터함수에 넘어오는 변수 $contents에는 파일변수에서 지정된 파일의 내용이 그대로 담겨있습니다.
템플릿 문서를 컴파일하려면 아래의 몇가지 예와 같이 각 버전별로 상이한 템플릿 변수 형식을 통일시키는 등의 문자열 치환 작업(매크로 작업)이 필요합니다.
① <!--{ 을 { 으로 치환
② }--> 을 } 으로 치환
③ <!-- BEGIN DYNAMIC BLOCK: 블록명 --> 을 {@ 블록명} 으로 치환
④ <!-- END DYNAMIC BLOCK: 블록명 --> 을 {/} 으로 치환
⑤ <!--#include file="파일명"--> 을 {#파일명} 으로 치환
⑥ 기타 등등
이러한 매크로 작업은 템플릿툴이 컴파일하기 전에 자동으로 처리하는데 premacro 실행시간 필터함수는 템플릿툴이 미리 지정된 매크로 작업을 하기 전에 사용자가 먼저 템플릿 문서 내용을 넘겨받아 처리해야 할 필요가 있을 때 작성하는 함수입니다.
precompile 실행시간 필터함수 정의하기
precompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function precompile_skin($contents, $config [, ......]) {
......
return $contents;
}
precompile 실행시간 필터함수에 넘어오는 변수 $contents에는 여러가지 문자열 치환 작업(매크로 작업)을 한 직후의 템플릿 내용이 문자열 형식으로 담겨있습니다.
postcompile 실행시간 필터함수 정의하기
postcompile 실행시간 필터함수는 템플릿 문서를 컴파일할 때만 실행하며, 아래와 같은 형식으로 정의합니다.
function postcompile_skin($contents, $config [, ......]) {
......
return $contents;
}
postcompile 실행시간 필터함수에 넘어오는 변수 $contents에는 컴파일된 템플릿 문서 내용이 배열형식으로 들어있습니다. 컴파일된 템플릿 문서 형식은 각 버전별로 상이하며 향후 버전에서도 상황에 따라 수시도 변경될 수 있으니 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다. 이 함수에서 리턴된 값은 바로 캐시에 저장됩니다.
preassign 실행시간 필터함수 정의하기
preassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function preassign_skin($contents, $config [, ......]) {
......
return $contents;
}
preassign 실행시간 필터함수는 아래의 예에서 볼 때 assign() 함수를 수행하는 시작부분에서 템플릿에 존재하는 변수들을 할당(assign)하기 직전에 수행합니다.
[code php;gutter:false] $tpl->assign('test','test'); [/code]
preassign 실행시간 필터함수에 넘어오는 변수 $contents에는 캐시에 저장되었던 템플릿 문서 내용이 담겨있습니다. 따라서 후키템플릿 고유의 배열형식으로 postcompile 실행시간 필터함수에서 설명한 것과 마찬가지로 사용자가 $contents의 내용을 임의로 수정해서는 안되며, 수정되지 않은 내용을 그대로 리턴값으로 넘겨주어야 합니다.
postassign 실행시간 필터함수 정의하기
postassign 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function postassign_skin($contents, $config [, ......]) {
......
return $contents;
}
postassign 실행시간 필터함수는 assign() 함수를 수행하는 마지막부분에서 템플릿을 할당(assign)한 직후에 수행합니다.
postassign 실행시간 필터함수에 넘어오는 변수 $contents에는 템플릿 문서에 포함된 모든 템플릿 변수들이 처리된 문자열 형식의 순수 HTML 스크립트 문서가 담겨있습니다. 주의할 점이 원래 템플릿 파일에 있는 내용 중에서 BODY 태그 내에 있는 내용만 전달되며 BODY 태그 밖에 있는 HEAD 태그 내의 내용 등은 없습니다. BODY 태그 밖에 있는 내용을 처리하기 위해서는 output 실행시간 필터함수를 이용하여야 합니다.
output 실행시간 필터함수 정의하기
output 실행시간 필터함수는 아래와 같은 형식으로 정의합니다.
function output_skin($contents, $config [, ......]) {
......
return $contents;
}
output 실행시간 필터함수는 php 스크립트의 실행이 종료되기 직전 출력버퍼 내용으로 부터 HTML 스크립트 문서를 생성한 직후에 실행됩니다. 따라서 $contents에는 생성된 HTML 스크립트 문서의 내용이 담겨있으며 이 함수에 의해 리턴된 값이 브라우저로 전송됩니다.
각 템플릿 문서에 허용필터명령을 지정한 경우에 output 실행시간에 처리되는 필터함수는 모든 템플릿 문서에 적용된 허용필터명령의 조건을 모두 만족해야 합니다.

Posted by 방글24
phpsource/템플릿2006. 9. 29. 09:46
written: Jan 28 2002
last modified: Oct 26 2006
템플릿변수에 관련된 용어 정리
후키템플릿에서 지원되는 템플릿변수(template variable)는 변수, 스위치문, 다이나믹 블록, 하위템플릿 인클루드입니다. 그동안 이들 변수를 호칭할 때 단순문, 블록문, 인클루드문 등 통일되지 못한 용어를 사용하여 왔습니다. 이를 정리할 필요가 있어 앞으로는 아래 표에서와 같이 단순변수, 조건변수, 블록변수, 파일변수라는 용어로 통일하여 호칭하고자 합니다.
< 템플릿변수 용어(1.2.0 버전부터) >
변경전 변경후 구문형식 예
변수,템플릿변수,단순문 단순변수 {VAR}
스위치문 조건변수 {VAR, caseA | caseB}
다이나믹 블록,블록문 블록변수 {@VAR}블록내용{/}
하위템플릿 인클루드,인클루드문 파일변수 {#./test.htm}
템플릿변수의 구문 형식
1.2.0 버전부터 템플릿변수의 구문 형식이 아래와 같이 정리되었습니다. 반복문 위치에는 여러가지 변수옵션을 지정할 수 있으며, 초기값 위치에는 필터명령을 지정할 수 있습니다.
< 변수 구문 형식 >
종 류 1.1.1 버전까지의 구문형식 1.2.0 버전부터의 구문형식
단순변수 {변수명::초기값} {변수명;변수옵션;필터명령}
{&변수명;변수옵션;필터명령}변수내용{/} *1
조건변수 {변수명::초기값,경우의수} {변수명;;초기값,경우의수}*2
{?변수명;변수옵션;필터명령,경우의수}*3
{?변수명;변수옵션;필터명령}경우의수{/}
블록변수 {@변수명}블록내용{/변수명} {@변수명;변수옵션;필터명령}블록내용{/}
파일변수 {#파일명} {#변수명;변수옵션;필터명령}파일명{/}
*1 [주의] - 2006.10.26

단순변수의 새로운 구문형식 {&변수명}{/}을 웹에디터에서 사용할 때 문제가 좀 있습니다.

"&" 문자가 HTML 에디터에서 "&nbsp;", "&lt;", "&gt;", "&amp;", "&quot;", "&#039;" 등에서 자주 사용되다보니 발생하는 문제입니다.

따라서 단순변수의 새로운 구문형식인 {&변수명}{/}을 1.2.0 패치버전(또는 다음버전)에서는 더 이상 사용하지 않겠습니다.
*2 [상위호환성 삭제] - 2008.06.06

상위버전에서는 이 형식({변수명;;초기값,경우의수})을 지원하지 않습니다.
*3 [오기수정] - 2008.06.06

{?변수명;변수옵션;필터명령,경우의수}은 허용하지 않는 구문형식입니다.
{VAR1;;100}
{&VAR1;;100}{/}
위의 2가지 단순변수들은 동일한 결과를 나타냅니다. 템플릿 변수 VAR1을 컴파일하면 단순변수 VAR1에는 "100" 값이 저장됩니다.
1.2.0 버전부터는 css 문과의 충돌을 피하기 위하여 반복문과 초기값을 구분하는 구분자를 콜론(:) 대신에 세미콜론(;)을 사용합니다.
{변수명:반복문,경우의수}과 {변수명:반복문}을 제외한 舊구문형식에서 콜론문자(:)를 사용한 구문형식은 1.2.0 버전에서도 계속 사용할 수 있으나 향후에 버전업될 버전과의 호환성을 보증할 수는 없으니 콜론문자(:) 대신에 세미콜론문자(;)를 이용하여 템플릿 문서를 작성하시기 바랍니다.
변수 옵션
변수 옵션은 1.2.0 버전부터 지정할 수 있으며 지정할 수 있는 변수 옵션으로는 repeat, ctype, allow_filter, tr가 있습니다. 자세한 것은 아래표의 각 항목을 참조바랍니다.
< 변수 옵션 >
변수 옵션 기 능 참 조
repeat 반복문 7.1.반복문
ctype 내용 형식 7.2.내용 형식
allow_filter 필터 처리 8.2.필터 명령
tr TR 용법 7.9.TR 용법
{&VAR2;repeat=1-3;="[[["."{_SELF}"."]]]"}변수내용{/}
템플릿변수 VAR2을 컴파일/할당하면 VAR2.1, VAR2.2, VAR2.3에는 모두 "[[[변수내용]]]" 값이 저장됩니다.
{?VAR;1-3;2}A|B|C{/}
{?VAR;repeat=1-3;2}A|B|C{/}
위의 2가지 조건변수들은 동일한 결과를 나타냅니다.
[code html;gutter:false] {@BLOCK;ctype=text&allow_filter=userfunc;=|userfunc()} 블록내용 {/} {#;allow_filter=func_a,func_b,=;=|func_a(); ="{_SELF}"."tail_value"; =|func_b(); }./test.htm{/}[/code]
위와 같은 표현들도 새로운 구문형식에 맞게 작성된 것으로 정상적으로 동작합니다. 그러나 템플릿 문서에서는 가능한 너무 복잡한 표현은 피하라고 권하고 싶습니다.
필터 명령
지정할 수 있는 필터 명령에는 필터 상수, php 명령, 초기화 명령, 사용자 정의 필터 함수, 내장 필터 함수가 있습니다. 자세한 것은 "8.2.필터 명령"을 참조바랍니다.
변수명 생략
모든 템플릿변수(단순문,스위치문,블록문,인클루드문)의 변수명를 생략할 수 있습니다.
변수명을 생략하면 새롭게 추가된 변수명 예약어인 "_AUTO"(예약어 _AUTO는 향후 버전에서 그 이름이 변경될 수 있으므로 사용자가 직접 사용할 수 없음)로 시작되는 변수명이 자동 지정됩니다.
{&}{/} --->> {&_AUTO}{/}
{?}a|b|c{/} --->> {?_AUTO}a|b|c{/}
{@}블록내용{/} --->> {@_AUTO}블록내용{/}
{#}파일명{/} --->> {#_AUTO}파일명{/}
블록변수의 변수명을 생략한 경우에는 블록변수에 대한 assign() 함수를 지정하지 않아도 자동 할당되어 처리됩니다. 자세한 것은 "5.3.블록변수"의 "자동 할당 기능"을 참조바랍니다.

Posted by 방글24