phpsource/템플릿2006. 9. 20. 13:45
written: Jan 28 2002
last modified: Sep 20 2006
화면 분활 실험(공유 영역 분리)
앞장 "템플릿 사용에 따른 이점"에서도 잠시 언급하였듯이 웹사이트 전체에 걸쳐 공통적으로 쓰이는 부분(상단메뉴, 하단 저작권 표시, 좌측 메뉴 등)을 별도의 템플릿으로 분리하게 되면 여러 페이지에서 이러한 부분을 공유하여 이용할 수 있습니다. 이와같이 공유하는 구역에 대한 것은 템플릿을 이용하여 공유하게 되면 웹사이트 전체의 코드양을 상당수 줄일 수 있을 것입니다. 이러한 예를 들어보지요.
< 공유영역을 가지고 있는 웹페이지 구성 >
템플릿 파일 작성
위와 같은 페이지를 구성하기 위해 상단부분(top.htm), 하단부분(bottom.htm), 좌측메뉴(left.htm), 본문 부분(center.htm) 및 이 모든 부분을 묶어주는 부분(all.htm)에 해당하는 템플릿을 보면 아래와 같습니다.
레이아웃용 템플릿 파일 all.htm
[code html;gutter:false] <!-- all.htm --> <HTML> <HEAD> <TITLE>{TITLE}</TITLE> </HEAD> <BODY topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> <CENTER> <TABLE width=460 border="0" cellpadding="0" cellspacing="0"> <TR bgcolor=white align="center"> <TD valign=bottom> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=bottom bgcolor=#999999> {TOP} </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top> <TABLE cellpadding=0 cellspacing=0 border="0" width=460> <TR> <TD align=right valign=top width=20% bgcolor=#dddddd> {LEFT} </TD> <TD align="center" valign=top width=80% bgcolor=yellow> {CENTER} </TD> </TR> </TABLE> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top bgcolor=#999999> {BOTTOM} </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> [/code]
화면 상단 부분 템플릿 파일 top.htm
[code html;gutter:false] <!-- top.htm --> <!-- Begin Table top --> <B>핍클래스홈(phpCLASS HOME)</B> <!-- End Table top --> [/code]
화면 하단 부분 템플릿 파일 bottom.htm
[code html;gutter:false] <!-- bottom.htm --> <!-- Begin Table bottom --> Web Master : Wookyung Hwang(hwooky) <!-- End Table bottom --> [/code]
화면 좌측 메뉴 템플릿 파일 left.htm
[code html;gutter:false] <!-- left.htm --> <!-- Begin Table left --> <A href=''>메뉴#1</A> <A href=''>메뉴#2</A> <A href=''>메뉴#3</A> <A href=''>메뉴#4</A> <A href=''>메뉴#5</A> <!-- End Table left --> [/code]
화면 중앙 본문 템플릿 파일 center.htm
[code html;gutter:false] <!-- center.htm --> <!-- Begin Table center --> {CONTENTS} <!-- End Table center --> [/code]
PHP 코드 작성 section.php
5개로 구성된 템플릿을 하나의 페이지로 구성하기 위한 PHP 소스는 아래와 같습니다.
[code php;gutter:false] <? /** * section.php */ include_once('./class/template/class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'all' => 'all.htm', 'top' => 'top.htm', 'left' => 'left.htm', 'center' => 'center.htm', 'bottom' => 'bottom.htm' ) ); $tpl->assign(array( 'TITLE' => '화면 분활 실험', 'CONTENTS' => '서비스 내용', )); $tpl->assign('TOP', 'top'); $tpl->assign('LEFT', 'left'); $tpl->assign('CENTER', 'center'); $tpl->assign('BOTTOM', 'bottom'); $tpl->assign('ALL', 'all'); $tpl->output('ALL'); ?> [/code]
생성된 HTML 문서
PHP 코드(section.php)에 의해 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <HEAD> <TITLE>화면 분활 실험</TITLE> </HEAD> <BODY topmargin=0 leftmargin=0 marginwidth=0 marginheight=0> <CENTER> <TABLE width=460 border="0" cellpadding="0" cellspacing="0"> <TR bgcolor=white align="center"> <TD valign=bottom> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=bottom bgcolor=#999999> <!-- top.html --> <!-- Begin Table top --> <B>핍클래스홈(phpCLASS HOME)</B> <!-- End Table top --> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top> <TABLE cellpadding=0 cellspacing=0 border="0" width=460> <TR> <TD align=left valign=top width=20% bgcolor=#dddddd> <!-- left.html --> <!-- Begin Table left --> <A href=''>핍클래스 커뮤니티?</A> <A href=''>클래스 사용법</A> <A href=''>클래스 객체 함수</A> <A href=''>객체에 관련된 정보</A> <A href=''>객체지향언어로서의 PHP</A> <A href=''>추상클래스</A> <A href=''>참조(레퍼런스)</A> <!-- End Table left --> </TD> <TD align="center" valign=top width=80% bgcolor=yellow> <!-- center.html --> <!-- Begin Table center --> 서비스 내용 <!-- End Table center --> </TD> </TR> </TABLE> </TD> </TR> <TR bgcolor=white align="center"> <TD valign=top bgcolor=#999999> <!-- bottom.html --> <!-- Begin Table bottom --> Web Master : Wookyung Hwang(hwooky) <!-- End Table bottom --> </TD> </TR> </TABLE> </CENTER> </BODY> </HTML> [/code]
화면 중앙 본문 내용만 변경하기 위한 PHP 소스
만약 5개의 템플릿 top.htm, bottom.htm, left.htm, center.htm, all.htm 중에서 center.htm 템플릿 대신에 다른 템플릿(예를 들어 center2.htm)을 사용하여 페이지 내용을 바꾸려면 아래와 같이 define() 함수 부분만 변경하면 됩니다.
[code php;gutter:false] $tpl->define( array( 'all' => 'all.htm', 'top' => 'top.htm', 'left' => 'left.htm', 'center' => 'center2.htm', 'bottom' => 'bottom.htm' ) ); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:43
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 파일 작성 main.htm
작성된 템플릿 main.htm에는 {TITLE}라는 변수가 포함되어 있으며 이 변수는 출력하기 전에 실제 값으로 대치됩니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <HEAD><TITLE>{TITLE} </TITLE> </HEAD> <BODY> </BODY> </HTML> <!-- END: main.htm --> [/code]
PHP 코드 작성 test.php
main.htm이라는 템플릿 파일을 이용하여 HTML의 원형을 작성하기 위한 PHP 코드는 아래와 같습니다.
[code php;gutter:false] <?php include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'main' => 'main.htm' ) ); $tpl->assign('TITLE', '후키템플릿 실험'); $tpl->assign('MAIN', 'main'); $tpl->output('MAIN'); ?> [/code]
class.hTemplate.php에는 클래스 hTemplate가 정의되어 있습니다. 이 파일을 포함시켜야 5번 행과 같이 $tpl이라는 객체를 생성할 수 있습니다. 객체 생성할 때 지정된 "./templates"에 의해 모든 템플릿들이 이 디렉토리에 있다는 것을 후키템플릿에 알려줍니다. 객체를 생성할 때 템플릿 디렉토리를 지정하지 않으면 현행 디렉토리에서 템플릿을 찾게 됩니다.
5번 행의 define() 함수를 실행하게 되면 템플릿 파일 main.htm의 내용은 템플릿 main에 저장되며 이 후로는 템플릿명 main을 통해 템플릿에 접근할 수 있습니다. 이 예제에서는 12번 행의 assign() 함수의 두 번째 인수에 템플릿 main을 지정하여 이 템플릿을 분석하도록 하고 있습니다.
11번 행의 assign() 함수를 통해 TITLE라는 템플릿 변수에 "후키템플릿 실험"라는 문자열을 할당합니다. 이와 같이 템플릿에 포함된 템플릿 변수에 대하여 미리 그 값을 할당하여야 12행과 같이 템플릿 main에 대하여 assign() 함수를 실행할 때 템플릿 main에 포함된 템플릿 변수를 앞서 할당된 그 변수값으로 대치할 수가 있습니다.
13번 행에 의해 output() 함수에서 지정된 템플릿 변수 MAIN의 내용이 출력됩니다.
12번 행에서와 같이 assign() 함수에서 지정한 MAIN이라는 템플릿 변수에는 이 함수에 의해 템플릿을 해석한 결과값이 마지막으로 저장되기 때문에 뒤에서 필요하다면 다른 템플릿을 해석할 때 또 다른 템플릿 변수로써 활용될 수 있습니다.
생성된 HTML 문서
test.php 코드에 의해 main.htm로 부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <!-- NAME: main.htm --> <HTML> <HEAD><TITLE> 후키템플릿 실험 </TITLE> </HEAD> <BODY> </BODY> </HTML> <!-- END: main.htm --> [/code]
생성된 HTML 코드를 보면 템플릿 변수 {TITLE}가 "후키템플릿 실험"라는 문자열로 대치되어 있는 것을 볼 수 있습니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 13:43
written: Jan 28 2002
last modified: Sep 20 2006
클래스의 구성
후키템플릿 1.2.0 버전에서 사용하는 클래스는 모두 17가지 입니다. 한페이지 분량도 안되는 클래스들은 관계되는 클래스의 파일에 포함시켜도 되지만 캡슐화에 중점을 두고 작성하다보니 파일 구성이 방만(?)해 졌습니다.
템플릿 관련 클래스 구성
No. 패키지 클래스 종류 클래스가 정의된 파일명 적용버전
1 Template hTemplate class.hTemplate.php 1.0.0
2 " hTemplateAssign class.hTemplateAssign.php 1.0.0
3 " hTemplateStructure class.hTemplateStructure.php 1.0.0
4 " hTemplateCompile class.hTemplateCompile.php 1.0.0
5 " hTemplateFile class.hTemplateFile.php 1.1.0
- - hFastTemplate class.hFastTemplate.php 1.1.1 삭제
6 " hTemplateDebug class.hTemplateDebug.php 1.0.0
7 " hTemplateCache class.hTemplateCache.php 1.2.0
8 " hTemplateFunction class.hTemplateFunction.php 1.2.0
9 " hTemplateFilter class.hTemplateFilter.php 1.2.0
10 HTML hHtmlParser class.hHtmlParser.php 1.0.0
11 " hHtmlClassify class.hHtmlClassify.php 1.0.0
- - hHtmlUrlRedirection class.hHtmlUrlRedirection.php 1.1.1 삭제
12 " hHtmlUrlParser class.hHtmlUrlParser.php 1.1.1
13 cache hCacheFile class.hCacheFile.php 1.0.0
14 structure hStack class.hStack.php 1.0.0
15 class hClassMember class.hClassMember.php 1.0.0
16 globals hGlobals class.hGlobals.php 1.1.0
17 patterns hSingleton class.hSingleton.php 1.1.0
클래스의 동작
웹서비스할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php
캐시를 갱신할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php

class.hStack.php
class.hHtmlParser.php
class.hHtmlClassify.php
class.hHtmlUrlParser.php
class.hTemplateCompile.php
템플릿 파일 또는 PHP 소스가 수정되었으면 캐시를 갱신하여야 합니다. 템플릿 파일이 수정되었을 때는 후키템플릿이 자동으로 캐시를 갱신해 줍니다. 그러나 후키템플릿에서 제공하는 클래스 파일과 같은 php 소스가 변경되었을 때는 캐시를 자동으로 갱신해 주지 못하기 때문에 기존의 캐시를 강제적으로 지워주든지 아니면 객체 생성할 때 두 번째 인수인 캐시 정보의 속성 "update"의 값을 true로 설정해 주셔야 합니다
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'update' => true ) ); [/code]
1.2.0 버전부터는 후키템플릿툴에 포함된 17개의 클래스 파일이 수정되었을 때도 자동으로 캐시를 갱신해 줍니다.
템플릿 정보를 디버깅할 때 필요한 클래스 파일
class.hCacheFile.php
class.hClassMember.php
class.hTemplate.php
class.hTemplateStructure.php
class.hTemplateAssign.php
class.hTemplateFile.php
class.hTemplateCache.php
class.hTemplateFunction.php
class.hTemplateFilter.php
class.hGlobals.php
class.hSingleton.php

class.hStack.php
class.hHtmlParser.php
class.hHtmlClassify.php
class.hHtmlUrlParser.php
class.hTemplateCompile.php

class.hTemplateDebug.php
각 클래스의 기능
hTemplate 클래스
후키템플릿을 전체적으로 관리하는 클래스이며, 모든 public 메소드를 가지고 있습니다.
< 후키템플릿에서의 각 클래스의 역할 >
클래스와 클래스를 실선으로 연결된 것은 클래스 내부에서 객체 생성한 후 객체를 이용하여 접근한다는 의미이며 점선으로 연결된 것은 상속관계에 있음을 나타냅니다.
템플릿 형식 및 변수형식
Flow No template type variable type
file or no-file string
template infomation array
template variable string
 hTemplate 클래스는 상황에 따라 아래와 같이 필요한 클래스를 불러다가 처리합니다.
TML 문서가 변경된 후 처음 접속할 때의 동작 수순

  ① -> ② -> ③ -> ④ -> ⑤ -> ⑥ -> ⑦
이와 같이 템플릿 파일이 변경된 후 처음 후키템플릿을 실행하게 되면 모든 클래스를 불러다가 전 과정을 다 밟게 됩니다.
따라서 이 과정에서는 class.hTemplateCompile.php 파일과 HTML 패키지(hHtmlParser, hHtmlClassify, hHtmlUrlParser 클래스)도 필요하게 됩니다.
이 과정은 단 한번만 거치게 되며 그 다음부터는 아래와 같은 동작 수순을 밟게 됩니다.
HTML 문서가 변경된 후 두 번째 이후 접속할 때의 동작 수순

  ④ -> ⑤ -> ⑥ -> ⑦
< 후키템플릿에서의 각 클래스의 역할 >
템플릿 파일이 변경된 후 두 번째 이후 접속할 때는 ④부터 실행되기 때문에 HTML 패키지와 hTemplateCompile 클래스는 필요없으며 hTemplateCache 클래스, hCacheFile 클래스, hTemplateAssign, hTemplateStructure 클래스만 불러다가 실행하게 됩니다.
hTemplateAssign 클래스
템플릿 변수를 관리해주는 클래스로 템플릿 변수의 초기화, 추가, 수정, 삭제 및 출력 등을 담당합니다.
hTemplateStructure 클래스
템플릿 정보 및 템플릿 변수 정보는 모두 hTemplateStructure 클래스 내에 정적 멤버로 정의되어 있는 템플릿 정보 리스트 및 템플릿 변수 리스트에 기록되어 있습니다. 이 클래스는 인스턴스를 생성하지 않고 정적 멤버로만 사용됩니다.
hTemplateCache 클래스
1.2.0 버전부터 제공되는 클래스로 템플릿 캐시 관련 기능을 통합하여 수행합니다. hCacheFile 클래스는 필요에 따라 hTemplateCache 클래스 내에서 호출합니다.
hCacheFile 클래스
파일시스템용 캐시핸들러입니다. 후키 템플릿과는 독립적으로 동작하는 클래스로 캐시가 필요한 곳이면 어느 곳에서나 이용할 수 있도록 작성되어 있습니다.
hTemplateCompile 클래스
템플릿 파일을 템플릿으로 변환시켜주며 이 과정에서 HTML 패키지를 불러다가 URL 자동 변경과 같은 여러 가지 처리를 하게 됩니다.
HTML 패키지
HTML 패키지는 hHtmlParser, hHtmlClassify, hHtmlUrlParser 클래스로 구성되어 있습니다. HTML 패키지 중에 hHtmlParser 클래스는 후키템플릿과는 독립적으로 작성되어 이미 공개된 HTML 파서입니다.
hFastTemplate
기존에 사용하고 있던 FastTemplate 문서(php 소스 및 템플릿 파일)을 수정없이 사용하기 위해 작성된 클래스입니다. 1.1.1 버전부터 삭제되었습니다.
hTemplateDebug
개발 과정에서 현재까지 할당된 템플릿 변수의 상태를 실시간으로 확인할 수 있는 디버깅 기능과 컴파일된 템플릿 파일 정보를 실시간으로 확인할 수 있는 디버깅 기능을 위해 작성된 클래스입니다.
이 클래스 파일을 보면 알겠지만 기능 구현만을 신경쓰다보니 소스 코드가 전혀 정리되어 있지 않습니다. 향후 기능을 보완해 가면서 하나 하나 정리되어야 할 것 같습니다.
hTemplateFile
템플릿 파일 관리 클래스로 파일 변경여부, 기본 디렉토리 관리 등 템플릿 파일 관련 파일시스템을 다루기 위해 작성된 클래스입니다.
hClassMember
PHP에서 제공되지 않는 멤버 특성을 지원하기 위하여 작성된 클래스로 현재는 젠드엔진 1.0에서 소멸자를 흉내내기 위하여 작성되어 있습니다. 따라서 소멸자를 정식으로 지원하고 있는 젠드엔진 2.0에서는 불필요한 클래스입니다.
hStack
HTML 패키지 중에서 hHtmlParser 내에서 사용되는 클래스로 LIFO(Last In First Out) 자료구조인 스택(stack)을 구현하여주는 클래스입니다.
hGlobals
수퍼글로벌변수를 이용하여 절대경로를 상대경로로 수정하는 등과 같이 전역변수에 관계된 기능을 처리하는 클래스입니다.
hSingleton
디자인 패턴 중에서 Singleton 패턴을 처리하기 위해 작성된 클래스입니다.

Posted by 방글24