phpsource/템플릿2006. 9. 20. 11:33
written: Jan 28 2002
last modified: Sep 20 2006
앞장의 "사용방법"의 "화면 분활 실험(공유 영역 분리)" 항목에서 살펴본 바와 같이 한 화면을 공통적으로 쓰이는 부분(상단메뉴, 하단 저작권 표시, 좌측 메뉴 등)을 별도의 템플릿으로 분리하게 되면 여러 페이지에서 이러한 부분을 공유하여 이용할 수 있습니다. 이와같이 작성하게 되면 한 화면이 몇 개의 템플릿 파일로 나누어지게 됩니다.
이런 경우에 각 템플릿 파일별로 서로 독립적으로 나모 웹에디터를 이용하여 문서를 완성하다보면 각 템플릿 파일에서의 <HEAD>~</HEAD>의 내용 및 <BODY> 태그 속성 내용이 중복되거나 서로 상이하게 사용될 수 있습니다. 이러한 상태에서 템플릿툴을 이용하여 하나의 화면으로 합치게 되면 <HEAD>~</HEAD>의 내용 및 <BODY> 태그 내용이 뒤죽박죽 될 것입니다. 이러한 문제를 하나씩 해결해 나가 보지요.
1.0.0 이전 버전에서는 다중 템플릿 파일에 존재하는 공통 부분(<HEAD> ~ </HEAD> 및 <BODY attrib>)의 처리를 처음 FastPrint() 함수 수행할 때 처리함으로써 일단 FastPrint()를 실행한 이후의 템플릿 파일에 있는 공통 부분의 출력이 불가능하였습니다.
1.0.0 버전에서는 클래스 hTemplate의 생성자에서 설정한 '사용자 정의 출력버퍼 콜백함수'를 수행할 때 단 한번만 출력하도록 하였습니다. 사용자 정의 출력버퍼 콜백함수는 모든 스크립트가 종료된 후에 동작하도록 하였기 때문에 FastPrint() 함수를 실행한 후에도 define() 함수가 정상적으로 동작하게됩니다. 따라서 웹문서 어디에서 define() 함수를 사용하던지 관계없이 다중 템플릿 파일에 존재하는 모든 공통 부분(<HEAD> ~ </HEAD> 및 <BODY attrib>)의 처리가 정상적으로 출력합니다.
1.2.0 버전에서는 FastPrint() 함수대신에 output() 함수를 사용합니다.
<HEAD>~</HEAD> 내에 있는 자바 스크립트 처리 문제
템플릿 파일마다 서로 다른 자바 스크립트 함수가 존재할 때
예를 들어 하나의 페이지를 구성하는 템플릿 파일이 아래와 같이 a.htm과 b.html으로 나누었을 때를 생각해 보겠습니다. 각각에 템플릿 파일에는 해당 파일에서만 사용되는 자바 스크립트가 별도로 작성되어 있습니다.
[code html;gutter:false] <!-- a.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } //--> </SCRIPT> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } //--> </SCRIPT> </HEAD> [/code]
[code php;gutter:false] <?php /** * test.php */ include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'a' => 'a.htm', 'b' => 'b.htm' ) ); $tpl->assign( ... ); $tpl->assign( ... ); $tpl->output( ... ); ?> [/code]
test.php 코드에 의해 두 개의 템플릿 파일로부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } //--> </SCRIPT> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } //--> </SCRIPT> </HEAD> [/code]
생성된 HTML 문서를 보면 a.htm과 b.htm 각각의 헤더 태그에 있던 자바 스크립트 함수가 모두 포함되어 있는 것을 볼 수 있습니다.
2개 이상의 템플릿 파일에 동일한 자바 스크립트 함수가 중복되었을 때
자바 스크립트 함수가 중복되지 않는다면 별문제가 없을 것입니다. 그러나 때에 따라서는 템플릿 파일 사이에 중복되는 자바 스크립트 함수가 존재할 수 있습니다.
아래와 같은 예를 보면 템플릿 파일 a.htm과 b.htm의 헤더 태그를 보면 양쪽 모두에 func_Z() 함수가 중복되어 있는 것을 볼 수 있습니다.
[code html;gutter:false] <!-- a.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } function func_Z() { ... } //--> </SCRIPT> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } function func_Z() { ... } //--> </SCRIPT> </HEAD> [/code]
두 개의 템플릿 파일로부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } function func_Z() { ... } //--> </SCRIPT> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } function func_Z() { ... } //--> </SCRIPT> </HEAD> [/code]
생성된 HTML 문서를 보면 자바 스크립트 함수 func_Z()가 중복되어 정의되어 있는 것을 볼 수 있습니다. 자바 스크립트 함수의 경우에는 이와 같이 한 페이지에 동일한 함수가 중복 정의되더라도 실행에는 문제가 발생하지 않습니다.
그러나 함수의 크기가 작다면 별문제가 없겠지만 함수 덩치가 크다면 불필요한 시간 낭비가 될 것입니다. 이와 같이 여러 개의 템플릿 파일에서 중복되어 나타나는 자바 스크립트 함수를 단 하나만 생성하기 위해서는 아래와 같이 중복되는 함수를 별도로 스크립트 태그로 구성한 후 속성명 "tpl"의 값을 "TMP"로 지정하여 놓기 바랍니다.
[code html;gutter:false] <!-- a.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } function func_Z() { ... } //--> </SCRIPT> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } //--> </SCRIPT> <SCRIPT language="javascript" tpl="TMP"> <!-- function func_Z() { ... } //--> </SCRIPT> </HEAD> [/code]
두 개의 템플릿 파일로부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HTML> <HEAD> <SCRIPT language="javascript"> <!-- function func_A() { ... } function func_B() { ... } function func_C() { ... } function func_Z() { ... } //--> </SCRIPT> <SCRIPT language="javascript"> <!-- function func_D() { ... } function func_E() { ... } function func_F() { ... } //--> </SCRIPT> </HEAD> [/code]
이와 같이 속성 "tpl"의 값에 "TMP"가 설정되어 있으면 후키템플릿에서 템플릿 파일을 분석할 때 템플릿에 포함시키지 않고 삭제해 버립니다. 따라서 복수의 템플릿 파일에서 중복되는 자바 스크립트 함수가 있을 때 이용할 수 있습니다.
앞장 "템플릿의 URL 자동 변경"장에서 살펴본 "URL" 속성값이 자바 스크립트 태그에서만 사용되는데 반하여 "TMP" 값은 헤더 태그 내에 존재하는 모든 태그에서 사용할 수 있습니다.
< tpl, name 속성 지정 >
버전 속성명 속성값 향후 호환성 기능 사용 가능한 태그
0.0.1 name URL4TPL 호환성 없음 URL 자동 변경 <SCRIPT>
0.0.2 name URL4TPL 호환성 없음 " <SCRIPT>
tpl URL 호환성 있음 " <SCRIPT>
tpl TMP 호환성 있음 중복 방지 <SCRIPT>,<META>,<LINK> <STYLE>,<TITLE>
"사용 가능한 태그"는 모두 <HEAD>~</HEAD> 내에 있는 태그만 해당하며 <HEAD> 태그를 벗어난 곳에 있는 태그는 적용하지 않습니다.
만약 "URL", "TMP" 값 모두를 설정하려면 아래와 같이 콤마로 구분하여 속성값을 지정하면 되며 그 순서는 관계없습니다.
[code html;gutter:false] <SCRIPT language="javascript" tpl="URL,TMP"> <!-- OpenMail = "./../mail.php"; OpenHelp = "./../help_search.php"; //--> </SCRIPT> [/code]
<HEAD>~</HEAD> 내에 있는 스타일 태그 처리 문제
스타일 태그 처리는 위에서 살펴본 자바 스크립트 태그 처리 방법과 동일합니다.
<HEAD>~</HEAD> 내에 있는 메타 태그 처리 문제
만약 템플릿 파일마다 메타 태그가 중복되어 나타난다면 먼저 define되는 템플릿 파일에 있는 메타 태그에게 우선권이 있습니다. 중복되지 않는다면 각각의 템플릿 파일마다 존재하는 모든 메타 태그가 유효하게 처리됩니다.
[code html;gutter:false] <!-- a.htm --> <HEAD> <META http-equiv="content-type" content="text/html; charset=euc-kr"> <META name="author" content="hwooky"> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HEAD> <META http-equiv="content-type" content="text/html; charset=ks_c_5601-1987"> <META name="author" content="hwooky2"> <META name="keywords" content="sessioner"> <META name="Description" content="www.phpclass.com"> </HEAD> [/code]
두 개의 템플릿 파일로부터 생성된 HTML 문서를 보면 아래와 같습니다. 각 메타태그를 구분하여주는 아이디는 속성 "http-equiv" 또는 "name"입니다.
[code html;gutter:false] <HEAD> <META http-equiv="content-type" content="text/html; charset=euc-kr"> <META name="author" content="hwooky"> <META name="keywords" content="sessioner"> <META name="Description" content="www.phpclass.com"> </HEAD> [/code]
<HEAD>~</HEAD> 내에 있는 LINK 태그 처리 문제
만약 템플릿 파일마다 LINK 태그가 중복되어 나타난다면 먼저 define되는 템플릿 파일에 있는 LINK 태그에게 우선권이 있습니다. 중복되지 않는다면 각각의 템플릿 파일마다 존재하는 모든 LINK 태그가 유효하게 처리됩니다. 이 때 각 LINK 태그를 구분하여주는 아이디는 속성 "href"입니다. 따라서 속성 "href"의 값이 다르다면 어떤 템플릿 파일에 있든지 유효처리됩니다.
[code html;gutter:false] <!-- a.htm --> <HEAD> <LINK rel="stylesheet" type="text/css" href="./css/document.css"> <LINK rel="stylesheet" type="text/css" href="./templates/css/document.css"> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HEAD> <LINK rel="stylesheet" type="text/css" href="./css/document.css"> <LINK rel="stylesheet" type="text/css" href="./my/css/document.css"> </HEAD> [/code]
두 개의 템플릿 파일로부터 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HEAD> <LINK rel="stylesheet" type="text/css" href="./css/document.css"> <LINK rel="stylesheet" type="text/css" href="./templates/css/document.css"> <LINK rel="stylesheet" type="text/css" href="./my/css/document.css"> </HEAD> [/code]
<HEAD>~</HEAD> 내에 있는 TITLE 태그 처리 문제
만약 템플릿 파일마다 TITLE 태그가 중복되어 나타난다면 먼저 define되는 템플릿 파일에 있는 TITLE 태그에게 우선권이 있습니다.
[code html;gutter:false] <!-- a.htm --> <HEAD> <TITLE>핍클래스홈(phpCLASS HOME)</TITLE> </HEAD> [/code]
[code html;gutter:false] <!-- b.htm --> <HEAD> <TITLE>나의 집(My Home)</TITLE> </HEAD> [/code]
아래는 템플릿 파일 a.htm을 먼저 define처리한 경우입니다.
[code php;gutter:false] $tpl->define( array( 'a' => 'a.htm', 'b' => 'b.htm' ) ); [/code]
이러한 경우에 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <HEAD> <TITLE>핍클래스홈(phpCLASS HOME)</TITLE> </HEAD> [/code]
반대로 템플릿 파일 b.htm을 먼저 define처리한 경우입니다.
[code php;gutter:false] $tpl->define( array( 'b' => 'b.htm', 'a' => 'a.htm' ) ); [/code]
이러한 경우에 생성된 HTML 문서를 보면 아래와 같습니다.
<BODY> 태그 속성값 처리 문제
만약 템플릿 파일마다 BODY 태그이 속성값이 다르다면 어떻게 처리되는지 알아보겠습니다. 중복된 속성이 있다면 먼저 define되는 템플릿 파일에게 우선권이 있습니다. 중복되지 않는다면 각각의 템플릿 파일마다 존재하는 BODY 태그의 속성이 모두 유효하게 처리됩니다.
[code html;gutter:false] <!-- a.htm --> <BODY topmargin="0" leftmargin="0" marginwidth="0" marginheight="0"> . . . 이하 생략 . . [/code]
[code html;gutter:false] <!-- b.htm --> <BODY topmargin="2" leftmargin="2" marginwidth="0" marginheight="0" bgcolor="#5555"> . . . 이하 생략 . . [/code]
아래는 템플릿 파일 a.htm을 먼저 define처리한 경우입니다.
[code php;gutter:false] define( array( 'a' => 'a.htm', 'b' => 'b.htm' ) ); [/code]
이러한 경우에 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <BODY topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" bgcolor="#5555"> . . . 이하 생략 . . [/code]
반대로 템플릿 파일 b.htm을 먼저 define처리한 경우입니다.
[code php;gutter:false] define( array( 'b' => 'b.htm', 'a' => 'a.htm' ) ); [/code]
이러한 경우에 생성된 HTML 문서를 보면 아래와 같습니다.
[code html;gutter:false] <BODY topmargin="2" leftmargin="2" marginwidth="0" marginheight="0" bgcolor="#5555"> . . . 이하 생략 . . [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 11:23
written: Jan 28 2002
last modified: Sep 20 2006
여기서 설명되는 웹문서 리디렉션 기능은 공개되는 1.0.0 버전에 포함되어 있기는 하지만 확정된 기능이 아니라 여러분의 의견을 수렴할 목적으로 미리 공개되는 제안서(proposal)입니다. 따라서 향후 업그레이드할 때 아래서 설명한 내용과 다르게 동작할 수 있으니 주의하시기 바랍니다.
링크로 연결된 HTML 문서
나모 웹에디터 등과 같은 HTML 편집기로 작성된 복수개의 HTML 문서의 하이퍼링크 구조를 PHP 문서의 URL로 리디렉션해주는 기능입니다.
HTML 편집기를 이용하여 아래와 같은 서로 연결된 3개의 템플릿 파일을 작성한 경우를 예를 들어 설명하겠습니다.
[code html;gutter:false] <!-- filename : a.html --> <P><H3>{TITLE}</H3></P> <P>a.html</P> <P><A href="b.html">b.html</A></P> <P><A href="c.html">c.html</A></P> [/code]
[code html;gutter:false] <!-- filename : b.html --> <P><H3>{TITLE}</H3></P> <P><A href="a.html">a.html</A></P> <P>b.html</P> <P><A href="c.html">c.html</A></P> [/code]
[code html;gutter:false] <!-- filename : c.html --> <P><H3>{TITLE}</H3></P> <P><A href="a.html">a.html</A></P> <P><A href="b.html">b.html</A></P> <P>c.html</P> [/code]
하이퍼링크로 연결된 세 개의 HTML 문서 a.html, b.html, c.html을 나모와 같은 웹에디터로 편집하고 링크 여부를 확인할 때는 아래와 같이 문제없이 잘 동작합니다.
< a.html >
< b.html >
< c.html >
 그러나 웹에디터를 이용하여 작성된 위의 세 개의 템플릿 파일에 포함된 템플릿 변수(위의 예에서는 {TITLE})를 PHP 스크립트와 후키템플릿으로 처리하기 위해 몇가지 수고를 하여야 합니다.
이 때 템플릿 파일 a.html, b.html, c.html은 아래와 같이 index.php 문서가 있는 곳의 하위디렉토리 "templates"에 있다고 가정합니다.
-+- index.php
+- tempaltes - a.html, b.html, c.html
그러면 템플릿 파일을 처리하기 위한 PHP 소스는 대략 아래와 같을 것입니다.
[code php;gutter:false] <?php /** * filename : index.php * * 현재 처리해야 할 템플릿 파일은 GET 방식으로 아래와 같이 넘어온다고 가정한다. * * a.html 문서를 보여줄 때 : index.php?template=a.html * b.html 문서를 보여줄 때 : index.php?template=b.html * c.html 문서를 보여줄 때 : index.php?template=c.html */ if (empty($template)) { $template = 'a.html'; } include_once('./class/template/class.hTemplate.php'"); $tpl = new hTemplate('./templates'); $tpl->define('main', $template); $tpl->assign(array( 'TITLE' => '*$template*', 'MAIN' => 'main' )); $tpl->output('MAIN'); ?> [/code]
그리고 이와 같은 PHP 소스에서 템플릿 파일 a.html, b.html, c.html을 정상적으로 처리하기 위해서는 각 템플릿 파일이 아래와 같이 수정되어야 합니다.
[code html;gutter:false] <!-- filename : a.html --> <P><H3>{TITLE}</H3></P> <P>a.html</P> <P><A href="{_SERVER.PHP_SELF}?template=b.html">b.html</A></P> <P><A href="{_SERVER.PHP_SELF}?template=c.html">c.html</A></P> [/code]
[code html;gutter:false] <!-- filename : b.html --> <P><H3>{TITLE}</H3></P> <P><A href="{_SERVER.PHP_SELF}?template=a.html">a.html</A></P> <P>b.html</P> <P><A href="{_SERVER.PHP_SELF}?template=c.html">c.html</A></P> [/code]
[code html;gutter:false] <!-- filename : c.html --> <P><H3>{TITLE}</H3></P> <P><A href="{_SERVER.PHP_SELF}?template=a.html">a.html</A></P> <P><A href="{_SERVER.PHP_SELF}?template=b.html">b.html</A></P> <P>c.html</P> [/code]
PHP 소스와 a.html, b.html, c.html을 위와 같이 다 작성한 후 index.php를 실행하게 되면 아래와 같이 링크로 연결된 템플릿 문서를 정상적으로 실행할 수 있습니다.
< a.html >
< b.html >
< c.html >
웹문서 리디렉션
HTML 문서에서 링크로 연결된 부분을 모두 찾아 일일이 수정하지 않으려면 HTML 문서를 작성할 때 상대 경로가 아닌 절대 경로를 사용하는 등의 조치를 취해야 합니다.
그러나 웹문서 리디렉션 기능을 이용하면 상대 경로로 작성하더라도 링크로 연결된 부분에 지정된 웹문서를 현재 실행중이 PHP 소스로 GET 방식의 변수 $_GET['template']에 담아 넘겨줍니다.
즉 위에서 설명한 방법을 자동으로 수행하는 것이 웹문서 리디렉션 기능입니다. 이 기능을 이용하려면 몇가지 주의해야 할 사항들이 있습니다. 확장자가 "html"인 웹문서를 상대경로로 지정하게 되면 무조건 이 기능이 수행됩니다. 따라서 기존에 홈페이지 문서가 이 기능으로 말미암아 정삭적으로 동작하지 않는 경우가 많이 있을 것입니다.
만약 기존에 작성된 웹문서에서 연결된 HTML 문서를 리디렉션하지 않고 이전과 같이 직접 연결하려면 아래와 같이 조치하시기 바랍니다.
1. 연결된 HTML 문서의 확장자를 "html" 대신에 "htm"으로 변경합니다.
2. 아니면 상대 경로가 아닌 절대 경로로 변경합니다.
3. 아니면 class.hHtmlUrlRedirection.php 파일에 정의된 클래스 hHtmlUrlRedirection의 멤버 변수 $forwarding_ext에 등록된 "html" 대신에 다른 확장자를 지정하시기 바랍니다. 여기에 등록된 확장자에 대하여만 웹문서 리디렉션을 수행합니다.
만약 PHP 소스로 GET 방식의 변수명을 $_GET['template']가 아닌 다른 변수로 넘기려면 class.hHtmlUrlRedirection.php 파일에 정의된 클래스 hHtmlUrlRedirection의 멤버 변수 $forwarding_var에 등록된 "template" 대신에 다른 변수명을 지정하시기 바랍니다.
웹문서 리디렉션의 장점
웹문서 리디렉션을 이용하면 디자이너가 위지윅 웹에디터를 이용하여 작성된 일련의 HTML 문서 내에 존재하는 하이퍼링크 체인을 수정없이 PHP에서 그대로 활용할 수 있습니다.
웹문서 리디렉션의 활용
제가 이 기능을 추가하면서 염두에 둔 것은 나모 웹에디터의 사이트 관리자에 의해 작성된 "네비게이션 바"입니다. 나모 웹에디터의 "네비게이션 바"란 홈페이지 내부의 중요한 부분으로 이동할 수 있도록 만들어진 하이퍼링크들의 묶음을 말합니다.
나모 웹에디터는 사이트 관리자가 가지고 있는 홈페이지의 논리적 구조 정보를 이용하여 "네비게이션 바"를 자동으로 생성하고 유지시켜 주는 편리한 기능을 제공합니다. 홈페이지 구조가 바뀌면 "내비게이션 바"의 하이퍼링크 정보들도 자동으로 바뀌므로 아주 편리합니다.
이와같이 나모 웹에디터와 같은 HTML 에디터를 이용하여 홈페이지 구조를 임의로 변경하더라도 PHP 소스를 전혀 손대지 않고도 홈페이지 내의 하이퍼링크 체인 구조를 그대로 유지할 수 있다면 홈페이지 개발 속도를 상당히 개선할 것으로 보입니다.
처음으로 제안되는 기능이라 어설픈 면이 많이 보이지만 업그레이드해 나가면서 점점 지능화되리라 보이며 여러분이 이를 응용하는데 불편한 점이나 개선 방향에 대한 의견을 주시면 적극 검토해 나갈 생각입니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 11:20
written: Jan 28 2002
last modified: Sep 20 2006
리소스 리디렉션(resource redirection)
HTML 웹에디터에서 작업하다보면 그림이나 동영상과 같은 리소스의 위치가 현재 작업중이 HTML 문서를 기준으로 나타나게 됩니다. 이러한 템플릿 파일이 PHP 소스에 적용될 때 어떠한 문제가 발생하고 리소스 리디렉션을 이용해 어떻게 해결되는지를 살펴보겠습니다.
아래와 같이 PHP 문서를 기준으로 그림 파일 phpclass.gif는 images라는 서브 디렉토리에 있고, 템플릿 파일 phpclass.htm은 templates라는 서브 디렉토리에 있다고 가정하겠습니다.
PHP 문서가 있는 곳 -+- images
+- tempaltes
이럴 때 생성자에서 템플릿 경로를 "./templates"라고 지정하게 됩니다.
[code php;gutter:false] <?php include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define( array( 'phpclass' => 'phpclass.htm' ) ); $tpl->assign(array('TITLE' => '이미지 리디렉션 실험')); $tpl->assign('PHPCLASS', 'phpclass'); $tpl->output('PHPCLASS'); ?> [/code]
템플릿은 웹디자이너가 PHP 프로그래머와는 독립적으로 위지윅 툴을 이용하여 아래와 같이 작성하게 될 것입니다. 그림 파일 phpclass.gif가 위지윅 툴에 잘 보이겠지요.
[code html;gutter:false] <!-- ./templates/phpclass.htm --> <HTML> <HEAD> <TITLE>{TITLE}</TITLE> </HEAD> <BODY> <IMG src="./../images/phpclass.gif"> </BODY> </HTML> [/code]
그런데 문제는 PHP 문서가 실행될 때는 템플릿에 있는 그림 파일을 PHP 문서가 있는 곳을 기준으로 찾게 된다는 것입니다. 즉, 아래 경로에서 보면 PHP 문서와 동일한 단계에 있는 하단 images 디렉토리에서 phpclass.gif를 찾게 되는 것이지요. 그러니 브라우저에 phpclass.gif가 제대로 나타나겠습니까? 당연히 안보이겠지요.
-+- PHP 문서가 있는 곳 -+- images
| +- tempaltes
+- images
후키템플릿에서는 이 경로를 PHP 문서 기준으로 리디렉션하기 위해 템플릿에 있는 그림 파일 경로 './../images'를 찾아 내어 이 경로 앞에다 생성자에서 지정한 템플릿 경로를 덧붙입니다. 그러면 그림 파일 경로가 './templaes/./../images'가 되겠지요. 이를 정리하면 './images'가 되는 것이지요. 물론 생성자가 아닌 define() 함수에서 템플릿경로를 직접 지정한 경우에도 URL을 잘 찾아내어 리디렉션해 줍니다.
<PARAM> 태그의 "value" 속성 처리의 경우
아래와 같은 예를 살펴보지요.
[code html;gutter:false] <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/flash/swflash.cab#version=6,0,29,0" width="219" height="75"> <PARAM name="movie" value="base/top1.swf"> <PARAM name="quality" value="high"> <EMBED src="base/top1.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="219" height="75"> </EMBED> </OBJECT> [/code]
따라서 1.0.0 버전에서 위의 템플릿 파일을 컴파일하게 되면 아래와 같은 결과를 얻을 수 있습니다. 이 때 기본 템플릿 파일 디렉토리가 './templates'라고 가정합니다.
[code html;gutter:false] <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/flash/swflash.cab#version=6,0,29,0" width="219" height="75"> <PARAM name="movie" value="./templates/base/top1.swf"> <PARAM name="quality" value="high"> <EMBED src="./templates/base/top1.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="219" height="75"> </EMBED> </OBJECT> [/code]
위 예제에서 보는 바와 같이 <PARAM> 태그의 value 속성이 URL인 경우만 리디렉션하게 된다는 것입니다. 그런데 위의 예에서 보는 바와 같이 value 속성이 "high"인 경우를 생각해 볼 때, 작성자는 "high"를 URL로 사용한 것이 아닌데 실제 "./templates"의 하위 디렉토리로 "high"가 존재하거나 현행디렉토리에 "high"라는 파일(또는 디렉토리)이 존재한다면 아래 부분의 컴파일 결과는
[code html;gutter:false] <PARAM name="quality" value="high"> [/code]
이 아니라, 아래와 같을 것입니다.
[code html;gutter:false] <PARAM name="quality" value="./templates/high"> [/code]
이러한 결과는 원하는 것이 아닐 것입니다. 따라서 이러한 결과를 피하기 위해서는 "high"라는 파일명(또는 디렉토리명)을 다른 이름으로 변경하여 주기 바랍니다. 만약 꼭 "high"라는 파일명(또는 디렉토리명)을 사용해야 한다면 아래와 같이 템플릿 변수를 이용하여 해결하시기 바랍니다.
아래의 원래 소스
[code html;gutter:false] <PARAM name="quality" value="high"> [/code]
대신에
[code html;gutter:false] <PARAM name="quality" value="{high::high}"> [/code]
와 같이 템플릿 변수 high(다른 이름도 관계없음)에 초기값으로 "high"를 할당합니다. 이러한 문제 해결방법은 <PARAM> 태그 뿐만 아니라 <OBJECT> 태그의 "data" 속성 등등에 대한 리소스 리디렉션을 수행할 때도 적용됩니다.
윈도우 플랫폼과 리눅스 플랫폼에서 템플릿 파일 공유하기
윈도우 플랫폼의 경우에는 그림 등의 경로를 나타낼 때 드라이브명을 지정하는 경우가 종종 있습니다. 이러한 경우에 윈도우 플랫폼에서 작성된 템플릿 파일을 리눅스 플랫폼에서 사용하기 위해서는 템플릿 파일의 경로 부분을 수정하여야 됩니다.
이러한 수정작업없이 윈도우 플랫폼과 리눅스 플랫폼에서 템플릿 파일을 공유하기 위하여 후키템플릿에서는 드라이브명으로부터 시작하는 경로를 현 스크립트 문서에 맞춰서 상대경로로 자동으로 변환해 줍니다.
템플릿에 지정된 경로가 현 스크립트 문서의 하위디렉토리에 있는 경우
템플릿에 지정된 경로가 현 스크립트 문서의 하위디렉토리에 있는 경우에는 현 스크립트 문서의 경로를 기준으로 상대 경로로 자동 변환하여 줍니다.
 예를 들어 웹 문서 기본 경로가 d:/web/homepage이고 현재 스크립트 문서의 경로가 d:/web/homepage/test/htpl-zboard라고 가정하지요. 이 때 템플릿 파일 상에 있는 그림 파일 경로가 아래와 같은 경우를 살펴보겠습니다.
file:///d|/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
file:///d:/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
file://d|/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
file://d:/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
d|/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
d:/web/homepage/test/htpl-zboard/templates/images/smartbutton3033.gif
/test/htpl-zboard/templates/images/smartbutton3033.gif
이와같이 그림 파일 경로가 현 스크립트 문서의 하위 디렉토리에 있으면 현 스크립트 문서를 기준으로 아래와 같이 상대 경로로 변환하여 줍니다. 윈도우 플랫폼의 경우라면 윈도우에서의 패스 구분자로 '\'가 나타날 수 있으나 이 경우에도 같은 결과를 얻을 수 있으며 또한 드라이브명은 소문자, 대문자를 구분하지 않고 처리합니다.
./templates/images/smartbutton3033.gif
템플릿에 지정된 경로가 현 스크립트 문서의 하위디렉토리에 있지 않는 경우
반면에 그림 파일 경로가 아래와 같이 현 스크립트 문서의 하위 디렉토리에 있지 않은 경우를 살펴보겠습니다.
file:///d|/web/homepage/php/templates/images/email2.gif
file:///d:/web/homepage/php/templates/images/email2.gif
file://d|/web/homepage/php/templates/images/email2.gif
file://d:/web/homepage/php/templates/images/email2.gif
d|/web/homepage/php/templates/images/email2.gif
d:/web/homepage/php/templates/images/email2.gif
/php/templates/images/email2.gif
이와같이 그림 파일 경로가 현 스크립트 문서의 하위 디렉토리에 있지 않는 경우라면 웹 문서 기본 경로가 d:/web/homepage를 기준으로 변환하여 줍니다.
./../../php/templates/images/email2.gif
이러한 기능은 윈도우 플랫폼인 곳에서 작업한 내용을 리눅스로 옮길 때 템플릿의 URL을 수정하지 않더라도 그대로 이용할 수 있어 유용하리라 생각합니다. 혹시 이 기능으로 말미암아 예측하지 못했던 부작용이 발생될 수도 있으니 이러한 경우를 만나게 되면 꼭 알려주세요.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 11:16
written: Jan 28 2002
last modified: Sep 20 2006
논리 부정 연산자 !
PHP의 논리 연산자 중에는 논리 부정(logical not)을 나타내는 연산자 '!'가 있습니다. 논리 부정 연산자는 다음에 오는 수식의 평가가 거짓(false)인 경우에만 참(ture)으로 평가합니다. 이러한 논리 부정 연산자를 템플릿에서도 템플릿 변수를 평가할 때 사용할 수 있습니다. 다음에 오는 템플릿 변수값이 거짓인 경우에만 참으로 평가하게 됩니다.
제 홈페이지에서는 방명록의 템플릿에서 논리 부정 연산자를 사용하였습니다. 아래는 제 방명록을 나타낸 템플릿을 브라우저에서 보여준 것입니다.
< 핍클래스 홈페이지의 방명록 템플릿 >
템플릿을 보면 {r.RE}라는 템플릿 변수가 있습니다. 이 변수의 의미는 답글이 있으면 true, 없으면 false 값을 가집니다. 따라서 답글이 있으면 switch문 {r.RE, ......}에 해당하는 답글 내용이 출력될 것입니다.
또 다른 템플릿 변수 {!r.RE}가 그 위쪽에 있는 것을 볼 수 있습니다. 이것이 논리 부정 연산자로 평가되는 템플릿 변수입니다. 그 의미는 템플릿 변수 {r.RE}의 결과값에 대하여 논리 부정하는 것입니다. 즉, 답글이 있으면 false, 없으면 true값을 가집니다.
따라서 방문자가 방명록에 글을 적게 되면(이 때는 답글이 없는 상태임) 답글 내용은 나타나지 않지만 답글을 달 수 있는 링크용 그림 및 등록된 글을 삭제할 수 있는 링크용 그림이 나타나게 되는 것이지요.
< 방문자가 글을 등록하였을 때 나타나는 모양 >
관리자가 등록된 글에 대하여 답글을 단다면 답글 내용이 나타나겠지만 대신에 링크용 그림은 안보이게 될 것입니다.
< 관리자가 답글을 등록하였을 때 나타나는 모양 >

Posted by 방글24
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
phpsource/템플릿2006. 9. 20. 09:38
written: Jan 28 2002
last modified: Sep 20 2006
캐시 정보
$tpl = new hTemplate(템플릿 파일 기본 디렉토리,
array(
'active_cache_handler' => false or true
or _TPL_CACHE_NO
or _TPL_CACHE_DYNAMIC
or _TPL_CACHE_STATIC,
'update' => set to true if update cache,
'id' => cache ID,
'period' => garbage collection period,
'maxlifetime' => cache valid time,
'path' => path to cache,
'mode' => cache file permission(default is 0777),
'active_cache_compress' => false or not(default is true)
)
);
후키템플릿 생성자의 두 번째 인수로 캐시 정보가 전달됩니다. 이중에서 update 및 active_cache_handler 설정은 후키템플릿에서 사용하는 설정값이며 나머지는 모두 후키캐시핸들러(클래스명 hCacheFile)에서 사용하는 설정값입니다. 후키템플릿 생성자를 실행할 때 후키캐시 클래스에 대한 객체가 생성되며 이 때 캐시 정보를을 후키캐시 클래스의 생성자에 넘겨주게 됩니다.
< 캐시 정보의 기본값 및 설정예 >
항목 용도 기본값 설정예
active_cache_handler 캐시핸들러 사용유무 true false, _TPL_CACHE_NO, _TPL_CACHE_DYNAMIC, _TPL_CACHE_STATIC
or not
update 캐시 업데이트 false false or not
id 웹페이지를 구분하기 위한 인식자 HW_CACHE_ID 임의의 문자열
period 가비지콜렉션을 수행하는 주기 259,200(3일) 초단위로 설정
maxlifetime 캐시 데이터의 유효 기간 2,592,000(30일) 초단위로 설정
path 캐시가 저장되는 디렉토리 /tmp/ 접근가능한 모든 디렉토리
mode 캐시 파일의 퍼미션 0777 0644
active_cache_compress 캐시 파일의 압축 유무 true false or not
1.2.0 버전부터 mode와 active_cache_compress 설정이 추가되었으며, active_cache_handler에 설정할 수 있는 값은 이전의 true, false 외에 상수 _TPL_CACHE_NO, _TPL_CACHE_DYNAMIC, _TPL_CACHE_STATIC가 추가되었으며 기본값이 true에서 _TPL_CACHE_STATIC으로 변경되었습니다.
캐시 정보를 지정하는 예를 들어보면 아래와 같습니다.
[code php;gutter:false] include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates', array( 'id' => 'test', 'period' => 10*24*3600, // 10일 'maxlifetime' => 60*24*3600, // 60일 'path' => './hCache' ) ); [/code]
active_cache_handler
'active_cache_handler'  => false or true
or _TPL_CACHE_NO
or _TPL_CACHE_DYNAMIC
or _TPL_CACHE_STATIC,
캐시핸들러를 사용하지 않으려면 false를 설정한다. 그렇지 않으면 캐시핸들러가 기본적으로 동작합니다. 1.2.0 버전부터는 기본적으로 정적 캐시(Static Cache)로 동작합니다.
< active_cache_handler 설정값에 따른 동작 >
설정값 동작 가능 버전
true 정적 캐시 all
false 캐시 없음 all
_TPL_CACHE_NO 캐시 없음 1.2.0
_TPL_CACHE_DYNAMIC 동적 캐시 1.2.0
_TPL_CACHE_STATIC 정적 캐시 1.2.0
update
'update' => false or not(set to true if update cache)
update값이 false가 아니라면 이전에 사용하던 캐시 데이터를 말끔히 지워버리고 템플릿 파일로부터 템플릿을 다시 분석하여 변화된 템플릿 정보를 반영하여 캐시에 저장합니다. 템플릿 내용이 바뀌게 되면 이를 자동으로 감지하여 캐시 내용을 갱신하기 때문에 update 인수는 특별한 이유가 없으면 지정할 필요가 없습니다. 현재 페이지에 대한 캐시만을 강제로 갱신시킬 때 사용하시기 바랍니다.
id
'id' => cache ID
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'id' => 'abc' ) ); [/code]
후키템플릿 클래스에서 캐시를 호출할 때 위와 같이 id를 지정하였다면 후키템플릿 클래스 내부에서 후키캐시 객체를 생성할 때는 다음과 같은 방법으로 id를 재지정한 후 재지정된 id를 후키 캐시 클래스 생성자에 전달해 줍니다.
[code php;gutter:false] $id = str_replace('/', '@', substr($PHP_SELF, 1)) . "($id)"; new hCache( array( 'id' => $id ) ); [/code]
대부분의 경우에는 id를 지정할 필요가 없습니다. 클래스 내에서는 각 웹페이지를 구분하기 위하여 해당 웹페이지의 URL의 pass를 사용합니다. 예를 들어,
캐시하고자 하는 웹페이지의 URL:
http://www.phpclass.com/php/class.php

캐시클래스에 전달되는 캐시 id:
php@class.php()
후키템플릿에서는 현 문서 URL의 pass "phpclass/phpclass.php"에서 패스구분자 "/"를 "@"로 바꾼 후 후키캐시로 전달합니다. 따라서 하나의 URL로 하나의 웹페이지가 생성되는 경우에는 생성자에 id를 지정할 필요가 없습니다. 그러나 만약 하나의 URL로 여러 개의 웹페이지가 생성된다면 이를 구분할 수 있는 인식자가 추가로 필요할 것입니다. 이 역할을 하는 것이 생성자에 지정되는 id입니다. 예를 들어 id를 "1"라고 지정하게 되면 이 때 생성되는 캐시 파일명은 아래와 같을 것입니다.
캐시하고자 하는 웹페이지의 URL:
http://www.phpclass.com/php/class.php

생성자에 지정된 id값: "1"

캐시클래스에 전달되는 캐시 id:
php@class.php(1)
period
'period' => garbage collection period
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'period' => 259200 ) ); [/code]
가비지콜렉션은 서버에 많은 부담을 주는 동작 중에 하나입니다. 따라서 매번 수행하기 보다는 일정한 주기마다 정기적으로 수행하는 것이 바람직하다고 생각합니다. 이러한 이유로 후키캐시에 설정되어 있는 주기는 3일(초단위로는 259,200초)로 기본 설정되어 있습니다. 이에 따라 3일에 한번씩 가비지 콜렉션을 수행하게 됩니다. 이 주기를 더 길게하거나 짧게 하고 싶으면 period의 값을 초단위로 지정하여 주면 됩니다.
maxlifetime
'maxlifetime' => cache valid time
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'maxlifetime' => 2592000 ) ); [/code]
maxlifetime은 각 웹페이지에 대한 캐시 만료 기한을 나타내는 설정값입니다. 해당 웹페이지의 캐시 데이터를 사용한 후 maxlifetime에서 설정된 시간이 지나도록 다시 사용되지 않는다면 이 캐시 데이터는 쓰레기로 간주됩니다. 따라서 가비지콜렉션을 수행할 때 이러한 쓰레기는 모두 삭제됩니다. maxlifetime은 30일(초단위로는 2,592,000초)로 기본 설정되어 있습니다. 이 시간을 더 길게하거나 짧게 하고 싶으면 maxlifetime의 값을 초단위로 지정하여 주면 됩니다.
maxlifetime이 필요한 경우를 예를 든다면 웹페이지의 URL이 변경되었을 때 이전에 사용하던 URL에 대한 캐시 데이터는 다시 사용되지 않을 것입니다. maxlifetime은 이와같이 다시 사용되지 않는 캐시 데이터를 정리하는데 유용하게 사용될 것입니다.
path
'path' => path to cache
캐시가 저장되는 장소는 기본적으로 "/tmp/"입니다. 이 장소를 변경하고 싶을 때 path에 해당 경로를 지정해 주면 됩니다. 이 때 물론 해당 경로에 대한 퍼미션은 미리 적절히 조정해 주셔야 합니다. 리눅스에서 캐시 디렉토리에 대하여 퍼미션을 조정하려면 아래와 같이 하시기 바랍니다.
mkdir /tmp
chown nobody:nobody hCache
chmod 707 hCache
소유자가 "nobody"가 아니라면 해당되는 소유자를 지정해 주면 됩니다. 이것은 httpd.conf를 참조바랍니다.
mode
'mode' => cache file permission(default is 0777),
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'mode' => 0644 ) ); [/code]
1.2.0 버전부터는 새로운 설정값인 mode를 통해 캐시파일을 생성할 때 퍼미션 모드를 설정할 수 있도록 해줍니다. 기본값은 0777로 설정되어 있습니다.
< 캐시파일 퍼미션의 기본값 및 설정예 >
항목 용도 기본값 설정예
mode 캐시 파일의 퍼미션 0777 0644
active_cache_compress
'active_cache_compress' => false or not(default is true)
1.2.0 버전부터는 새로운 설정값인 active_cache_compress를 통해 캐시파일의 압축 유무를 설정할 수 있도록 해줍니다. 기본값은 true로 설정되어 있습니다.
gz 라이브러리 함수 gzcompress, gzuncompress를 이용하여 압축합니다. 압축에 사용하는 함수는 특별히 정해진 것은 아니고 향후 버전에서 템플릿 툴 내부에서 상황에 따라 변경될 수 있습니다.
서버가 이 함수들을 지원하지 않는다면 active_cache_compress 값을 true로 설정하더라도 압축하지 않고 저장합니다.
[code php;gutter:false] $tpl = new hTemplate('./templates', array( 'active_cache_compress' => false ) ); [/code]
< 캐시파일 압축기능의 기본값 및 설정예 >
항목 용도 기본값 설정예
active_cache_compress 캐시 파일의 압축 유무 true false or not

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:30
written: Jan 28 2002
last modified: Sep 20 2006
1.2.0 버전부터는 FastPrint() 함수 대신에 output() 함수를 이용해주세요. FastPrint() 함수는 상위호환성없이 당분간 임시로 사용될 예정입니다.
output() 함수의 사용법은 FastPrint() 함수의 사용법과 동일하며, 기존의 FastPrint() 함수에서 지정할 수 있었던 템플릿변수 외에도 HTML 스크립트 문장을 직접 지정할 수 있습니다.
또한 output() 함수에서는 FastPrint() 함수에서 디버깅할 수 있던 "템플릿 변수 정보", "템플릿 파일 정보" 외에 "캐시 관련 정보"를 볼 수 있습니다.
템플릿 변수값 출력하기
FastPrint(변수명)
이 함수는 템플릿 변수에 저장되어 있는 HTML 소스를 출력하는 기능을 담당합니다.
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint('MAIN'); [/code]
위와 같은 경우에 FastPrint() 함수는 템플릿 변수 MAIN의 값을 출력합니다.
템플릿 변수명을 지정하지 않았을 때 처리 방법
[code php;gutter:false] $tpl->assign('MAIN', 'main'); $tpl->FastPrint(); [/code]
0.0.1 버전에서의 처리방법
템플릿 변수명을 지정하지 않으면 assign(변수명,...)에 의해 마지막으로 생성된 템플릿 변수를 기본으로 사용합니다. 그러나 assign() 함수의 두 번째 인수로 템플릿 또는 블록변수(다이나믹 블록)이 아닌 순수 문자열을 지정하였을 때는 변수명을 반드시 지정하여야 합니다.
0.0.2 버전에서의 처리방법
버전 0.0.2에서는 문자열일 때도 생략할 수 있습니다.
1.0.0 버전에서의 처리방법
버전 1.0.0부터는 템플릿 변수명을 명시적으로 지정하는 것을 원칙으로 하며 지정하지 않았을 때는 향후 업그레이드 버전에서 호환성을 보장할 수 없습니다.
1.1.2 버전에서의 처리방법
버전 1.1.2부터는 템플릿 변수명을 항상 명시적으로 지정하여야 하며 지정하지 않으면 에러로 처리합니다.
FastPrint() 함수를 이용한 디버깅
아래와 같이 FastPrint() 함수의 배열인수를 통해 "-variable", "-template"를 지정하면 템플릿 변수 정보 및 템플릿 파일 정보를 알려줍니다.
[code php;gutter:false] $tpl->FastPrint( array( '-variable', '-template' ) ); [/code]
-variable
현재까지 할당되어 있는 템플릿변수에 대한 상태를 출력합니다.
-template
현재까지 템플릿파일로부터 읽고 파싱된 템플릿 정보를 출력합니다.
[code php;gutter:false] $tpl->FastPrint( array( 'MAIN', '-variable', '-template' ) ); [/code]
먼저 템플릿변수 "MAIN"를 출력합니다. 그 다음에 할당된 모든 템플릿 변수의 상태를 보여줍니다. 그 다음에 템플릿파일로부터 읽어들인 모든 템플릿 정보를 보여줍니다.
만약 디버깅 정보 전부가 아닌 일부 템플릿 변수(또는 템플릿 정보, 캐시 관련 정보)에 대하여만 보고 싶다면 아래와 같이 보고싶은 정보 항목을 명시적으로 지정하면 됩니다.
[code php;gutter:false] $tpl->FastPrint( array( 'MAIN', '-variable PAGEVIEWS HEAD_TITLE COUNTER', '-template MAIN' ) ); [/code]
이 기능에 대한 좀 더 자세한 정보는 "2.2.템플릿 변수 정보", "2.3.템플릿 구조 정보를 참조바랍니다.

Posted by 방글24
phpsource/템플릿2006. 9. 20. 09:28
written: Jan 28 2002
last modified: Sep 20 2006
템플릿 변수값 읽어오기
get_assigned(변수명)
이 함수는 해당 템플릿 변수에 지정되어 있는 변수값을 반환해 줍니다. 따라서 아래와 같은 경우를 보면 "잘되나 돌려봐야지" 라는 문자열을 반환해 주게 됩니다.
[code php;gutter:false] include_once('class.hTemplate.php'); $tpl = new hTemplate('./templates'); $tpl->define('table', 'table.htm'); $tpl->assign('BODY', '잘되나 돌려봐야지.'); $body = $tpl->get_assigned('BODY'); [/code]
FastTemplate에서는 assign() 함수에 의해 할당된 템플릿 변수와 parse 함수에 의해 할당된 템플릿 변수가 구분되어 있습니다. 그러나 후키템플릿에서는 아래 표에서 보는 바와 같이 템플릿 변수가 하나로 통일되어 있습니다.
< 템플릿 변수의 종류 및 저장 장소 >
종류 저장장소
FastTemplate 후키템플릿
assign() 함수에 의해 할당된 템플릿 변수 $PARSEVARS[변수명] 템플릿변수 리스트[변수명]
parse 함수에 의해 할당된 템플릿 변수 $변수명
< 템플릿 변수값 읽어오는 함수 >
종류 수행함수
FastTemplate 후키템플릿
assign() 함수에 의해 할당된 템플릿 변수값 읽어오기 get_assigned(변수명) get_assigned(변수명)
parse 함수에 의해 할당된 템플릿 변수값 읽어오기 fetch(변수명)
FastTemplate에서의 fetch 함수는 parse 함수의 실행 결과로 얻어진 템플릿 변수값을 반환하기 위해 작성되어 있었습니다. 후키템플릿에서는 템플릿 변수가 하나로 통일되었기 때문에 함수를 구분하여 작성할 필요가 없어졌고 따라서 템플릿 변수를 읽어오는 함수는 get_assigned() 함수로 통일되었습니다.
get_assigned() 함수를 이용하면 템플릿 변수값을 웹브라우저로 직접 출력하는 대신에 PHP 코드 내로 변수값을 넘겨 받을 수 있습니다. 그러면 넘겨 받은 값을 가지고 E-Mail로 전송하거나 파일로 저장하거나 할 수 있지요.
[code php;gutter:false] $data = $tpl->get_assigned('MAIN'); fwrite($fd, $data); // save to a file [/code]
템플릿 변수명을 지정하지 않았을 때 처리 방법
[code php;gutter:false] $tpl->assign('MAIN', array('table', 'main')); $data = $tpl->get_assigned(); [/code]
0.0.1 버전에서의 처리방법
템플릿 변수명을 지정하지 않으면 assign(변수명,...)에 의해 마지막으로 생성된 템플릿 변수를 기본으로 사용합니다. 그러나 assign() 함수의 두 번째 인수로 템플릿 또는 블록변수(다이나믹 블록)가 아닌 순수 문자열을 지정하였을 때는 변수명을 반드시 지정하여야 합니다.
0.0.2 버전에서의 처리방법
버전 0.0.2에서는 문자열일 때도 생략할 수 있습니다.
1.0.0 버전에서의 처리방법
버전 1.0.0부터는 템플릿 변수명을 명시적으로 지정하는 것을 원칙으로 하며 지정하지 않았을 때는 향후 업그레이드 버전에서 호환성을 보장할 수 없다.
1.2.0 버전에서의 처리방법
템플릿 변수명을 명시적으로 지정하여야 하며, 지정하지 않으면 정상적으로 동작하지 않습니다.
사용 예제
템플릿을 이메일로 보내기
후키템플릿은 템플릿 내용으로 HTML 문서로 제한하지 않습니다. 따라서 템플릿 분석 결과를 브라우저로 출력하는 대신 그 데이터를 변수로 되돌려 받아 이메일로 보낼 수 있습니다.
[code php;gutter:false] $data = $tpl->get_assigned(); mail('hwooky@phpclass.com', '후키템플릿', $data); [/code]
템플릿을 파일로 저장하기
템플릿 분석 결과를 아래와 같이 별도의 파일로 저장할 수 있습니다.
[code php;gutter:false] $data = $tpl->get_assigned(); if ($fp=@fopen('parsed.html', 'w')) { fwrite($fp, $data); fclose($fp); } [/code]
템플릿을 다른 템플릿 변수에 할당하기
템플릿 분석 결과를 아래와 같이 또 다른 템플릿 변수에 할당하게 되면 다음 템플릿을 분석할 때 이용할 수 있을 것입니다.
[code php;gutter:false] $data = $tpl->get_assigned(); $tpl->assign('NEXTMAIN', $data); [/code]
get_assigned()로 획득한 값을 출력할 때 주의할 점
1.2.0 버전부터 FastPrint() 함수대신에 사용되는 output() 함수에서 출력된 템플릿 스크립트가 php 에서 제공하던 출력버퍼 대신에 후키템플릿 자체 버퍼를 이용하며, 자체 버퍼에 저장된 템플릿 스크립트는 shutdown 함수가 실행될 때 브라우저로 전송됩니다. 따라서 print 또는 echo 함수를 이용하여 출력된 스크립트들은 자체 버퍼에 저장된 템플릿 스크립트보다 먼저(php5) 또는 나중(php4)에 출력됩니다.
따라서 get_assigned() 함수로 획득한 템플릿 스크립트를 순서대로 브라우저로 전송하려면 print 또는 echo 함수를 이용하면 안되며 새로 추가된 output()함수를 이용하시기 바랍니다.
[code php;gutter:false] $tpl->output($tpl->get_assigned('VARNAME')); [/code]

Posted by 방글24