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