written: Jan 28 2002
last modified: Sep 20 2006
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
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
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을 수정하지 않더라도 그대로 이용할 수 있어 유용하리라 생각합니다. 혹시 이 기능으로 말미암아 예측하지 못했던 부작용이 발생될 수도 있으니 이러한 경우를 만나게 되면 꼭 알려주세요.
'phpsource > 템플릿' 카테고리의 다른 글
{후키템플릿}7.7.복수 템플릿파일의 용법 (0) | 2006.09.20 |
---|---|
{후키템플릿}7.6.웹문서 리디렉션 (0) | 2006.09.20 |
{후키템플릿}7.3.논리 부정 연산자 (0) | 2006.09.20 |
{후키템플릿}7.1.반복문 (0) | 2006.09.20 |
{후키템플릿}6.3.멤버 템플릿변수 (0) | 2006.09.20 |