phpsource/템플릿2006. 9. 20. 21:46
written: Jan 28 2002
last modified: Sep 20 2006
4가지 자료구조
후키템플릿에서 사용하는 템플릿에 관련된 자료구조는 4가지 형태입니다.
  1. 템플릿 문서(파일 또는 NO파일)
  2. 템플릿 구조
  3. 템플릿 변수
  4. HTML 문서
< 자료구조 >
< 템플릿 관련 자료구조 >
자료 구조 저장 위치
템플릿 문서 파일은 서버 디스크, NO파일은 php 문서에서 문자열로 지정
템플릿 구조 서버 메모리
템플릿 변수 서버 메모리
HTML 문서 서버 메모리, 인터넷망, 웹브라우저
템플릿 문서(template document)
템플릿 문서는 일반적인 HTML 문서와 동일합니다. 차이점은 그 안에 템플릿 변수가 들어있다는 것뿐입니다. 템플릿 문서는 대부분 파일 형태로 제공됩니다. 이러한 템플릿 파일은 나모 웹에디터 또는 드림위버와 같은 HTML 제작툴을 이용하면 멋진 문서를 아주 쉽고도 빠르게 작성할 수 있습니다.
1.0.0 버전부터는 템플릿이 파일이 아니라 DB 등에 저장되어 문자열 형태로 제공될 수 있으며 이러한 템플릿 형식을 NO파일이라 합니다.
템플릿 구조(template structure)
define() 함수를 이용하여 템플릿 문서를 메모리상에 올려놓을 수 있습니다. 템플릿 문서 구조와는 자료 구조 형태가 다소 다릅니다. 템플릿 문서에는 HMTL과 템플릿 변수가 뒤썩여있지만 메모리에 올려진 템플릿 구조를 보면 HTML 문서와 템플릿 변수가 질서정연하게 분류되어 저장되어 있습니다. 아울러 파일에 관한 정보(파일명, 파일이 최종 수정된 시간, 내포된 블록에 대한 정보 등)가 잘 정돈되어 있습니다.
< 템플릿 구조의 구성 >
< 템플릿 저장 장소 >
구분 FastTemplate 후키템플릿
사용 함수 define(
 array(
   "템플릿명"=>"템플릿 파일명"
 )
)
parse("템플릿 변수명", "템플릿명")
define("템플릿명", "템플릿파일명")

또는

define("템플릿명", "템플릿문자열")
템플릿 저장위치 parse 함수 실행시 $this->템플릿명에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨. $this->템플릿 구조[템플릿명]에 템플릿 문서로부터 읽어들인 템플릿을 컴파일하여 템플릿환경, HTML문서와 템플릿변수가 분리되어 저장됨.
후키템플릿에서 사용하는 템플릿 구조의 자료구조는 잘 정리되어 있습니다. 템플릿 구조의 자료구조를 살펴보기 위해 아래와 같은 템플릿 예를 들어보겠습니다. define() 함수에 의해 구조분석이 끝나게 되면 생성된 객체의 템플릿 구조에는 아래와 같이 템플릿 내용이 저장됩니다. 아래 내용은 print_r() 함수로 표시한 예입니다.
 Array
(
[table] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => FILE
[filename] => table.htm
[filemtime] => 1011593178
[parent] =>
[child] => Array
(
[0] => row_block
)
)
)

[row_block] => Array
(
[body_contents] => Array
(
[0] => HTML 문자
[1] => 템플릿 변수명
[2] => HTML 문자
.
.
.
)

[tpl_info] => Array
(
[type] => BLOCK
[parent] => table
[child] => Array
(
)
)
)

[*var_in_tpl] => Array
(
[row_block] =>
)
)
각 템플릿에 대한 일반적인 정보
위 자료구조의 내용을 개략적으로 살펴보면 "table", "row_block"은 템플릿명을 가리킨다. 이중에 "table"은 템플릿 파일인 table.htm로 부터 읽어들인 데이터를 분석한 템플릿 정보를 저장하였음을 나타내고 있고, "row_block"은 table.htm 내에 존재하는 블록변수(다이나믹블록)에 대한 템플릿 정보를 저장하고 있음을 나타내고 있습니다. 이러한 템플릿 환경에 대한 일반적인 정보는 "tpl_info"에 기록되어 있습니다. 블록변수(다이나믹블록)로부터 추출된 템플릿의 이름은 블록명과 동일합니다.
FastTemplate와는 다르게 후키템플릿에서는 블록변수(다이나믹블록)가 별도의 템플릿으로 기록되어 있습니다. 이것은 마치 FastTemplate에서 블록을 별도의 파일로 처리했을 때에 볼 수 있는 현상입니다. 결국 후키템플릿에서는 HTML 블록이 별도의 파일로 처리되나 아니면 블록변수(다이나믹블록)로 처리되나 템플릿 구조에 기록되는 결과는 거의 같습니다.
차이점이 있다면 템플릿을 별도의 파일로 구성하면 템플릿명을 임의로 지정할 수 있으나 블록변수(다이나믹블록)로 구성하면 템플릿명을 지정할 수 없으며 블록명이 곧 템플릿명이 된다는 것입니다.
후키템플릿에서는 define_dynamic 함수가 필요없다고 하였는데 그것은 템플릿 구조의 자료구조에서 보듯이 각 템플릿의 [템플릿명][tpl_info][child]를 보면 알 수 있기 때문입니다. 해당 템플릿에 포함된 블록이 이곳에 모두 기록되지요. 단, 모든 하위 블록이 모두 기록되는 것은 아니고 바로 밑에 있는 하위 블록만 기록됩니다.
각 템플릿은 양방향의 linked-list 자료구조로 설계되어 있기 때문에 만약 템플릿(또는 블록)에 포함된(중첩된) 하위 블록의 리스트를 알고 싶으면 템플릿 구조에서 [템플릿명(또는 블록명)][tpl_info][child]을 보면 그 하위 블록의 리스트를 연속적으로 얻을 수 있습니다.
각 템플릿 내용 분석
이제는 템플릿의 내용이 어떻게 기록되어 있는지 살펴보겠습니다. 템플릿 구조의 자료구조에서 각 템플릿에는 일반적인 정보를 나타내는 "tpl_info" 외에 템플릿의 실제 내용이 저장되는 "body_contents"가 있습니다. "body_contents"에는 바로 템플릿 내용을 템플릿 변수와 순수 HTML 소스로 분리하여 저장하는 곳입니다. 이를 원래 템플릿 내용으로 복원하려면 아래와 같이 하면 됩니다.
원래 템플릿 내용 =
body_contents[0] + {body_contents[1]} +
body_contents[2] + {body_contents[3]} +
body_contents[4] + {body_contents[5]} +
....... + ....... +
body_contents[마지막 첨자]
각 템플릿에 존재하는 템플릿 변수
마지막으로 설명 안된 부분이 "*var_in_tpl"입니다. 이것은 define() 함수를 실행하는 중에 발생한, 즉 템플릿 구조분석을 하는 중에 발생한 템플릿 변수를 기록하는 곳으로 각 템플릿 파일에 선언된 템플릿 변수와 블록변수(다이나믹블록)명에 해당하는 템플릿변수가 이곳에 기록됩니다.
템플릿 table에 포함된 블록변수(다이나믹블록)에 해당하는 템플릿 변수 {row_block}의 초기값(null로 지정되어 있음)을 지정하는 곳이 바로 "*var_in_tpl"입니다. 여기에 기록된 템플릿 변수값들은 임시로 기록되어 있는 값이며 define() 함수가 종료될 때 "*var_in_tpl"의 내용이 템플릿 변수 영역에 일괄 할당됩니다.
템플릿 변수(template variable)
assign() 함수에 의해 각 템플릿 변수에 대한 변수값이 지정됩니다. 변수값으로는 문자열을 직접 할당할 수도 있고, 템플릿(또는 블록)의 내용을 할당할 수도 있습니다. 템플릿(또는 블록)의 내용을 할당할 때는 할당하기 전에 템플릿 내에 있는 또 다른 변수부터 미리 지정된 값으로 대치하게 됩니다.
결국 템플릿 변수에 할당된 값에는 또 다른 변수가 포함될 수 없습니다. 템플릿 변수에 있는 값들은 output() 함수에 의해 바로 브라우저로 전송할 수 있는 상태로 존재하고 있습니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); $tpl->assign( array( 'YEAR' => '2001', 'MONTH' => '12' ) ); $tpl->assign('MAIN', 'cal'); [/code]
예를 들어 템플릿 파일 "calendar.htm"에 "{YEAR}년 {MONTH}월"라는 내용이 들어있을 때, 위와 같이 PHP 코드를 수행한다면 템플릿 변수에는 아래와 같이 총 3개의 변수값이 존재합니다.
템플릿 변수["YEAR"] = "2001"
템플릿 변수["MONTH"] = "12"
템플릿 변수["MAIN"] = "2001년 12월"
구분 FastTemplate 후키템플릿
사용 함수 assign("템플릿 변수명1", "문자열") parse("템플릿 변수명2", "템플릿명") assign("템플릿 변수명1", "문자열") assign("템플릿 변수명2", "템플릿명")
템플릿 저장위치 $this->PARSEVARS[템플릿 변수명]에 assign() 함수로 지정된 문자열과 parse 함수에 의해 템플릿을 해석한 결과값이 저장됨. parse 함수를 수행하게 되면 동시에 $this->템플릿 변수명에도 템플릿을 해석한 결과값이 저장됨 $this->템플릿 변수[템플릿 변수명1]에는 assign() 함수로 지정된 문자열이 저장되며 $this->템플릿 변수[템플릿 변수명2]에는 템플릿의 내용(템플릿 내의 또 다른 변수가 처리된 후)이 저장됨
HTML 문서(페이지 문서)
템플릿 변수에는 항상 순수 HTML 코드만 들어 있으며 여기에는 어떠한 템플릿 변수도 포함되어 있지 않습니다. output 함수(1.2.0 이전 버전에서는 FastPrint() 함수)에 의해 웹브라우저로 보내지게 되는 템플릿 변수 내용이 바로 웹페이지를 구성하는 HTML 문서가 됩니다.
템플릿명 및 변수명을 정할 때 규칙
FastTemplate에서의 규칙
FastTemplate에서는 파싱결과를 템플릿 변수명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 또한 템플릿 파일로 부터 읽어들이는 템플릿도 템플릿명을 기반으로 하는 단순변수 형태의 멤버변수에 직접 기록합니다. 이러한 이유로 해서 클래스 내부에서 정의하여 사용되고 있는 멤버변수와 충돌이 일어날 가능성이 있지요.
FastTemplate에서 클래스 내부에서 정의하여 사용하고 있는 멤버변수로는 $FILELIST, $DYNAMIC, $PARSEVARS, $LOADED, $HANDLE, $ROOT, $WIN32, $ERROR, $LAST, $STRICT 등이 있습니다. 이와 같이 내부에서 정의하여 사용하고 있는 멤버변수와 동일하게 템플릿명 또는 템플릿 변수명으로 사용한다면 충돌이 일어나 프로그램이 정상적으로 동작하지 않게 될 것입니다.
템플릿명과 템플릿 변수명를 기반으로 단순변수 형태의 멤버변수를 정의하여 사용하기 때문에 템플릿명과 템플릿 변수명은 반드시 일반 PHP 변수명을 정할 때 지켜야 할 규칙을 따라야 합니다. 즉, 영문자, 숫자 및 밑줄 만을 이용하여야 별 문제가 생기지 않을 것입니다.
후키템플릿에서의 규칙
후키템플릿에서는 템플릿 또는 템플릿 변수를 별도의 멤버로 구분하여 저장하도록 되어 있습니다.
사용 함수 저장 위치
define("템플릿명", "템플릿 파일명") $this->템플릿 구조[템플릿명]에 템플릿 파일로 부터 읽어들인 템플릿이 저장됨
assign("변수명", "문자열") $this->템플릿 변수[변수명]에 "문자열"이 저장됨
assign("변수명", "템플릿명") $this->템플릿 변수[변수명]에 템플릿 내에 있는 또 다른 변수가 모두 처리된 후 그 결과값이 저장됨
위와 같이 후키템플릿에서는 템플릿명과 템플릿 변수명을 서로 다른 배열 변수(템플릿 구조 및 템플릿 변수)에 배열 첨자를 기반으로 기록하기 때문에 충돌가능성을 원천적으로 방지하고 있습니다. 따라서 템플릿명 또는 템플릿 변수명을 지을 때 알파벳, 숫자, 밑줄만으로 구성되어져 있다면 어떤 이름을 사용하더라도 상관없습니다. 사실 FastTemplate와는 다르게 템플릿명과 템플릿 변수명이 배열 첨자로 사용되기 때문에 #, (, ), ? 등과 같은 특수문자를 이름으로 사용할 수도 있겠으나 향후 상위 버전과의 호환성을 염두에 둔다는 의미에서 이를 지원하지 않겠습니다.
따라서 후키템플릿에서는 일반적인 언어에서와 같이 변수명을 영문자, 숫자, 밑줄 및 하이픈으로 제한하며 첫문자는 반드시 영문자이어야 합니다. 영문자는 대소문자를 구별합니다. 이러한 규칙을 지킨다면 어떠한 이름을 사용하여도 관계없습니다. 단 한가지 예외사항으로 "GLOBALS"를 변수명으로 사용하지 말기 바랍니다. 이것조차 지원하려고 하였으나 PHP 전역변수 처리와 관련하여 충돌되는 부분이 있어 어쩔 수 없이 예외로 처리하게 되었습니다.
그리고 클래스 내부에서 이미 "*var_in_tpl"를 템플릿 구조의 배열 첨자로 사용하고 있습니다. 이러한 특수문자들은 향후에도 클래스 내부에서 어떠한 형태로든지 사용될 수 있으므로 템플릿명과 템플릿 변수명을 정할 때는 이러한 특수문자들을 사용하지 말기 바랍니다.
템플릿 변수명을 정할 때 또 하나 주의할 것이 있습니다. 템플릿 내에 블록이 존재하는 경우 이 블록의 이름(블록명)은 클래스 내부에서 임의대로 템플릿명과 템플릿 변수명으로도 사용되므로 블록명에 해당하는 템플릿명과 템플릿 변수명은 사용하지 말기 바랍니다.

Posted by 방글24