phpsource/템플릿2006. 9. 20. 12:56
written: Jan 28 2002
last modified: Sep 20 2006
템플릿을 이용하여 웹페이지를 작성하는 과정을 살펴보겠습니다.
수행 동작 3단계
하나의 템플릿을 가지고 HTML로 변화시키는 과정은 보통 3단계를 거치게 됩니다. 이러한 과정을 모든 템플릿에 대하여 순차적으로 또는 병행하여 수행하므로써 하나의 완성된 페이지가 작성되는 것입니다.
  1. 템플릿 문서 등록하기 : define()
  2. 템플릿 변수 할당하기 : assign()
  3. 템플릿 변수 출력하기 : output()
FastTemplate에서는 assign 단계가 assign과 parse로 나누어 설명됩니다. 그러나 후키템플릿에서는 parse 단계에 있던 대부분의 기능이 define 단계에 흡수되었으며 나머지 부분 즉 템플릿 내에 있는 변수에 값을 할당하는 것은 assign 개념과 같은 개념으로 보기 때문에 이 기능 또한 assign 단계에 흡수되었습니다.
output() 함수는 1.2.0 버전부터 지원되는 함수로 이전 버전의 FastPrint() 함수의 모든 기능을 포함하고 있습니다.
< 수행 동작 3단계 >
템플릿 문서 등록하기
define(템플릿명, 템플릿파일명)
이 부분은 함수 내부 동작에 있어서 FastTemplate와 후키템플릿 사이에 가장 큰 차이를 보이는 부분입니다. FastTemplate에서는 단지 템플릿명을 파일명으로 맵핑하는 것으로 define() 함수의 동작이 종료됩니다. 그러나 후키템플릿에서는 맵핑뿐만 아니라 파일로부터 템플릿 정보를 읽어들인 후 템플릿 구조 분석 및 템플릿 변수 분리 작업을 모두 수행하게 됩니다.
예를 들어 템플릿 정보가 저장된 파일이 "calendar.htm"이고 이를 메모리상에 올렸을 때의 템플릿을 "cal"이라는 이름으로 읽어들이고자 한다면 아래와 같이 코딩합니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); [/code]
버전 1.0.0부터 제안된 no-file용법을 이용하면 템플릿 파일 대신에 템플릿 변수가 포함된 HTML 소스가 저장된 문자열을 직접 지정할 수 있습니다.
템플릿 변수 할당하기
assign(템플릿변수명, 템플릿명)
assign(템플릿변수명, 블록명)
assign(템플릿변수명, 문자열)
템플릿 변수에 그 값을 할당하는 단계로서, 두 번째 인수로 지정되는 것이 무엇이냐에 따라 변수값 처리방법이 달라지게 됩니다.
변수값으로 지정될 수 있는 것은 3가지로 문자열, 템플릿명, 블록명이 올 수 있습니다.
문자열을 할당할 때
문자열을 지정할 때는 그 문자열 값이 그대로 변수값으로 할당됩니다. 이 문자열은 템플릿 변수가 포함되지 않은 HTML스크립트를 포함한 일반 문자열이어야 합니다.
assign(템플릿변수명, 문자열)
만약 템플릿 변수가 포함된 문자열을 처리해야 한다면, assign()이 아니라 define() 메소드를 이용하여 해당 문자열을 먼저 템플릿으로 등록하여야 합니다. 이 용법에 대하여는 "define()" 메뉴의 "no-file 용법" 항목을 참조 바랍니다.
템플릿명을 지정할 때
템플릿명을 지정하게 되면 해당 템플릿을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 첫 번째 인수로 지정된 템플릿 변수명에 할당합니다.
assign(템플릿변수명, 템플릿명)
블록명을 지정할 때
블록명을 지정하게 되면 해당 블록 내용을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 지정된 블록명에 해당하는 변수에 할당합니다.
각 블록에는 지정된 템플릿 변수가 미리 정의되어 있으며 이 변수명은 블록명과 동일합니다. 버전 0.0.1에서는 블록명을 지정할 때는 assign() 함수에 지정된 첫 번째 인수 템플릿 변수명은 사용되지 않는 무의미한 인수로 어떤 변수명을 지정하더라도 상관없으며 그냥 무시해버립니다.
assign(템플릿변수명, 블록명)
버전 0.0.2부터는 아래와 같이 템플릿 변수명을 반드시 블록명과 동일하게 지정하여야 에러메시지를 보지 않게 될 것입니다.
assign(블록명, 블록명)
버전 1.2.0부터는 템플릿 변수명을 블록명과 동일하게 지정하지 않아도 에러메시지를 발생시키지는 않습니다. 두번째 인자로 지정한 해당 블록의 처리 결과를 첫번째 인자로 지정한 변수에 저장합니다. 따라서 첫번째 인자와 두번째 인자로 지정된 이름이 다르게 되면 템플릿 문서 내의 해당 블록 위치에는 아무런 값도 나타나지 않을 것입니다.
앞장에서 살펴본 2001년 12월 달력을 예로 든다면 아래와 같이 템플릿 변수 "YEAR"과 "MONTH"에 해당값을 할당할 수 있을 것입니다.
[code php;gutter:false] $tpl->define('cal', 'calendar.htm'); $tpl->assign( array( 'YEAR' => '2001', 'MONTH' => '12', 'MAIN' => 'cal' ) ); [/code]
< >
템플릿 변수 출력하기
output(템플릿변수명)
assign() 함수를 통해 할당된 템플릿 변수값을 output() 함수를 통해 웹브라우저로 출력합니다. 1.2.0 이전 버전에서는 output() 함수 대신에 FastPrint() 함수를 이용하여야 합니다.
[code php;gutter:false] $tpl->output('MAIN'); [/code]

Posted by 방글24
phpsource/템플릿2006. 9. 20. 12:21
written: Jan 28 2002
last modified: Sep 20 2006
후키템플릿 1.0.0 버전에서 제안되었던 no-file 용법에 대한 문법적인 내용이 1.2.0 버전부터는 아래와 같이 수정되어 정식으로 제공됩니다. 1.2.0 버전에 포함된 NO파일(no-file) 용법은 1.0.0 버전부터 1.1.1p3 버전까지 제안되었던 용법과는 상당히 다르므로 이 용법을 사용하여 홈페이지 문서를 작성하셨던 분은 주의하시기 바랍니다.
NO파일(no-file) 용법이란
때에 따라서는 define() 메소드의 두 번째 인수인 템플릿 파일 대신에 rFastTemplate의 define_raw()와 같이 템플릿 변수가 포함된 HTML 소스가 저장된 문자열을 지정할 경우도 있을 것입니다. 이와 같이 파일이 아닌 문자열로부터 템플릿 변수가 포함된 HTML 소스를 직접 전달받는 기능을 NO파일(no-file) 용법이라 합니다.
이하 '템플릿 변수가 포함된 HTML 소스'를 '템플릿 문자열(template string)'이라고 칭하겠습니다.
define(템플릿명, 템플릿 문자열, 환경설정);
NO파일 용법에서는 위와같이 두번째 인수로 지정되는 템플릿 문서가 파일이 아닌 문자열로 지정됩니다.
1.0.0 버전에서 제안되었던 아래와 같은 형식은 더 이상 정상적으로 동작하지 않습니다.
define('상수:템플릿명', '템플릿 문자열');
define("$modified:템플릿명", '템플릿 문자열');
캐시 and 컴파일
NO파일 용법의 가장 큰 문제는 전달된 문자열의 내용이 변경되었는지 확인하기가 어렵다는 것입니다. 물론 문자열 전체를 검색하여 수정되었는지를 확인할 수도 있겠으나 이를 위해 문자열 전체를 캐시하기는 다소 어려움이 있습니다. 이와같이 NO파일 용법에서 문자열의 변경 여부를 확인하는 방법이 여의치 않아 1.0.0 버전에서는 지정된 캐시 갱신 여부를 사용자가 직접 지정하도록 하였으나 1.2.0 버전에서는 문자열이 변경되었을 때만 컴파일하도록 개선하였습니다.
NO파일 용법에서도 템플릿 파일의 경우와 마찬가지로 '템플릿 문자열'을 파싱한 내용이 캐시됩니다.
NO파일 용법에서 '템플릿 문자열'의 변경 여부를 확인하는데 문자열 전체를 비교하지는 않습니다. crc32 함수에 의한 checksum 기술에 의해 서로 비교합니다. 캐시에 기록된 checksum 값과 define 함수로 전달된 '템플릿 문자열'의 checksum 값을 비교하여 문자열의 변경여부를 판단합니다. 문자열이 변경되었다고 판단되면 변경된 문자열을 컴파일한 결과와 새로운 checksum 값이 캐시에 기록됩니다.
NO 캐시
만약 '템플릿 문자열'이 매번 변경되는 경우라면 '템플릿 문자열'에 대한 정보를 캐시할 필요가 없을 것입니다. 물론 캐시해도 문제가 발생하지는 않지만 매번 현페이지에 대한 캐시가 갱신되어야 하므로 약간의 시간을 손해보게 되겠지요. 그러므로 이 경우라면 아에 캐시를 하지 않도록 하는 것이 좋을 것입니다. 그러면 '템플릿 문자열'이 변경되더라도 현페이지에 대한 캐시를 갱신하지 않을 것입니다.
캐시하지 않기 위해서는 아래와 같이 define() 함수의 세번째 인자를 이용합니다.
define(템플릿명, 템플릿 문자열,
    array('cache_type' => HW_TPL_CACHE_NO)
);
define() 함수의 세번째 인자는 1.2.0 버전에서 새로 추가된 것으로 NO파일 용법뿐 아니라 기존의 file 용법에서도 사용할 수 있습니다.
이와 같이 'cache_type'에 상수 HW_TPL_CACHE_NO를 지정하면 '템플릿 문자열'의 컴파일 결과가 캐시되지 않으며 홈페이지 문서를 로딩할 때마다 매번 컴파일하게 됩니다.
기능적으로는 NO 캐시 용법을 제공합니다만 NO 캐시 용법은 다소 실행시간에 부담되는 용법이므로 가능하면 사용하지 않는 것이 좋습니다.
정적캐시(Static Cache) & 동적캐시(Dynamic Cache) ?
이전 버전에서는 하나의 홈페이지 문서에 하나의 캐시만 존재하도록 작성되어 있습니다. 하나의 문서를 생성하는데 여러 개의 템플릿 파일이 이용되더라도 하나의 캐시로 통합됩니다. 하나의 문서에 하나의 캐시를 생성하는 것이 관리상 편리할 수도 있겠으나 때에 따라서는 템플릿 파일별로 캐시가 작성되는 것도 유용할 것입니다.
이를 위하여 1.2.0 버전에서는 특정 홈페이지 문서에 고정적으로 따라다니는 정적캐시(Static Cache)와 홈페이지 문서와 관계없이 템플릿 파일별로 작성되어 홈페이지 문서에서 필요에 따라 동적으로 불러들일 수 있도록 작성된 동적캐시(Dynamic Cache)로 구분되어 동작합니다.
define() 함수의 세번째 인자인 배열의 첨자 'cache_type'을 지정하지 않거나 상수 HW_TPL_CACHE_STATIC를 지정하면 정적캐시(Static Cache)로 저장되며, 상수 HW_TPL_CACHE_DYNAMIC를 지정하면 동적캐시(Dynamic Cache)로 저장됩니다.
캐시디렉토리에 저장된 캐시파일명을 보면 이전 버전에서는 아래와 같았습니다. 웹루트에서 시작되는 파일명 'blog/index.php'에서 '/' 를 '@'로 치환한 후 '(캐시id).hcache.php'를 붙인 형태입니다.
blog@index.php(site_index).hcache.php
1.2.0 버전에서는아래와 같이 캐시파일명 형식이 변경되었습니다.
sn@site_index@blog@index.php.hcache.php
첫번째 문자 's'는 정적캐시(Static Cache)를 의미하고, 두번째 문자 'n'는 압축안함(no compressed cache)를 의미하고, 'site_index'은 캐시id를 의미하고, blog@index.php는 파일명 'blog/index.php'을 의미하고 'hcache.php'는 후키캐시 클래스에서 사용하는 첨자입니다.
동적캐시(Dynamic Cache)의 경우에는 첫문자가 'd'로 기록됩니다.
URL 리디렉션(URL redirection)
$tpl->define(템플릿명, 템플릿 문자열);
위와같은 문장에서 '템플릿 문자열'에 포함된 상대경로는 생성자에서 지정한 템플릿 기본 디렉토리을 기준으로 자동 변경됩니다. 기본 디렉토리가 여러 개 있을 때는 처음 지정된 디렉토리를 기준으로 변경됩니다.
1.1.1 버전부터는 아래와 같이 define 함수에서 기본 디렉토리를 직접 지정할 수 있었습니다. 예를 들어, './templates/abc'를 기본 디렉토리로 지정하려면 아래와 같이 작성할 수 있습니다.
$tpl->define(':템플릿명:./templates/abc', '템플릿 문자열');
$tpl->define(':템플릿명:./templates/abc', '템플릿 문자열');
즉, 템플릿명 뒤에 콜론(:)을 찍고 그 뒤에 기본 디렉토리를 지정하면 됩니다.
1.2.0 버전에서도 define() 함수에서 기본 디렉토리를 지정할 수 있으나 1.1.1 버전과는 다른 형식을 가지고 있습니다.
define(템플릿명, 템플릿 문자열,
    array('template_dir' => './templates/abc')
);
즉, cache_type을 지정할 때와 같이 define() 함수의 세번째 인자를 이용하며 배열인자의 첨자는 'template_dir'입니다. 존재하지 않는 디렉토리이거나 디렉토리 내에 있는 파일명까지 지정하면 에러가 발생합니다.
예제(example)
아래와 같이 작성된 소스를 살펴보지요.
[code php;gutter:false] $nofile_test1 = '{TEST}NO캐시'; $nofile_test2 = '{TEST}정적캐시'; $nofile_test3 = '{TEST}동적캐시'; $nofile_test1_config = array( 'cache_type' => HW_TPL_CACHE_NO ); $nofile_test2_config = array( 'cache_type' => HW_TPL_CACHE_STATIC, 'template_dir' => './templates/abc' ); $nofile_test3_config = array( 'cache_type' => HW_TPL_CACHE_DYNAMIC, 'template_dir' => './templates/abc' ); $tpl->define('nofile_test1', $nofile_test1, $nofile_test1_config); $tpl->define('nofile_test2', $nofile_test2, $nofile_test2_config); $tpl->define('nofile_test3', $nofile_test3, $nofile_test3_config); $tpl->assign('TEST', 'Static / Dynamic / No Cache ? => ' . ''); $tpl->assign('NF_test1', 'nofile_test1'); $tpl->assign('NF_test2', 'nofile_test2'); $tpl->assign('NF_test3', 'nofile_test3'); $tpl->output('NF_test1'); $tpl->output('NF_test2'); $tpl->output('NF_test3'); [/code]
위 소스를 실행하게 되면 아래와 같은 결과를 얻게 됩니다.
Static / Dynamic / No Cache ? => NO캐시
Static / Dynamic / No Cache ? => 정적캐시
Static / Dynamic / No Cache ? => 동적캐시
템플릿 문자열 $nofile_test1는 캐시되지 않으며, 템플릿 문자열 $nofile_test2는 정적캐시에 포함되어 저장될 것이며, 템플릿 문자열 $nofile_test3는 현재 실행 스크립트가 '/blog/index.php'라면 아래와 같이 동적캐시가 작성될 것입니다.
dn@nofile_test3@blog@templates@abc.hcache.php

Posted by 방글24
phpsource/템플릿2006. 9. 20. 11:57
written: Jan 28 2002
last modified: Sep 20 2006
사용방법을 알기 전에 우선 후키템플릿에서 사용하는 용어에 대하여 정리해 보겠습니다. 물론 이 용어들은 그 용도에 따라 여러가지로 정의될 수 있을 것입니다. 따라서 여기에서 정의한 용어들은 템플릿툴인 후키템플릿을 이용할 때를 기준으로 설명된 것임을 염두에 두기 바랍니다.
템플릿(template)
일반적인 의미에서 템플릿이란 무엇인가를 만들 때 안내역할을 하는데 사용되는 형식(꼴), 틀 또는 모형 등을 의미합니다. 예를 들어 표준화된 두문이나 미문이 들어있는 문서도 일종의 템플릿인데, 이를 복사한 뒤 변동이 있는 부분만을 채워서 문서를 완성할 수 있습니다. 또한 플로우차트에 사용되는 각종 부호를 잘 그릴 수 있도록 만든 모양자도 템플릿이라고 부릅니다. - (텀즈의 정의;www.terms.co.kr)
PHP는 HTML 내부에 PHP 명령어를 삽입할 수 있도록 허용함으로서 동일한 문서에서 데이터를 다양하게 변화 시켜가면서 보여줄 수 있습니다. 이와 같이 변화무쌍한 HTML 문서를 생성할 수 있다는 것은 PHP와 같은 서버 사이드 스크립트의 장점이기는 하지만 문서가 조금만 복잡해 진다면 PHP 코드와 HTML 태그가 혼재되어 있어 매우 혼란스럽기도 하며, 또한 도무지 전체 흐름이 파악하기가 쉽지 않습니다. 그 외에도 웹사이트가 복잡해 지다보면 PHP코드와 HTML이 혼합하는 방식으로는 관리하기도 어렵고, 향후 홈페이지를 수정하는 것도 무척이나 고달픈 작업이 되기 마련입니다.
그래서 웹사이트 규모가 커지게 되면 서버사이드 스크립트에서 수행할 PHP 코드와 웹브라우저 화면의 인터페이스를 담당하게 될 HTML 태그를 분리하기 시작하게 됩니다. HTML 태그는 주로 화면 디자인 및 정적 데이터를 나타내는데 사용되며, 반면 PHP 코드는 디자인된 화면에 들어갈 동적 데이터를 생성하는 일을 담당하게 됩니다. 여기에서 PHP 코드에서 완전히 분리되어 HTML로 작성된 코드를 템플릿이라 합니다. 우리가 잘 알고 있는 달력을 예를 들어 설명하겠습니다. 아래는 2001년12월 달력을 나타낸 것입니다.
2001년 12월
             1 
 2   3    4    5    6    7    8 
 9  10   11   12   13   14   15 
16  17   18   19   20   21   22 
23  24   25   26   27   28   29 
30  31            
이 예제에서 PHP 코드와는 독립적으로 작성될 수 있는 템플릿을 분리해 낸다면 아래와 같이 될 것입니다. 이러한 템플릿은 나모 웹에디터와 같은 툴을 이용하면 아주 편하고 쉽게 작성될 수 있을 것입니다.
    년  월
             
             
             
             
             
             
템플릿에 들어갈 데이터는 PHP 코드를 이용하여 년도와 달에 맞는 데이터를 생성하여 채워 넣게 됩니다.
파일명을 가지고 파일을 구분하는 것과 같이 메모리에 올려진 템플릿도 템플릿명(template name)을 가지고 구분하게 되지요. 그런데 이 템플릿이 대부분 파일로부터 읽혀지는 관계로 템플릿명을 파일태그(file tag) 또는 파일핸들(file handle)이라는 용어로도 사용됩니다.
템플릿 변수(template variable)
PHP 코드로 생성된 데이터를 템플릿에 채워 넣기 위해서는 템플릿과 PHP 코드사이에 해당 데이터를 다른 데이터와 구분하여 인식할 수 있는 이름이 필요하게 됩니다. 위의 예제를 통해 년과 월을 구분하는 경우를 예를 든다면 아래와 같을 것입니다.
{YEAR}{MONTH}
 ...  ...  ...  ...  ...  ...  ...
위와 같이 템플릿을 작성하였다면, 아래와 같이 PHP 코드에서 {YEAR}과 {MONTH}를 "2001"과 "12"로 설정할 수 있습니다.
[code php;gutter:false] $tpl = new hTemplate(); . . . $tpl->assign('YEAR', '2001'); $tpl->assign('MONTH', '12'); [/code]
< 템플릿을 이용한 홈페이지 구성 >
이제 템플릿을 출력할 때 {YEAR} 부분은 "2001"로 대치되고 {MONTH}부분은 "12"로 대치되어 그 결과 아래와 같이 템플릿 내용이 수정되어 출력될 것입니다.
200112
 ...  ...  ...  ...  ...  ...  ...
여기서 템플릿에 표시하는 {YEAR}, {MONTH}와 같은 템플릿 변수는 템플릿툴에 따라 다소 다르게 표시될 수 있습니다. 후키템플릿에서는 보는 바와 같이 템플릿변수를 템플릿 파일 내에서는 중괄호로 둘러싸도록 하고 있으나 PHP 코드 내에서는 중괄호 없이 사용합니다.
이와 같이 템플릿에 포함된 {YEAR}, {MONTH}을 템플릿에 삽입되는 변수라는 의미에서 템플릿 변수라고 부르며 다른 내용과 구분하여 템플릿 변수를 나타내기 위한 시작 및 종료기호 "{", "}"를 템플릿 태그라고 합니다.
기본형 : {변수명}
확장형 : <!--{변수명}-->
템플릿명을 파일핸들이라고 부르는 것과 같이 템플릿 변수를 변수핸들(variable handle)이라고도 부릅니다.
템플릿을 템플릿 변수와 관련지어 정의한다면 결국 템플릿이란 템플릿 변수가 포함된 HTML 문서라고 할 수 있습니다.
템플릿 파일(template file)
위에서 설명한 템플릿이 HTML 텍스트 형식의 별도의 파일로 저장된 형태를 템플릿 파일이라 합니다. 이 파일이 PHP 문서에 의해 메모리로 올려지면 템플릿이 되는 것이지요. 템플릿툴에 따라 메모리에 올려진 템플릿 자료구조는 여러가지 형태를 가지게 됩니다. 템플릿 파일로부터 읽혀진 상태 그대로의 문자열일 수도 있고 아니면 PHP 문서에서 사용하기 편리하도록 구성된 배열일 수도 있습니다. 후키템플릿에서는 템플릿 파일을 분석하여 그 결과를 배열에 기록하고 있습니다.
템플릿 NO파일(template no-file)
이와 같이 템플릿의 원소스는 HTML 텍스트 파일의 형식으로 작성되는 것이 보통이지만 때로는 DB 등에 저장되어 관리될 수도 있을 것입니다.

Posted by 방글24
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