wilson's story

PHP템플릿 본문

PHP

PHP템플릿

wilson 2008. 1. 8. 02:26
반응형

템플릿에 대한 정의와 사용


ERIC.2002.06.01

템플릿의 사용 1

템플리트 대한 개인적인 사용법 몇가지..

템플리트 혹은 템플레이트(Template) 는 형판..틀 이런 뜻일겁니다. 웹프로그램에서의 일반적 의미는HTML 과 프로그램과의 분리를 위해 만들어 놓은 프로그램을 말할겁니다. 웹프로그램을 위해서는 아직까지 HTML 을 빼놓을수가 없는데 프로그램 속에 이 html 코드의 출력물과 프로그램의 소스가 공존하는것이 일반적인 형태의 소스들입니다.

하지만 이렇게 제작된경우에는 추후 화면의 수정작업이 필요로 할때 프로그램 내의 html 출력부분을 수정하여야 하며 코드량이 늘어나거나 복잡할경우 판독이 어려울때가 많습니다. 그리고 프로그래뭐가 html 코드까지 전부 넣어야 하므로 곤란할경우가 생길수 있으며 웹디자이너 생각한 모든것을 넣어주지 못할경우도 생깁니다.

바로 이런 문제점들과 관리의 용이성을 위해서 html 출력물과 소스의 코드 작업을 분리시켜줄 필요가 생겼으며 이런 기능을 해주는 것이 템플리트 라는 소스입니다. 우리가 흔히 접하는 게시판,메모장의의 스킨기능도 템플리트를 이용 한다면 간단하게 만들고 구현할수 있습니다.

소스의 배포형태는 클래스의 형태가 대부분이며 복잡한 많은 기능이 필요하지 않다면 개인적으로 빠르게 돌아가는 템플리트를 만들어도 무방하다고 생각합니다. PERL 에서는 예전부터 나오던 많은 템플리트들이 있지만 php 에서는 그렇게 많지가 않습니다. 시간이 지나면 다른 템플리트도 많

이 나올것으로 예상합니다. 현재 많이 쓰이는 php 템플리트는 FastTemplate, EasyTemplate, phplib 에서의 템플리트기능 정도가 될것입니다. 사용법이나 기능은 서로 비슷합니다만 이중 가장빠른것은 FastTempate 입니다. 국내에서도 phpclass 에서 만든 유닛테이블이 있습니다. 이것역시 빠른속도를 가지고 있습니다.

현재 가장많이 사용되는 FastTemplate 에 대해서 몇가지 아는대로 설명하고자합니다. 원래 이런글에는 약한지라..그리고 아는것이 적은지라 잘못된 것이 있다면 저기 위에 보이는 Contact_us 에다가 남겨주시면 감사하겠습니다.

FastTemplate 는 원래 perl 버전으로 예전에 나온것을 php 로 포팅한 것입니다. 그리고 이것의 사용법에 대해서는 소스를 풀어보시면 몇가지 간단한 예제가 포함되어져 있습니다. 그리고 professional php 라는 책의 22 장 정도에 설명되어져 있습니다. 관심있으신분은 해당자료를 먼저 읽어 보시는것이

도움이 될것입니다.

생각보다 글이 길어 졌네요. 몇 부분으로 나누어서 제가 아는 몇 안되는것을 적어보고자합니다. 1부라고하나 1편이라고 하나.. 하여튼 여기서 그만하고 다음장에서 설치및 기초사용에 대하여 말해 보겠습니다.


템플릿의 사용 2

이번장에서는 구조에 대한 간단한 설명과 실제적인 사용법에 대해서 조금 적어볼려고 합니다. FastTemplate 는 사용법에 기본적인 구조를 가지고 있고 이 규칙에 의해서 사용되어 져야 하는데

1 FastTemplate 의 인스턴트

2.define (정의)

3.assign (할당)

4.parse (구문해석)

5.print 또는 fetch (출력또는 다른 변수로 저장)

의 순으로 구성됩니다. 위의 규칙은 하나의 하나의 템플릿에서 해당하는 규칙이며 코드 중간쯤에 다른 템플릿을 또 정의하여 사용할수도 있습니다. 실제적인 간단한 사용법에 대해서 말해 보겠습니다.

소스에 포함되어져 있는 예제 파일입니다.

// Example FastTemplate Demo #1 - The example from the man page

Header("Content-type: text/plain");

include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");

$tpl->define(

array(

main => "main.tpl",

table => "table.tpl",

row => "row.tpl"

)

);

$tpl->assign( array( TITLE => "FastTemplate Test") );

for ($n=1; $n <= 3; $n++)

{

$Number = $n;

$BigNum = $n*10;

$tpl->assign(

array(

NUMBER => $Number,

BIG_NUMBER => $BigNum

)

);

$tpl->parse(ROWS,".row");

}

$tpl->parse(MAIN, array("table","main"));

$tpl->FastPrint();

exit;

?>



example1.phtml 에 있는 파일입니다.

제일 첫줄인 Header("Content-type: text/plain"); 부분은 mime 타입을 표시하는 부분입니다.

include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");


부분은 실질적인 템플리트프로그램인 class.FastTemplate.php3 을 include 시키는 부분이고 $tpl = new FastTemplate("./templates"); 클래스를 사용하기위해 인스턴트 $tpl 에 인스턴트 시키는 부분입니다. 이때 .templates 라는것은 템플리트 파일이 들어있는 디렉토리를 적어주면 됩니다. 여기서는 template 라는 디렉토리가 기본 템플리트 파일이 들어 있는 디렉토리입니다.

$tpl->define(

array(

main => "main.tpl",

table => "table.tpl",

row => "row.tpl"

)

);


다음부터는 $tpl 을 통해서 접근할수 있습니다.

부분은 템플리트 파일을 정의하는 부분이입니다. 1편의 내용대로 템플리트는 html코드와 프로그램을 완벽히 분리시킬수가 있다고 했는데 이 html 코드 부분의 파일을 정의하여 주어 다음에 이파일을 이용하여 html 코드를 사용할수 있도록 해주도록 정의하는 부분입니다. 배열로 구성되어져 있으며 하나에서부터 여러개의 템플리트 파일을 정의해줄수 있습니다. 현재 3개의 템플리트 파일로 구성되어져 있습니다

$tpl->assign( array( TITLE => "FastTemplate Test") );

TITLE 라는 템플리트 변수에 FastTemplate Test 를 할당하는 것입니다. 여기에는 다른 코드에서의 결과값을 넣어도 되고 물론 변수로 적어주어도 무방합니다. 예를 들면

$a = "FastTemplate Test";

$tpl->assign( array( TITLE => $a) ); //형태로도 사용가능합니다..

for ($n=1; $n <= 3; $n++)

{

$Number = $n;

$BigNum = $n*10;

$tpl->assign(

array(

NUMBER => $Number,

BIG_NUMBER => $BigNum

)

);

$tpl->parse(ROWS,".row"); }



{NUMBER} {BIG_NUMBER}

부분은 1에서 3까지 그리고 각각에 10을 곱한 숫자결과를 템플리트 사용하여 보여주기 위해서 계산하는 부분과 파싱하는 부분이 들어 있습니다. NUMBER 에는 각 1~3 숫자가 BIG_NUMBER 에는 각 숫자의 10을 곱한 숫자가 할당됩니다. row.tpl 의 내용을 보면


1 10
2 20
3 30

부분에서 NUMBER 에 해당하는 1~3 숫자가 그리고 BIGNUMBER 에는 10,20,30 이라는 숫자가 할당되어져 있고. 이것이 해석된것이 템플릿 변수 ROWS 에 들어 갑니다. 그런데 자세히 보면 .row 처름 앞에 "." 이 붙어져 있습니다. 이것은 결과값이 템플릿 변수 ROWS 에 덧붙여져서 저장됩니다. 마치 for $a .= $b 의 형태처름 $b 가 $a 에 덫붙여져서 저장됩니다. 이 for 문의 결과로 저장된 결과값은

이 ROWS 에 저장되어져 있을겁니다. 이것은 table.tpl 에서

{ROWS}


에서 {ROWS} 에 쓰입니다. $tpl->parse(MAIN, array("table","main")); 부분은

{MAIN}


main.tpl 파일에서 table 과 main 으로 정의했던 부분을 이용해서 main.tpl MAIN 이라는 템플리트템플리트변수를 이용하여 해석해주는 부분입니다.

$tpl->FastPrint();

부분은 가장최근에 파싱된것을 기초로 출력을 시키는 부분입니다.

row.tpl 의 내용 ---> table.tpl ---> main.tpl 로 결과가 블록으로 저장되어 최종 결과인 main.tpl 의 결과가 출력되는 형태입니다. 이로써 간단하지만 완벽한 템플리트 소스를 만들었습니다.

복잡해 보이지만 구조를 이해 한다면 정해진 규칙대로 사용한다면 다음부터는 쉽게 코드를 만들어 낼수 있을겁니다. 다음에는 다른 예제파일을 이용하여 하나더 하고 다음에는 FastTemplate 를 이용한 다이나믹 블록을 사용하는 부분을 설명해 볼까합니다.. 하여튼 이로써 2편이 대충끝났네요.























템플릿의 사용 3

소스는 아래와 같습니다.

include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");

$start = $tpl->utime(); // Benchmarking

$tpl->define(

array(

header => "header.tpl",

body => "middle.tpl",

footer => "footer.tpl"

)

);

$tpl->assign( array(

TITLE => "FastTemplate Demo2",

HEAD1 => "FastTemplate Page Demo",

TD1 => "Column 1",

TD2 => "Column 2",

TD3 => "Cool Stuff",

TD4 => 'Cooler

Stuff',

MAILTO => 'cdi at

thewebmasters.net',

LINK

=> 'www.thewebmasters.net/php/',

LINKNAME => 'The WebMasters Net'

) );

$tpl->parse(HEAD, "header");

$tpl->parse(BODY, "body");

$tpl->parse(FOOT, "footer");

// $tpl->clear(array("HEAD","BODY")); // Uncomment this to see

how

// the class handles errors

$tpl->FastPrint("HEAD");

$tpl->FastPrint("BODY");

$tpl->FastPrint("FOOT");

$end = $tpl->utime();

$runtime = $end - $start;

echo "Completed in $runtime seconds
\n";

exit;

?>



이번에는 템플릿 예제2번을 가지고 한번 설명해볼까 합니다. 이번의 예제는 3개의 템플릿 파일을 템플릿 파일로 정의하여 주고 이것을 각각 순서대로 출력하는 방식입니다. 복잡한 구조가 없으며 각각의 템플릿 파일은 따로따로 작동하는것이랑 같습니다. 머릿말 꼬릿말 중각 결과를 출력하고자 할때 좋은 방식입니다.

include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");


부분은 템플릿 파일을 include 하여 그안에 정의된 클래스를 사용가능하게 하는 문장하고 $tpl 이라는 곳에 템플릿 파일이 있는 경로인 templates 디렉토리를 설정하여주면서 동시에 인스턴트 시킵니다.

이제 $tpl 이라는 것을 가지고 핸들링 할수 있습니다. 물론 변수명이야 다르게 주어도 상관없습니다..

$start = $tpl->utime(); // Benchmarking

이것은 화면출력시간을 측정하기 위해서 넣은 줄입니다. 제 생각엔 소스의 제일 처음에 넣어야 할거 같은데... 그리고..

$tpl->define(

array(

header => "header.tpl",

body => "middle.tpl",

footer => "footer.tpl"

)

);


그전 컬럼에 썼듯이 define 하는 부분입니다. 3개의 파일을 정의합니다.

구조는 templates 디렉토리에 header.tpl middle.tpl footer.tpl 의 3개 파일이 있어야 합니다.

$tpl->assign( array(

TITLE => "FastTemplate Demo2",

HEAD1 => "FastTemplate Page Demo",

TD1 => "Column 1",

TD2 => "Column 2",

TD3 => "Cool Stuff",

TD4 => 'Cooler

Stuff

',

MAILTO => 'cdi at

thewebmasters.net',

LINK

=> 'www.thewebmasters.net/php/',

LINKNAME => 'The WebMasters Net'

) );


이 부분은 define다음에 오는 assign 구절입니다.. 템플릿 변수를 할당하여 주는 부분입니다. 순서는 상관이 없습니다.. header.tpl 에 나오는 {TITLE} 부분에 FastTemplate Demo2 라는 글씨가 들

어 간다는 말입니다.. 다른 부분도 마찬가지 입니다.. 그리고..

$tpl->parse(HEAD, "header");

$tpl->parse(BODY, "body");

$tpl->parse(FOOT, "footer");

위에 템플릿 변수에 할당을 해준것을 기초로 parsing 합니다. 이것으로 완성된 html 문장이 각각 HEAD , BODY , FOOT 안에 들어 있습니다.

$tpl->FastPrint("HEAD");

$tpl->FastPrint("BODY");

$tpl->FastPrint("FOOT");

각각의 템플릿 핸들러에 들어 있는 값을 가지고 출력을 시키는 부분입니다. 다른 페이지에서 템플릿핸들러 이용하는 것이 없이 따로따로 순서에 맞게 출력시킵니다. 물론 출력을 바꿔서 할수도 있을겁니다.

$end = $tpl->utime();

$runtime = $end - $start;

echo "Completed in $runtime seconds
\n";

exit;

페이지의 시작 그리고 끝 나는 시간을 빼서 중간에 걸린시간을 보여주는 부분입니다. 저번 강좌를 조금 이해하신분이라면 이번것은 쉽게 넘어 갈수 있었을겁니다. 다음번에는 dynamic template 예제를 가지고 실제로 게시판 방명록 등에서 쓰일수 있는 것에 대해 올려 볼까합니다.

읽어주셔서 감사..

템플릿의 사용 4

Column 이 올라오는 간격이 너무 뜸한거 같으네요 다음부터는 조금 속도를 내볼까 합니다. 컬럼이라는것이 늘 그렇듯이 고수님들이 보시면 다 아는걸... 하시겠지만 그래도 아직 모르는분이 계실거 같고 필요할거 같고해서 써보는건데 문건에 문제가 있는 부분은 게시판이나 메일주세요..

이번엔 동적템플리트에 대해서 이야기 해볼까 합니다. 동적템플리트라는 것은 이때까지의 2개의 예제에서 보았던거와는 조금 다르게 템플리트 파일의 정의부분에 차이가 있습니다. 그리고 템플리트 파일도 차이가 있습니다.

소스에 포함되어져 있는 dynamic.tpl 은 첫번째 예제로 들었던것을 동적템플릿으로 처리한것입니다. 결과물은 똑같습니다. 차이점은 첫번째의 예제에서는 여러개의 템플릿파일이 필요했습니다. 하지만 동적템플리트를 이용한다면 하나의 파일안에서 여러개의 파일을 이용할것과 같은 효과를 발휘할수 있습니다. 파일갯수가 줄어들어 휠씬 깔끔하고 나중에 템플릿파일을 보아도 이해도가 높습니다.(물론 저의생각) 설명이 장황하지만 실제로 보면 그렇게 어렵지 않습니다.

먼저 예제파일을 가지고 한번 해보겠습니다. 파일은 소스파일 dynamic_example.phtml 과 템플릿파일 dynamic.tpl , main.tpl 입니다.

Header("Content-type: text/plain");

include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");

$start = $tpl->utime();

$tpl->define(

array(

main => "main.tpl",

table => "dynamic.tpl"

)

);

$tpl->define_dynamic ( "row", "table" );

$tpl->assign( array( TITLE => "FastTemplate Dynamic Test") );

for ($n=1; $n <= 3; $n++)

{

$Number = $n;

$BigNum = $n*10;

$tpl->assign(

array(

NUMBER => $Number,

BIG_NUMBER => $BigNum

)

);

$tpl->parse(ROWS,".row");

}

$tpl->parse(MAIN, array("table","main"));

$tpl->FastPrint();

$end = $tpl->utime();

$run = $end - $start;

echo "Runtime [$run] seconds
\n";

exit;

?>


그리고 dynamic.tpl 파일의 내용입니다.

{NUMBER} {BIG_NUMBER}


먼저 dynamic_example.phtml 파일을 보겠습니다. main.tpl 파일은 따로 쓰지 않겠습니다. 길어지는 관계로.. 1번 예제를 참고하셔도 좋겠네요.

include("class.FastTemplate.php3");

FastTemplate.php3 파일을 include 시킵니다. 다음에 사용하겠다는 이야기겠죠..

그리고 $tpl = new FastTemplate("./templates");

$tpl 에다가 ./template 라는 디렉토리에 템플릿파일이 있다는것을 알려주면서 인스턴트 시킵니다.

다음부터는 $tpl 을 가지고 사용하겠지요

$tpl->define(

array(

main => "main.tpl",

table => "dynamic.tpl"

)

);

두개의 파일을 사용하겠다고 정의하는 부분입니다. dynamic.tpl 파일이 1번 예제에 있던 두개의 파일을 하나로 합친것입니다.

$tpl->define_dynamic ( "row", "table" );

주의깊게 보아야할부분입니다. 이부분이 다른일반 템플릿과는 다른 부분중 하나입니다. dynamic.tpl 부분중


{NUMBER} {BIG_NUMBER}

부분이 있습니다.

여기서 부분의 "row" 라고 한부분이 눈에 뜁니다. 그리고 이부분으로 끝납니다 내용은 그안에 ... 이정도로 감잡은신 분이 많을줄 압니다. 그 사이의 부분을 하나의 템플리트 파일이 따로있는것처럼 사용하는것입니다. 이 부분을 따로 파일로 처리했던 1번예제와 다른 부분입니다.

그런데 무조건 이렇게 써넣는다고 템필릿 프로그램이 알아먹을수는 없습니다.

부분중 row 라고 적어분 부분이 바로 동적템플리트로 정의해준 $tpl->define_dynamic ( "row", "table" ); 의 row 와 변수명이 같아야 한다는 것입니다.

그리고 내용... 이런 형식으로 써줘야 한다는 것입니다.

$tpl->assign( array( TITLE => "FastTemplate Dynamic Test") );

TITLE 라는 템플릿 변수에 FastTemplate Dynamic Test 문구를 넣었습니다.

for ($n=1; $n <= 3; $n++)

{

$Number = $n;

$BigNum = $n*10;

$tpl->assign(

array(

NUMBER => $Number,

BIG_NUMBER => $BigNum

)

);

$tpl->parse(ROWS,".row");

}


그리고 이부분은 for 문에서 html 문구가 쌓이는 부분입니다. 1번의 예제랑 동일합니다.

그리고 $tpl->parse(MAIN, array("table","main")); MAIN 이란 템플릿 변수로 구문해석을 바로 했습니다. 즉 2개의 템플릿파일만 있어도 3개의 템플릿파일이 있는것이랑 동일한 효과를 발휘하므로 더욱 간단해 졌습니다.

$tpl->FastPrint();

$end = $tpl->utime();

$run = $end - $start;

echo "Runtime [$run] seconds
\n";

exit;

그리고 가장최근 템플릿변수로 등록된것을 출력시킵니다. 여기서는 MAIN 이겠지요 그리고 시간측정하여 출력시키고 끝나네요.. 위의 소스는 특별히 동적템플릿의 작동방법에 대해서만 이해 했다면 결코 어려운 부분 은 없을겁니다.

실제로 방명록 게시판을 제작하다보면 이보다는 더욱 복잡하겠지만 동적템플릿의 확장일뿐 다른 특별한 부분이 들어 가지 않아도 충분할것입니다.

동적템플릿을 사용하느냐 아니면 일반템플릿으로 처리하느냐는 선택의 문제인거 같습니다 결국은 코딩하시는 분의 스타일이겠지요.

게시판에서 리스트 출력부분을 대략적으로 템플릿으로 하자면..







include("class.FastTemplate.php3");

$tpl = new FastTemplate("./templates");

$tpl->define(

array(

MAIN => "dynamic.tpl"

)

);

$tpl->define_dynamic ( "row", "table" );

//이쯤에서 데이타베이스에서 출력할부분만 가져오는 것이 필요

$result = mysql_query("select **~~ limit XX");

for ($n=1; $n <= 15; $n++) //15 개정도로 대충...짤라봅니다.

{

$row_array = mysql_fetch_row($result) ;

$tpl->assign(

array(

TITLE =>$row_array[title], // 제목

COUNT => $row_array[count], // 조회수

MDATE =>$row_array[date], // 등록일

MNUM =>$row_array[mnum] // 고유번호 .. 여러가지가

있을수 있겠지요.

)

);

$tpl->parse(ROWS,".row");

}

$tpl->parse(MAIN, array("table","main"));

$tpl->FastPrint();

?>


출력하고 끝입니다... 템플릿파일은 따로 작성을 해야겠지요 위의 내용을 토대로해서.. 이렇게도 쓸수있다는거지 이대로 쓰면 .... 워낙에 글을못쓰는지라 소스만 보는것보다 설명을 보면 더 헤깔릴수 있겠네요..허허.. 담에는 써보면서 알게된 잡다한것들을 몇가지 써보고 템플릿은 끝낼까 하네요 읽느라 수고...

템플릿의 사용(마지막)

이번엔 저 나름대로 사용하는 방법에 대해서 몇가지 적어볼까 합니다. 메뉴얼에 대부분의 내용이 있으며 단지 그것을 이용하는 방법일 뿐입니다. 저는 $tpl->fetch 를 자주 사용하는 편인데 이유는 바로 출력할 필요없이 변수에 넣어 두었다가 필요할때 꺼내 쓸수도 있고 또한 이것을 다른 템플

릿 변수에 넣을수도 있고 해서 그렇게 쓰고 있습니다.

예를 들어 볼까 합니다.

$tpl->parse(CONTENT, "main");

$content = $tpl->fetch("CONTENT");

print $content; // print to STDOUT

fwrite($fd, $content); // write to filehandle

?>


메뉴얼에 있는 예제 입니다.

1 정의

2. 할당

까지 하고 구문해석을 했다고 칩니다. 여기서는 CONTENT 라는 템플릿 변수를 이용하였습니다. 이것을 그냥 출력을 해야할때가 있을수 있겠고 그렇지 않고 그 내용을 파일로 남겨야 하던지 아니면 다른 템플릿 변수로 이용할수 도 있습니다.

위의 예제처럼 fetch 로 변수 $content 로 받아서 print 함수로 출력을 하였고 또한 위의 소스에는 언급이 안되었지만 $fp 라는 파일포인터를 이용하여 파일에 남겼습니다.

그리고 이렇게도 쓸수가 있겠네요

$tpl->parse(CONTENT, "main");

$content = $tpl->fetch("CONTENT");

print $content; // print to STDOUT

fwrite($fd, $content); // write to filehandle

$tpl -> assign(array ( MAIN => $content) ); <-------

?>


화살표를 한 부분에서 처럼 다른 템플릿 변수로 할당을 했습니다. MAIN 이라는 템플릿 변수를 다음에 구문해석을 할때 쓰일수 있을겁니다. 물론 바로 출력하는것 보다는 메모리의 효울성 면에서 떨어질지는몰라도 쓰일데가 있을겁니다.

그리고 FastTemplate.php 파일의 처음에 보면 갖가지 설정파트가 있습니다. 여기서 win32 사용자를 위한 설정 strict 에 관한 설정등 다양한 설정이 있습니다. 개인의 환경에 맞게 설정을 할필요가 있을겁니다.

처음 코딩할때는 strict 부분을 true 로 해놓고 에러메세지를 보아가면서 코딩을 하고 소스가 완성이 된다음에는 false 로 헤서 에러가 나도 화면상 나타나지 않도록 해서 사용하는것이 좋을듯 합니다. 물론..소스의 초반에 $tpl->no_strict(); 로 똑같은 기능을 할수가 있지만 디폴트 값은 strict 로 되어 있습니다.

실질적인 사용법에 대한 글을 좀 많이 써볼까 했는데 써보려 하니 생각나는 것들이 얼마 없네요..

하여튼 여기서 템플릿트의 컬럼을 마무리 할까 합니다. 기타 질문이나 자료를 올려주세요..

읽어주셔서 감사합니다.



출처: http://blog.naver.com/toskywalker?Redirect=Log&logNo=100002973481
반응형