php - smarty 간편 설치 및 테스트

설치.
1. http://smarty.php.net/download.php 에서 다운 받아 푼다.
2. libs폴더를 php설치 폴더에 복사한다. (libs를 smarty로 이름바꾸기를 권장.)
3. 아래와 같이 복사된 폴더의 페스를 php.ini 파일에 추가한다.
include_path=".\;F:\...중략.....c:\php\smarty\"
4. iis제부팅.

테스트
1. 압축을 푼 폴더 밑에 있는 demo를 웹루트에 복사한다.
2. demo폴더 밑에 있는 templete_c폴더를 iis프로세스가 저장할 수 있게 셋팅한다.
3. 웹페이지에서 demo폴더 밑의 파일에 접근한다.

*기억 나는대로 적은 거라 빠진 사항이 있을 수 있음.

written by NaHyunJae(http://j.finfra.com)
copyright NaHyunJae(http://j.finfra.com) All Rights Reserved

Posted by 나현재

2004/12/09 20:04 2004/12/09 20:04
,
Response
0 Trackbacks , 0 Comments
RSS :
http://j.finfra.com/tt/rss/response/153

펌]PHP- Smarty Crash Course

출처-smarty manual

Crash Course

For those of you who have used PHP template engines, the basic concepts of Smarty should look quite familiar. In your PHP application you assign variables for use in the template, then you display it.

index.php
include('Smarty.class.php');// create object$smarty = new Smarty;// assign some content. This would typically come from// a database or other source, but we'll use static// values for the purpose of this example.$smarty->assign('name', 'george smith');$smarty->assign('address', '45th & Harris');// display it$smarty->display('index.tpl');

The template file then contains the output interspersed with tags that Smarty replaces with assigned content.

index.tploutput
<html><head><title>User Info</title></head><body>User Information:<p>Name: {$name}<br>Address: {$address}<br></body></html>
<html><head><title>User Info</title></head><body>User Information:<p>Name: george smith<br>Address: 45th & Harris<br></body></html>

As you can see, Smarty cleanly separates your presentation elements (HTML, CSS, etc.) from your application code. However, it does not necessarily separate logic entirely from your templates. With respect to Smarty's design principles, so long as the logic in the templates is for presentation only, it is permissible to use it. For instance, looping over table row colors or including one template from another would be considered presentation logic. This is something the application should not need to accomodate (it just supplies an array of data.) The idea is to keep the template designer role and application programming role separated. You should be able to completely tear down the templates and rebuild them without touching the code base, all while retaining full control of the presentation. With this comes an important point: there is nothing stopping you from putting application logic in the template. Smarty has more than enough power to let you shoot yourself in the foot, so you must have some self discipline in this respect. Don't worry though, with a little bit of practice it becomes quite self-evident what logic belongs where.

Smarty has some nice features that take advantage of this design principle, as you'll see in the next example. One prominant feature of Smarty is variable modifiers. These are used to alter the output of assigned variables from within the template. In our example, we would like to display George's name capitalized, and we would like to properly HTML escape the amphersand (&) symbol in the address. We also show how to display the current date with a custom formatting.

index.tploutput
<html><head><title>User Info</title></head><body>User Information:<p>Name: {$name|capitalize}<br>Addr: {$address|escape}<br>Date: {$smarty.now|date_format:"%Y-%m-%d"}<br></body></html>
<html><head><title>User Info</title></head><body>User Information:<p>Name: George Smith<br>Addr: 45th &amp; Harris<br>Date: 2003-12-19<br></body></html>

Using modifiers, we have just handed formatting control of the assigned content over to the template and out of the application logic. Now we can assign the raw data straight to the template (no mods necessary for presentation purposes!) You can chain any number of modifiers together on one variable, making this feature quite flexible. There are many more modifiers that come with Smarty, or you can make your own with its easy to use plugin architecture. Drop your new modifier into the plugin directory, then mention it in the template!

Smarty also has what are known as template functions. Template functions carry out tasks in the template that may or may not display content. For example, you can include other templates from within a template with the include function. Let's say you have many templates with the same header and footer information. You can manage these as separate templates and include them.

header.tplfooter.tpl
<html><head><title>{$title|default:"no title"}</title></head><body>
</body></html>
index.tploutput
{include file="header.tpl" title="User Info"}User Information:<p>Name: {$name|capitalize}<br>Address: {$address|escape}<br>{include file="footer.tpl"}
<html> <head> <title>User Info</title> </head> <body>
User Information:<p> Name: George Smith<br> Address: 45th &amp; Harris<br>
</body> </html>

One feature of the include function is locally scoped variables. Notice that $title is a template variable not assigned directly to the template, but assigned by passing it as an attribute to the include function. This way the $title variable is only available within the scope of the header template, and can be dynamically changed any time the header.tpl file is included. Also, notice we used the default modifier on $title so in the case $title is empty, the text "no title" will show up instead of displaying nothing.

There are some nice functions that automate tasks such as html dropdown boxes. One is html_options. You assign the arrays of data to the template, then this function does all the work to generate the HTML output for it.

index.php
include('Smarty.class.php');// create object$smarty = new Smarty;// assign options arrays$smarty->assign('id', array(1,2,3,4,5));$smarty->assign('names', array('bob','jim','joe','jerry','fred'));// display it$smarty->display('index.tpl');
index.tpl
<select name=user>{html_options values=$id output=$names selected="5"}</select>
output
<select name=user><option label="bob" value="1">bob</option><option label="jim" value="2">jim</option><option label="joe" value="3">joe</option><option label="jerry" value="4">jerry</option><option label="fred" value="5" selected="selected">fred</option></select>

Smarty facilitates a convenient way to loop over arrays of data with the section function. Here's an example of that, and we also threw in alternating row colors via the cycle function, and we use the strip function to strip out newlines and white space.

index.php
include('Smarty.class.php');// create object$smarty = new Smarty;// assign an array of data$smarty->assign('name', array('bob','jim','joe','jerry','fred'));// assign an associative array of data$smarty->assign('users', array(	array('name' => 'bob', 'phone' => '555-3425'),	array('name' => 'jim', 'phone' => '555-4364'),	array('name' => 'joe', 'phone' => '555-3422'),	array('name' => 'jerry', 'phone' => '555-4973'),	array('name' => 'fred', 'phone' => '555-3235')	));// display it$smarty->display('index.tpl');
index.tpl
<table>{section name=mysec loop=$name}{strip}   <tr bgcolor="{cycle values="#eeeeee,#dddddd"}">      <td>{$name[mysec]}</td>   </tr>{/strip}{/section}</table><table>{section name=mysec loop=$users}{strip}   <tr bgcolor="{cycle values="#aaaaaa,#bbbbbb"}">      <td>{$users[mysec].name}</td>      <td>{$users[mysec].phone}</td>   </tr>{/strip}{/section}</table>
output
<table><tr bgcolor="#eeeeee"><td>bob</td></tr><tr bgcolor="#dddddd"><td>jim</td></tr><tr bgcolor="#eeeeee"><td>joe</td></tr><tr bgcolor="#dddddd"><td>jerry</td></tr><tr bgcolor="#eeeeee"><td>fred</td></tr></table><table><tr bgcolor="#aaaaaa"><td>bob</td><td>555-3425</td></tr><tr bgcolor="#bbbbbb"><td>jim</td><td>555-4364</td></tr><tr bgcolor="#aaaaaa"><td>joe</td><td>555-3422</td></tr><tr bgcolor="#bbbbbb"><td>jerry</td><td>555-4973</td></tr><tr bgcolor="#aaaaaa"><td>fred</td><td>555-3235</td></tr></table>

Smarty also has built-in caching capabilities to help speed up the page rendering. A copy of the template output is stored in a text file, then that is displayed upon subsequent calls to the request instead of dynamically rendering the page each time. This can speedup page rendering substantially, especially if there is a lot of processing involved to create the page such as database calls and variable assignments.

index.php
include('Smarty.class.php');// create object$smarty = new Smarty;$smarty->caching = true;// see if the page is already cachedif(!$smarty->is_cached('index.tpl')) {   // not cached, so you might do some database queries here,   // then assign the returned content. We just use static   // values for this example.   $smarty->assign('name', 'george smith');   $smarty->assign('address', '45th & Harris');}// display it$smarty->display('index.tpl');

You can also have multiple cached versions of a single page by passing a unique cache id to the display() function, check out the docs on that one!

There are many more builtin and custom functions that come with Smarty, or you can make your own, again with the easy to use plugin architecture.

Again, we'll take note that all of the functionality of Smarty (modifiers, functions, etc.) deal exclusively with the presentation of content. This is the design principle Smarty was built upon.

Posted by 나현재

2004/11/23 20:01 2004/11/23 20:01
,
Response
0 Trackbacks , 0 Comments
RSS :
http://j.finfra.com/tt/rss/response/128

PHP]Smarty 설명문서와 그 MVC 방법론에 대한 논란~ ^^; | 재미없는거2004/11/06 04:27
http://blog.naver.com/prosun76/20007137265

글쓴이:최근한 Smarty 설명 문서조회수:7984

/classroom/SmartyDocument.pdf

안녕하세요.  저는 최근한이라고 합니다.

공부삼아 Smarty 문서를 정리하던중에 혹시나 도움이 될까해서 올립니다.
----------
I. Introduction

1.들어가기 전에

어젯밤 밤을 새서 디자인에 프로그램을 입히고 서버에 올려놓고 퇴근했는데 오늘 디자이 “ ,
너가 와서 배경색 바꾼다고 파일을 덮어쓰기 했어요 어제 다 해놓고 갔는데 오늘 안 되어 .
있다고 오자마자 팀장한테 욕 무척 먹었어요.“
언제인지는 모르지만 어떤 사이트의 자유 게시판에서 본 게시물의 내용이다 조금 더 과격 .
한 표현을 썼던 원문을 잠깐 참고하면 멍청한 디자이너가 파일의 날짜로 안보고 그냥 덮어 “
썼다 란다 자기는 일 해놓고 갔는데 안해놨다고 욕먹었으니 화날만도 하고 뭐 원문 그대 ” . , ,
로를 살펴보면 프로그래머가 잘못한 것은 하나도 없는 피해자 같다 하지만 이 일이 왜 생 .
겼을까 미리 막을 수 있는 방법은 없었을까 ? ?
.
.
.




헤헤
pear db와 smarty를 이용한 sample application 어디 있나요?
관심은 있었지만 마땅히 어찌 적용해야 할 지, 어떻게 적용해야 할 지 몰라서 못 쓰고 있어서... 소
스가 공개된 좋은 sample application이라도 있으면 공부좀 하고 싶군요.
05/27
23:24:32



CF
아직도 템플릿 사용하시는 분이 계시군요. 쩝
PHP 자체가 템플릿 구조인데...
05/28 9:45:22



오잉
뭐가 맞는 말인지 모르겠네요...
05/28
15:18:10



토시
CF// 그렇게 말씀하신다면 아직 템플릿의 개념을 이해 못하고 계신 겁니다. html소스 안에 php코
드가 삽입되어 있는 형태라고 해서 아마 그런 말씀 하신 모양이죠?
05/28
17:07:06



아주작은새
문서가 좋은데 처음 부분에서 멈춘것이 아쉽군요
좀더 깊이 들어 가면 정말 좋을것 같습니다.
05/28
21:10:07



공간
좋은 문서 감사드립니다.. ^^
05/29 6:17:01



CF
토시// 괜찮다는 템플릿을 전부 사용해 보았습니다.
나름대로 결론을 내렸는데 템플릿 문법을 또 배워서
PHP만으로도 충분히 할 수 있는 부분을 굳이 템플릿을
사용해서 작업하는 것 자체가 비효율적이라는 겁니다.

템플릿을 사랑하시는 분(?)들은 협업 말씀을 많이 하시는데요.
PHP만으로도 충분히 협업 가능합니다.

말로만 하면 이해를 못 絿프?모르니 몇 가지 예를 들겠습니다.
템플릿을 사용할 때 흔히 HTML과 구분되는 구분자(separate)
를 사용합니다.
우선 그 구분자의 역활을 PHP가 할 수 없느냐?
할 수 있습니다.
{$var} 하고 사이에 차이점이 뭘까요?
그리고 주로 사용하는 header, footer 와
include_once() 문법과 뭐가 다를까요?
마지막으로
처럼
반복을 요구하는 부분과
foreach(): endforeach; 구문과 무슨 차이가 있죠?

고로 PHP만을 가지고 응용하여도 충분히 템플릿 효과를
낼 수 있다는 것입니다.
05/29
10:10:59



홍길동
cf 님에게 한마디.
물론 php만으로 충분히 할수있습니다. 그러나...
smarty만의 강력한 기능과 편리함이 있습니다.
템플릿 프로그램을 사용해서 시간과 정력을 아끼는 것도 좋은 방법 같은데요.
cf 님 처럼 템플릿 안쓰고 php만 쓰겠다면 그렇게 하십시요.
그렇지만 템플릿 쓰는사람들에게 왜 사용하느냐는 식의 말은
맞지 않는것 같습니다.
05/29
10:34:50



CF
홍길동// 왜 사용하느냐는 식으로 들리셨다면 오해시고요.
뭐 각자의 개발방법의 차이겠지요.
하지만, 저의 요점은 굳이 Smarty라는 거대한 템플릿을
배우면서까지 개발을 할 필요가 없다는 것입니다.

다시 말씀드리면 템플릿 구조를 만들기 위해 Smarty 문법을
배우고 PHP도 배우고... 오류가 나면 템플릿 오류인지
PHP 오류인지 헷갈리고...뭐 그럴 필요가 없다는 것이죠.
템플릿 개념만을 가지고 코딩하면 됩니다.

위에 Smarty는 예를 든 것입니다.

그래도 나는 PHP만으로는 템플릿 구조로 코딩을 못 하겠다 하시면
어쩔 수 없습니다. 그렇게 코딩하십시오.
05/29
10:52:01



홍길동
제가 하고자 하는말을 cf님이 하시네요.
각자의 개발방법의 차이가 있으니깐 서로 좋은것을 사용하자는 이야기 입니다.
그러니깐 구지 왜 smarty을 사용하느냐의 말은 맞지 않습니다.
님처럼 php만 쓰는것이 좋은지 smarty를 이용하는것이 좋은지는
각자의 능력과 좋아하는 스타일로 결정된다고 봅니다.
05/29
11:03:27



홍길동
한마디 더하자면
프로그래머 입장(웹프로그램)에서 디자이너와 서로 의논하면서
해야하기 때문에 각자 개발하기 편한쪽으로 해야한다고 생각하는데
그런점에서 smarty는 매우 훌륭한 tool이라고 생각됩니다.
저도 여러방법으로 개발을 시도했고 그때마다 디자이너에게 답변을 들었는데 smarty를 썼을때가
서로에게 좋은 점수를 얻었습니다.
05/29
11:11:01



CF
홍길동// ^^;
아무튼, 저의 말뜻을 이해하시는 분이 계실 거라고 믿습니다.
05/29
11:12:09



CF
홍길동// ㅎㅎ 디자이너입장에서 템플릿이 젤 짜증나는 작업입니다.
제가 사용하는 방법으로 개발하면 디자이너가 굳이 템플릿을
알 필요도 없습니다.
그만큼 PHP가 강력하다는 것이죠.
05/29
11:14:20



CF
덧붙여서 디자이너와의 협업에서 서로의 영역을 침범하지 않는다고
템플릿의 장점으로 많이 말씀하시는데
제가 볼때 디자이너는 디자인만 잘하면 됩니다.
나머지는 프로그래머의 몫이죠.
05/29
11:16:10



홍길동
cf 님
저는 논쟁을 하자는 이야기가 아닙니다.
다만 서로 좋아하는 스타일이 있는데..
왜 그걸 사용하느냐의 식은 옳지 않다는 말입니다.

이상 이걸로 끝내겠습니다. 좋은하루 되세요.
05/29
11:22:43



CF
홍길동// ok. 좋은 주말 보내세요.
05/29
11:28:48



-.-
템플릿이 필요할 때가 있습니다. (저 같은 경우 거의 모든 경우...)
1. 출력폼을 화면으로 그리고 프린터 출력으로 그리고 이메일 발송으로 보내고자 할 때...
2. 헤더값을 써야 할 때...
3. 코드의 간결함을 유지하고자 할 때(데이터 파싱 등 디자인 독립적인 코드는 PHP에서, 가격에
컴마를 찍는 등의 100% 디자인 때문인 코드는 템플릿의 플러그인에서 처리)
4. 캐쉬를 사용해서 퍼포먼스를 높이고자 할 때...(여러가지 캐슁 레이어가 있지만, 템플릿에서 제
공하는 캐쉬도 상당히 쓸만 합니다.)
개인적으로 템플릿을 쓸 때의 장점은 출력이 가장 하단에서 이루어지고, 객체로 이루어 짐으로 코
드 자체가 객체화 또는 함수화 되고, 그로 인해서 메인페이지의 코드는 상당히 줄어들었습니다.
이것은 PHP만 사용할 때에도 가능하지만 템플릿을 쓰면 거의 반강제적으로 그렇게 되더군요.
하여튼 머가 좋고 머가 싫고 간에 전 템플릿 쓰는게 재밌습니다. :-)
05/29
12:27:08



나그네
딴지 가 서로의 발전을 위한 좋은 걸음마죠.
CF/홍길도/토시님 세분이 서로 대화를 좀더 깊숙히 나누시면
더 좋은 문서가 나오겠내요.. :)
05/29
16:04:50



전영규
식으로 해도 템플릿 효과는 충분히 납니다.
오히려 표준적인 방식이라고 할 수 있지요.. PHP 프로그래머나 구경만 해본 디자이너나 다 아는
표현이니까요.
그것을 템플릿이라고 해도 전혀 무리는 없다고 봅니다...
단, 이것은 소스코드를 감출 필요가 없을 때의 방법이되구요.
소스코드를 감출 필요가 있을 때는 절대로 하고 싶지 않은 방법이죠...
제가 생각하는 템플릿의 필요성은 이게 가장 크네요.
-- jeon.
05/29
19:15:32



챠트맨
이미 오래전부터 스마티 적용해서 웹사이트 개발중..편리하긴 한데 약간 복잡..^^
05/31 2:51:46



아주작은새
템플릿을 사용하면 장점이 디자인이 분리되서 좋은거 아닌가요?
과 같이 사용하는 경우
반복문을 디자인 파일에 직접 적어줘야 하는 불편함이 있잖아요?
아니면 제로보드 처럼 너무 많은 디자인 파일이 생성 해야하는......

smarty 의 경우 {$val[loop].key} 와 같이 사용하면 간단하기 때문에 더욱 디자인을 분리하기 좋
더군요
그리고 자체의 기능이 워낙 많아서 세세한 설정을 하고 싶을때도 좋고요

하지만 단점은 역시 기능이 너무 많다는데 있습니다;;
쓸데 없는 것도 있다고 생각합니다.
number_format html_options 같은 경우 php 에서 처리 해도 될것인데 굳이 템플리에서 까지 만들
어 둔다는거
그리고 include 를 하게 만들었다는거 등은 정말 쓸데 없다고 생각이 됩니다.
05/31 4:10:08



미나리청년
저는 smarty 쓰다가 너무 방대한 기능때문에 template_로 바꿨습니다. smarty는 쓰잘데없는게 너
무 많아요. template_는 심플,간단, 꼭 필요한거만 있네요.

헌데 CF님 말도 일리가 있네요..
처음에 저도 스크립팅언어에서 굳이 클래스, 템플릿까지쓸 필요가있을까하는 생각..
개발자가 편해질것이냐 최대의 성능을 낼것이냐.
05/31
10:41:38



토시
무슨 말씀들을 하시는지 알겠습니다. 다만 방식의 코딩만으로는 디자이너에게 전달하
기 곤란한 경우가 적지 않기 때문에 템플릿을 쓴다고 봅니다. 가령.. 루프문 처리 같은거지요.
템플릿으로 디자인을 잘 분리했을 경우 디자이너가 얼마든지 자기 쓰던 툴로 php를 안 깨고 디자
인 수정이 가능하게 되기 때문에 편리한것이죠. (물론 스마티의 복잡한 기능까지 다 쓰게 되면 디
자인 형태를 유지하는것도 힘들어지기 때문에 이러한 주장에 힘이 떨어지게 되기는 합니다만...)
암튼 제가 한말씀 드린것은 "아직도 템플릿 사용하시는 분이 계시군요"라는 말씀이 주는 느낌은
웬지 템플릿을 쓰는 분들이 쓸데없는 것에 시간낭비하는 것처럼 생각하시는 듯 해 말씀드린것입
니다. 템플릿이 그렇게까지 무용한 것이라면 php개발진에서 pear db에 템플릿클래스를 등록하지
도 않았겠죠.
05/31
11:10:55



.ㅡㅡ.
http://smarty.php.net/docs.php 에 가보니 한국어 링크는 없군요.
문서를 읽다보니 번역 도움인력을 구하시는 듯 한데..
kldp쪽에서 공동 번역을 시도해 보시는건 어떨지요?
05/31
16:37:45



정념,정행
스마티를 사용하다가 느낀점입니다.
변수의 종류가 많지 않은 간단한 구조를 사용할때 스마티가 편리하다고 느겼습니다만,
변수 종류가 많아지지 확장성과 유지보수성이 조금 떨어지더군요.

성능을 수치로 비교해 보지는 않았습니다만, 스마티가 컴파일한 소스를 보면 그리 좋아 보이지 않
습니다.

스마티 대신 php로 사용하는데 스마티 처럼 사용합니다.
====================================================
php에 해당하는 예제 코드는
====================================================
$result = mssql_query($sql,$conn);
$setdata=array();
while($data=mssql_fetch_array($result))
{
$setdata[]=$data;
}
//--------------------------------------------
// 결과를 디자인 파일에 넘긴다
include 'skin/list_skin.php';


====================================================
스마티 대신 php로 작성된 list_skin.php의 핵심구조.
====================================================


{
$link="list_detail.php" ;
?>



?>


이렇게만 사용해도 디자인와 프로그램 부분이 별도로 존재하기 때문에 전혀 문제가 없습니다.

개발 후 잦은 수정이 있을 경우 프로그램 부분과 스마티를 바꿔야 하기에 저의 경우는 조금 불편
했습니다.
스마티 문법을 배우는 것도 부담이 되구요.

다만, 스마티를 이용한 입력모듈이 따로 존재하는데 그것을 이용할 경우 자바스크립트 를 사용하
지 않고도 쉽게 입력값 확인이나 오류를 방지할수 있는 것은 조금 끌리는 점입니다.

모든 부분에서 스마티가 좋다고는 할 수 없겠네요.
장 단점을 알고 해당 프로젝트에 적당히 사용하는게 가장 현명한 방법이라고 생각듭니다.
06/01 9:38:34



mir.
php의 template자체가 조금 불편하게 만들어 졌다고 생각합니다만..
파일을 여러개로 쪼개서 보관해야 한다는 점에서 디자이너 측에서 상당히 불편한 방식이 된건 아
닌가 싶군요.
차라리 template을 좀 더 개량해서 디자이너/프로그래머에게 모두 더 편한 환경을 생각 해 보시는
건 어떠신지..
를 쓰던 {var}를 쓰던 양쪽 다 같은 건 마찬가지이겠지만, 로직 자체가 디자인페이지와
섞여 있다는것이 template을 쓰는 가장 이유가 아닐까 생각됩니다
php 파일 하나에 로직과 디자인 함께 들어있는 구조가 아니었다면, 굳이 template을 만들지도 않
았겠죠.
마지막으로..
로직 파일 한개, 그리고 디자인 파일 한개, 이렇게 두개의 파일으로만 이루어지는 template방식은
어떨까 생각해 봅니다만..
이번 프로젝트에서 template code precompile, cache system을 적용하여 php에서 engine을 개
발하려고 구상하다가 그냥 ms측 기술사용으로 넘어가는바람에 c#.net으로 넘어가게 될것 같습니
다만.. 이쪽으로 넘어와서 보다보니.. .net도 비슷한 개념의 방식을 쓰고 있는것 같더군요.

개발자에게 있어서 가장 중요한건 새로운 방식에 대한 비판 이후에 기존의 방식으로 되돌아가기
보다는 더 나은 방식을 만들어 내는것이 아닐까 싶습니다.
06/01 9:53:47



mir.
어찌되었건.. 기존의 template이 느리고 불편한 것은 확실한 것 같습니다. ^^;
06/01 9:54:40



석이
분리되고 smarty 보니 한번만 파싱하고 두번부터는 프리파싱된 데이터를 이용해 하는걸 보니....
뭐 쓸만 하다는 생각도 듭니다. 사실 클래스를 이용해 smarty 문법을 만들어 쓰는 것을 본적도 있
습니다. 클래스가 좀 어려워서 그렇지 쓸만 했는데 거기에 더해 프리파생은 상당히 메리트가 있어
보였습니다. 개발 4개월째 ㅡ.ㅡ ;; 초보가
06/02 2:31:37



네오플
논쟁이 대단합니다. 음... 역쉬 아직 PHP는 살아있다는 증거겠죠..? 저도 템플릿에 대해서 한마디
하겠습니다.
Template 는 하나의 기술입니다. OOP도 마찬가지구요..
Java, C 기타 다른 언어에서도 마찬가지로 이러한 기술은 PHP에서만 쓰이는 것이 아니란 예기죠..
그럼 이러한 것은 왜 쓰는것일까? 각자 목적을 이루려는 결과물을 쉽고 간편하게 얻기 위한 것이
겠죠..
Template의 중요성은 규모가 있는 프로젝트를 많이 해보신 분이라면 필요성을 더 느끼실것입니
다. 만약 Template의 목적을 안다고 가정할때..
그럼 Template를 꼭 써야 하나..? 그것은 아니라고 봅니다.
Template는 하나의 기술일뿐 필수는 아니라는 것이겠죠..
나에게 가장 편한방법을 써야겠죠..
하지만, 앞서가시려면 쓰지 않더라도 그목적과 쓰임세는 알아두시는 것이 좋을것입니다.
초보시절 테그에 항상 border=0 을 주었지요..
나중에 스타일시트의 IMG {BORDER: NONE;} 을 알고 난후
그 편안함은 이루 말할 수 없었습니다.
위에서 말하려는 요점은 내가 현재 알고 있는것이 지금은 편할지 모르지만 더 낳은 방법을 찾는다
면 예전의 방법은 쓸려고도 하지 않을 것입니다.

적어도 Template은 이럴때 좋은 역활을 해 주더군요..
- 경험 피력 -
임대형 쇼핑몰 솔루션을 제작중 일부 변수의 충돌로 Skin의 변수명을 변경시킬일이 생겼지요.
Skin은 약 150개정도 Editplus 로 150개를 열어서 일일이 수정하고 또 몇일후 똑같은 상황으로 변
수명을 수정하였습니다. 이게 뭡니까~ 변수나빠요~(블랑카버젼)
결국 Template 을 사용한 후 이러한 문제들을 해결할 수 있었으며, 많은 구조 변경이 일어나도
Design Skin 을 그대로 사용할 수 있는 효과가 있더군요..

전 지금도 좀더 간편하고 효율적인 방법이 있다면 기존것을 버리고 새로운 방법을 찾습니다.
여러분들이 PHPSchool 을 찾는 이유도 이러한 이유 때문은 아닐까요..?
06/02 2:53:10



나그네
네오플 님에게 한표.
프로그래머는 무엇을 쓰느냐가 문제가 아니라 어떻게 쓰느냐가 더 중요한 문제인것 같습니다.
저 경우도 smarty를 쓰고 있지만 꼭 써야한다고는 생각하지 않습니다. 그리고 smarty를 익히느냐
시간을 많이 투자하지도 않았습니다. 그저 중요한것만 쓰고 나머지는 조금조금씩 메뉴얼을 보면
서 썼습니다. 그러나 php도 제대로 못쓰면서 smarty부터 쓴다면 절음발이 프로그래머로 전략됩니
다. --이상--
phpschool 화이팅 !!!
06/02
13:00:55



음..
디자이너가 단독으로 간단한 문제를 처리할 수 있다는것과
드림위버등의 툴이 코드를 깨먹지 않는다는것
두가지만으로도 제게는 쓸 가치가 충분하군요.
06/02
16:15:33



Akal
템플릿을 제작할때 보통 예약어를 특별한 구분자를 두어서 표현하긴 합니다만, 좀더 쉽게 제작한
다면 예를 들어 예약어를 한글로 표현한다면 더더욱 쉽게 템플릿을 제작하고 디자이너들과의 의
사소통도 한결 간결해 질 수 있습니다. {글제목} 이런식으로 말이죠. 저는 이런식으로 템플릿을
제작해서 꽤 좋은 효과를 봤습니다.

템플릿은 또한 리뉴얼이나 리빌딩 시에도 예약어만 그대로 지켜준다면 프로그램은 건드릴 필요도
없이 디자인만 바꿀수 있다는 유지보수의 장점이 대단히 큽니다.

smarty의 강력함에 젖어보기도 했지만 smarty의 사용하지 않게 되는 수많은 기능들을 생각해보고
자기만의 빌딩라이브러리로 템플릿을 구축한다면 더욱 많은 도움이 되리라 생각되는데요..^^
06/05 8:09:46



4000만개
템플릿을 써도 속도에는 전혀 지장없나요
저는 게시판을 전문으로 만드는데 속도는 1000만건에서도 0.0x 대의 게시판만 만들거든요 템플릿
을 써도 속도저하가 없다면 써도 괞찬을듯 하군요 그리구 전 디자인 쪽은 {$var}이런식으루 사용
하는데 이게 몸에 익어서 그런지 참 편하고 좋군요 ㅎㅎ
디자인도 내가 다 하니 ㅋㅋ 템플릿의 필요성은 전혀 못느끼겠군요
06/08
17:08:19



지우개
템플릿을 사용하면 아무래도 include나 변수재할당등의 파싱으로 조금 느려질수는 있습니다.
템플릿을 사용한다는건 그정도의 속도저하쯤은 템플릿의 편의성등으로 묻을수 있기때문이죠.
그리고 게시판속도는 DB설계이지 php 파싱속도가 아닙니다.
혼자작업한다면 굳이 템플릿을 사용할 필요없겠지만 조금만 큰 규모에 투입되면 템플릿(혹은 그
비슷한 기술)은 필수입니다.
06/09
10:51:12



야호~~
http://mail.smarty.co.kr/man/kr/index.html
06/10
17:44:35



그러니까
템플릿의 장점 :
PHP가 아니니까 디자이너에게 새로운 규칙을 익힐것에 대해
보다 유리하며, 디자이너의 소스 수정을 쉽게 유도할 수 있다.

템플릿의 단점 :
개발시간이 느려지고, 수정이 불편하며, 스마티라는 새로운 템플릿의 규칙을 알지 못하면, 접근하
기 힘들다.
에러를 쉽게 찾아낼수 없으며, 소스를 보면 실제로 어떤 의미를 가지는지 명확하게 찾아내기 힘들
어진다. 또한 속도는 템플릿을 쓸 경우 쓰지 않을경우에 비하여 파싱부분에 있어 몇배로 느려진
다. 마지막에 이야기한 느려진다는 이야기는 현재 서버의 사양과 인터넷 속도때문에 느끼지는 못
할 것이다.
06/13 0:56:21



그러니까
제가 보는 템플릿은 (저도 템플릿을 개발해 봤습니다) 별로 도움이 되지 못할뿐더러, 필수적으로
하지 않으면 이상한 개발자라고 인식할만큼 효용가치가 있는것도 아니다. 그러나 요즘은 템플릿
을 많이 쓰는 추세인데, 유행을 따라가는 것인지, 안쓰면 안되는 퀄리티가 있는것인지, 도저히 알
수가 없다. 중요한것은 PHP와 똑같은 코딩규칙을 배워야 한다는 것이다.
구지 그렇게 쓰고 싶다면 PHP도 한글 변수를 지원한다.
아싸리 이렇게 쓰기를 권고한다.
06/13 0:59:48



.ㅡㅡ.
그러니까//
물론 템플릿이 만능은 아니지만 경우에 따라서는 필수입니다.
예를들어 사용자가 스킨을 직접 만들어서 올릴 수 있게 시스템을 만든다면
코드와 보여지는 화면은 철저히 분리되어야 합니다.
그런 시스템에서 스킨 안에 php코드를 직접 넣을 수 있게 된다면 돌이킬 수 없는 결과를 일으킬
수도 있으니까요.
템플릿을 잘 쓴다면 그런일은 방지할 수 있겠지요.
06/14
13:15:57



그러니까
.ㅡㅡ.//
사용자 부분에서 그렇게 하는것은 저도 쓰고 있고 인정합니다.
그러나 지금은 그부분에 대해서 이야기 하는것이 아닌듯
06/14
17:43:38



아주작은새
실제로 php 를 잘 아는 사람들은 smarty 가 필요없을수도 있죠
smarty 가 필요한 사람들은 어설프게 여러군데 해야 하는 사람들 .......에게 필요하죠

마당쇠 라고 불리우는 에이젼시 업체의 나홀로 프로그래머들
멀티플레이어라고 불리우는 디자인 + 프로그램 작업 하는 사람들

이런 사람들에게 코드의 재사용성과 디자인 변경의 편리성을 제공하기 때문에 smarty 를 사용하
는것 같습니다.

smarty 가 필요하고 안필요하고는 자신의 판단이지만
업계의 현실상 위에서 언급한 어슬프게 작업해야 하는 사람들이 많은 점을 감안한다면 더 많은 사
용자를 확보할 것이라고 생각이 됩니다.

오해가 있을까봐 답니다만
저도 어설프게 작업해야 할 경우 smarty 를 씁니다.
개발속도+안정성+퍼포먼스 가 요구되는 포탈 사이트 같은 작업에서는 smarty 는 비추천 입니다.
06/14
17:55:53




다운받고 보니 별 내용 없네요. 원론적인 내용뿐..시간나는대로 두번째 article 올린다고 해놓는다
고 했는데.. 정작 중요한 그거 아닌가?
06/17
17:15:20



잠깐익명
저 문서보다도...문서PDF파일 어케 만든거예요?
06/17
20:12:23



오토나스
감사합니다. 잘 쓰겠습니다. ^^
06/18
15:05:00



소리
CF님.. 저랑 같은 생각을 하고 있었네요. 반가워요. -_-/
저도 지난 2년동안 템플릿을 만져왔었는데...
결국은 그냥 정통 php 로 돌아섰습니다.
06/21
15:23:30



CF
소리님 저도 방갑습니다. -_-/
06/22
14:59:57



xtac.net
내용이.. 스마티 무용론이 아니라 템플릿 무용론인거 같네요. 2~3 년 전 토론과 달라진 것은 MVC
패턴의 유용성에 대해서는 동의들을 하고 계신거 같습니다.

말씀들 하신 것처럼 MVC 패턴을 구현하려고 할 때, PHP 코드만으로 가능합니다. 또 다른 문법, 규
칙을 익히지 않아도 되고 동작원리상 성능도 비교적 뛰어납니다. 다른 이야기일 수 있지만 PHP 코
드만 사용하더라도 MVC 패턴을 구현하기 위한 방법들을 잘 정리하여 하나의 클래스로 묶어.. 일
관성 있는 개발 방법을 마련할 수 있을 겁니다. 예를 들어 Servant Template 이나 Brian Lozier의
컬럼(Beyond The Template Engine)에 소개되어 있는 Template 클래스가 있습니다. 간단한 소스
이고 이미 이런 것을 만들어 쓰실지도 모르겠네요.

이런 클래스에 비해 자체적인 문법이나 규칙을 가지고 있는 템플릿 엔진이 유용한가는.. 어떤 템
플릿이냐에 따라 달라지는 문제라고 생각합니다. 수많은 템플릿 엔진이 있고 나름대로의 특색이
있습니다. Template_ 를 예로 들면.. 템플릿 대 PHP 코드 변환이 1 : 1 이 아니라 1 : 1+alpha 라고
할 수 있습니다. 예를 들어.. 템플릿용 객체플러그인이나 함수플러그인을 만들었을 때, 해당 파일
을 인클루드하거나 객체생성하는 코드를 작성하지 않아도 되고 스마티처럼 register 할 필요도 없
이 바로 사용하기만 하면 됩니다. 템플릿 구문 오류에 대해서는 PHP 메세지가 아닌 자체메세지를
줄번호까지 정확하게 출력해 줍니다. 강의 주제가 스마티인 만큼 성능, 가독성, 일관성, 편의성..
편리하면 얼마나 편리한 건지, 자체 문법과 규칙이 정말 어려운 건지.. 여타 길어지는 이야기는 하
지 않겠습니다.

이렇게 이야기하긴 했지만.. 예로 든 Template_ 를 사용했을 때 작업시간이 몇 % 단축된다던가 개
발자의 엔돌핀? 분비가 상승했다던가 하는 구체적인 데이터는 없습니다. Warrenty 가 있는 것도
아닙니다. 다만.. 즐겁게 사용하시는 분들이 있고, 제법 규모가 되는 싸이트를 운영하시는 분들도
있는데.. PHPSchool 같은 곳에서 템플릿 무용론에 대한 적절한 반론이 부족하다는 것에 안타까운
나머지.. 글을 남겨 봅니다.
06/23 1:48:09



지나가는이
다~~ 장단점이 있기에 하는겁니다. 일단 해보세요!
왜 템플릿을 사용하는지... 저두 정통으로만 사용하다가.. 요근래에 사용해보니... 정말 편하다는
느낌이 들더군요 특히 개발 속도면에서... 정말 맘에 듭니다.
06/23
18:51:25



소리
물론 자기한테는 편하겠죠.
하지만 자기만이 아닌 다른 사람도 볼 필요가 있을 경우엔..??
06/24
10:20:43



xtac.net
소리// 한 두 시간만에 캐쉬까지 마스터하고 사용하시는 분도 있고 경력이 3년인데 도저히 모르겠
다며 싸이트 개발 소스를 요청하는 분도 있습니다. 두 경우의 차이는 아마도 어떤 방식이 됐든
MVC 패턴을 경험해 본 적이 있느냐인 것 같습니다. 공식메뉴얼이 있으니 새로운 환경에 쉽게 적
응하는 분들은 다른 개발자에게 피해가 될거라고 생각하지 않을 수 있겠죠. 어쨌든.. 쓰라 마라 강
요하는 것은 좋은 일 같지 않네요.
06/24
11:45:50



소리
앗.. xtac.net 이다.
예전에 자주 다니던 사이트인데. ^^
물론 잘 이해하시는 분이 있으시겠죠. 저도 잘 이해하는 편입니다.
하지만 굳이 그냥 php 로 해도 될 것을 템플릿 문법을 또 익히며
할 필요성을 못 느낀다는 거죠.
디자인을 쉽게 고칠 수 있다는 것과.. 디자이너도 만질 수 있다는 장점이 있긴 하지만..
두가지 모두 다 하는 저로는 그리 매력을 못 느껴서요. ^^
혹 모르죠. 나중에 다시 마음을 바뀔지. ^^
06/25
13:16:37



sy
근데 php를 알려고 하지않는 디자이너는 템플릿도 알려고 하지않던데요.
결국 템플릿의 목적은 거의 빗나갔다고 보여집니다.
중요한건 템플릿이 주장하는 '디자이너와의 원만한 협업을 위한 방법론' 이겠죠!
06/25
14:42:02



CF
이쯤에서 생각하건데 개발방법론이란 따로 없는 것 같습니다.
자기가 현재 위치한 곳에서 맞춰나가는 방법뿐...
이것이 현실입니다.
서로 자신이 옳다고 주장해도 결국 합의점이 없으면
개발을 할 수가 없죠.
06/26
10:30:23



인간조
템플릿을 쓰느냐 마느냐는 중요하지 않습니다.
중요한 것은 로직과 프리젠테이션 계층의 분리입니다.
06/28 4:05:19



그러니까
템플릿은 선별적으로 사용되어야 합니다.
디자이너와의 관계, 개발기간, 퀄리티 등등
06/28
10:21:20



배틀제이
대단해... 코멘이 50이 넘다니...
06/28
23:40:02



떼송이
Smarty 익히는 시간보다는, 디자이너가 php기본 언어구조를 익히는 시간 훨씬 빠를 것으로 생각
합니다.
다만 smarty의 로직을 생각하며 Smarty 코딩을 입힐 정도의 실력이 디자이너라면, 프로그래머의
길을 정말로 권유하고 싶군요.
Smarty를 보았을때 디자이너를 위한 단순 템플릿 엔진이 아닌 개발자가 쉽게 자신의 코드 유지 관
리하기 위한 유용한 해결책을 제시한 기술인것 같군요.
사실 외국에서 애플리케이션을 만든것을 보면, 우리나라 사람이 보기에는 딸리게 보이는것 같지
만 유저빌리티를 중시한 가치관의 차이라는 것을 염두해 보자면, Smarty로 프로그래머가 쉽고 정
말유용히 디자인을 바꾸어 가며 자신들의 소스를 유지 관리할 수 있겠다라는 생각이 듭니다.
Smary. 어디 그게 디자이너를 위한 템플릿이덥니까.. 프로그래머가 쉽게 디자인을 바꾸게 하는 것
이지.. ^^
07/01 1:06:18



wizzet
꼭 디자인이 빈번히 바뀌는 경우가 아니더라도 템플릿의 접근방법은 코드의 재사용(copy & paste
가 아닌)의 면에서 상당히 유용하다고 생각합니다. 꼭 smarty과 같은 템플릿 엔진을 쓰지 않더라
도 직접 템플릿을 만들어 쓰는 경우도 있더군요.

처음부터 재사용 가능한 코드를 만드는 것은 쉽지가 않습니다. 한번의 프로젝트를 염두에 둔다면
기간이 더 길어지기도 합니다. 하지만 매번 프로젝트를 끝낼때마다 장단점을 분석하고 유지보수
가 이루어진다면 개발 기간도 단축되고 더욱 질이 높은 결과물을 만들수 있으리라 생각합니다.

템플릿 엔진은 이러한 방법중에 하나라고 생각합니다. 코드와 디자인의 분리, 디자이너와의 원할
한 협업은 디자이너가 프로그래머 출신이 아니라면 상당히 힘듭니다. 저희 회사 디자이너는 프로
그래머 출신인데도 힘들더군요.

결론은 템플릿 엔진을 코드와 디자인의 분리, 디자이너와의 원할한 협업의 관점에서 볼것이 아니
라 코드의 유지보수, 재사용의 관점에서 봐야 한다고 생각합니다. 프로그래머와 디자이너의 원할
한 협업은 원할한 인간관계에 의해서 이루어지는 것이지 도구를 통해서 이루어지는게 아닙니다.
07/03
14:50:04



ssehoony
에구.. 위에 글이 많아서 다 읽지는 못했지만 이거 하나는 말씀 드릴 수 있습니다.
일단 smarty 의 캐쉬를 사용해서 웹의 포퍼먼스를 올릴 수 있습니다.(캐쉬는 다른 걸 이용해도 가
능하긴 하져) 더 중요한건
울 디자이너는 php 소스도 어느정도 수정할 능력이 되는데요
내가 smarty 템플릿 파일을 수정하도록 환경을 만들어 주고, 후에 php 를 직접 수정하는게 좋냐
템플릿을 하는게 좋냐고 물어보니깐 템플릿이 더 하기 편하다고 하더군요. 그래서 계속 템플릿을
사용하기로 디자이너와 합의를 봤져.

과정이 어떻든 목적은 document 와 view 를 나누어서 일을 편하가 하자인데 그 목적에 잘 부합한
다고 보여지네요 ^^
07/06 9:37:20



더미
스마티를 쓰고있지만, 퍼포먼스가 떨어진다고 생각도 않고, 또 개발에서 관리 유지보수가 힘들다
고 생각해본적도 없습니다.
물론 PHP코드를 마구 집어넣어 코딩하는게 개발자로써는 속편할지 모를일입니다만, 유지관리를
생각해보세요. 스마티건 뭐건 템플릿을 쓰는 이유는 HTML과 PHP의 분리에 있는거니까요.
스마티 문법익히기 어렵다고 하는데 사실 익힐것도 없습니다. 간단한 규칙몇개하고, 루프로 반복
해서 찍어내는 부분 그부분에 대한 이해만 있으면 됩니다. 템플릿들에 대한 벤치마킹은 지금까지
많이 논의되어왔고, 또 그 유용성이라던가 필요성에 대해서는 국내외 개발자모임에서 논의되어왔
습니다. 극단적으로 템플릿은 필요없는 놈이다 라는 식으로 논의를 몰고가는 것은 개발자로써는
별로 도움이 되지 못할 생각인거 같군요.
사실 그 모든 컴퓨터의 언어들이 뭐 다 필요합니까? 걍 살던대로 살면되지... 그렇지만 그런식으로
살거면 인생아무의미가 없죠.
07/19 6:50:58



더미
디자이너와 플머의 협업관계에대해서도, 위에서 몇몇분들이 말씀하셨지만, 스마티는 별로 디자이
너를 위한 것은 아닌것 같아요. 디자인 변경작업이 들어가면 보통 디자이너에게 HTML 파일만 달
라고합니다. 그리고 거기에 PHP소스는 건드리지 않고, 템플릿 파일만 새로 갱신하는거죠. 복잡하
게 PHP소스까지 건드리는 일 말구요.
07/19 7:01:37



베르사체
저는 PHP 몇년했지만, 머리가 따라주질 못해서 템플릿 자체를 적용할 엄두를 내지 못하고 있습니
다.
그것도 학습에 대한 압박이 있군요.
07/24
13:07:31



정용훈
저는 CF님 말이 이해가 갑니다. Smarty와 pearDB를 사용해서 작업해봤는데, pearDB는 많은 도움
이 되었지만 Smarty는 득보다 실이 많은것 같더군요(Smarty뿐만 아니라 템플릿형태의 작업). 그
래도 Smarty는 좋은 프로그램입니다.
07/29
17:55:29



wizzet
Smarty 사이트에 가서 Smarty가 만들어지게 된 배경에 대해서 읽어보세요. Smarty는 도구일 뿐입
니다. 도구는 만능이 아니죠. 사용하는 사람이 필요에 따라 잘 사용해야지 훌륭한 도구가 되는 것
입니다.

저는 Smarty의 개념이 상당히 좋다고 생각합니다. Smarty를 사용해서 득보다 실이 많았다면 정용
훈님의 설계 및 코딩 방식이 Smarty의 개발자와 다르기 때문입니다. Smarty 개발자와 정용훈님의
설계 및 코딩 방식중에 저는 Smarty 개발자에게 손을 들어 주고 싶군요.
07/30
11:10:32



아이구
저는 주로 Class 를 사용해서 OOP 방식으로 코딩하는데..
이런 경우에도 템플릿이 유용하겠습니까?
한번도 안써봤는데.. 저는 HTML 코드들도 함수 안에다가 다 넣어서 쓰거든요.. 근데.. 디자이너는
소스코드에 손을 못대요. 물론 그러니 덥어써서 곤란을 당할일도 없지만 아무래도 수정때마다 일
일이 손봐줘야 하는 불편함이 있어서요. 조언좀..
08/01
20:43:01



지나가던 넘
논쟁이 뜨겁군여...저는 자바 개발자로 PHP에서 요즘 뜨는 기술이나 이슈를 자바로 구현하거나 개
념적으로 자바쪽에 적용하는 등의 이유로 이곳을 방문하는데.. 제가 요즘 템플릿 관련 하여 개발
을 하고 있어서 참 잼있게 위에 글들을 읽었네여..

템플릿을 쓰면 물론 새로운 개념이니, 새로이 배워하는건 당연하구, 물론 속도면에서 약간의 손해
를 볼수 있겠죠..
물론 없다구 하다면, 속도를 높이기 위해서 캐쉬, 풀링, 폴링등을 이용하여 메모리등 자원의 리소
스 더 소비했겠죠..
어떻게든 상대적으로 소비를 할 겁니다.
그런데, 굳이 쓰고자 하는 사람들은 무엇때문에 그렇까여..

저의 경우에 템플릿을 쓰는 이유는, 저희는 자바도 쓰고 ASP도 쓰고, PHP도 씁니다. 시스템이 복
잡하게 엮여 있거든여..
하지만, 이럴경우, 디자이너가 3가지 경우를 모두 알면 좋지만, 실제 한개 하기도 벅찰수도 있거든
여..

따라서, 어떤 템플릿의 개념의 정의 및 문법 구현을 자바, ASP, PHP쪽에 모두 구현해둔다면,
템플릿 엔진을 각 언어 맞게 구현해 둔다면,
상황을 달라지죠..
시스템 변경으로 어쩔수 없이 언어의 변경이 가해진다 하여도 디자이너로 부터 일관된 디자인을
제공받을 수 있으며,

기존 PHP에서 쓰던 템플릿을 수정없이 자바쪽에서 거의 바로 적용이 가능할수 있죠.

이런 측면으로도 템플릿을 바라 볼 수 있수도 있죠..
08/19
17:38:09



나도
정말 좋은 생각인거 같습니다. ASP PHP JSP 등을 통합할수 있는 템플릿 표준이 나온다면 정말 괜
찮겠군요.
08/20
10:59:29



하늘아버지
smarty는 php로 안만들고 java로 만들었습니까?
php만으로... 라는 표현 우습네요...

성능, 효율, 편의성...
따지고 보면 그런 것들보다 개발 여건, 그동안의 습성, 이해 수준 뭐 그런 것들 때문에 지금의 개발
방법이나 라이브러리를 고수하는 것 아닌가요? ㅋㅋ

이건 안좋고 저건 안좋고...
그런 얘기 하지 마시고 솔직히 나한테 안맞더라 그렇게 얘기하세요...
08/27
20:41:24



흠.
전 template_ 가 가볍고 빠르고 좋은거 같네요..
09/13
11:34:30



아름다운 폐인
첫...index.php 소스에서...

디렉터리 설정 부분

$smarty->template_dir = '/home/warper/sm/template/';
$smarty->compile_dir = '/home/warper/sm/template_c/';
$smarty->config_dir = '/home/warper/sm/config/';

가 아닌지요?
09/14
10:27:12



-_-
누가머라고 하든 가장 중요한건 프로그래머와 디자이너의 팀웍
둘이 맘만 맞으면 충돌없이 최적의 시간과 최상의 결과 물이 나옵니다.
전 이걸 가장 중요시 했고 그렇게 결과를 얻었습니다.
(흠흠 디자이너들이 날 너무 좋아해서 탈이야..)
09/14
15:04:30



초보
사용하기 나름이지요..저 같은 경우는 프로그래밍에 디자인에 다 하다보니 HTML, PHP 같이 사용
합니다. 협업할때는 템플릿이 정말 필요한것 같아요.
09/17 1:10:30



구이
로컬에 항상 작업했던 파일을 날짜별로 백업받아두는 습관이 중요한것 같아요
10/07
11:31:51



^_^_^
자 ^^ 이제 하던일 하죠~~
10/08
13:45:55



음;;
템플릿...
일의 경계를 나누기 위한 하나의 언어라고 생각 합니다.
구분을 두기 위한 개념의 존재라고 생각 하구요..
필요한 부분도 있을수 있으며 없을수도 있겠지만,
템플릿 쪽에 앞으로 많은 발전이 있을거라 장담합니다..
smarty.php.net 이 사이트 그냥 허물은 아니거든요..
10/17 9:56:14



-_-;;;
코드가 깔끔해져요..
디렉토리가 좀 복잡해지긴 하지만..
(프로그램 따로 돌리니 좋군요.. 페이지 나느는거라든지..
디비에서 글 빼오는거랑 html이랄 같이 쓸려면 지저분해지는데..
갈결해지는거 같어..)
?trdate=">

Posted by 나현재

2004/11/23 13:37 2004/11/23 13:37
,
Response
0 Trackbacks , 0 Comments
RSS :
http://j.finfra.com/tt/rss/response/127

출처 - zdnet 조한석님 기사
디자인과 로직의 분리를 위한 템플릿 엔진「Smarty」
PHP의 강력한 템플릿 도구 Smarty 완전 공략 1
Smarty는 템플릿 방식의 프로그래밍을 지원하기 위한 PHP에서 사용할 수 있는 강력하면서도 체계적인 디자인과 로직의 분리를 지원하는 도구이며, PHP 그룹에서 정식으로 지원하는 템플릿 엔진이기도 하다. 이 시간에는 Smarty의 동작 방식과 여러 상황에 맞는 설정 방법들에 대해 소개하도록 하겠다.
조한석 (자유기고가, 마이크로소프트웨어)
2002/09/27
'PHP와 템플릿'이라는 주제는 'PHP와 OOP'와 더불어 많은 PHP 프로그래머에게 가장 뜨거운 감자 중 하나임에 틀림없다. "손쉽게 HTML 문서를 만들어낼 수 있는 삽입 언어(Embedded Language)인 PHP에서 굳이 템플릿 방식의 코딩을 해야 하는가? 그것은 웹 애플리케이션 작성을 너무 어렵게 한다"라는 의견과 "삽입 언어인 PHP는 디자인과 로직의 경계가 명확하지 않고, 프로그래머와 디자이너가 분리된 환경에서는 작업 능률을 떨어뜨린다"라는 두 가지 견해는 극히 개인적인 취향에 좌우되는 것이기에 어느 쪽이 옳다고 판단할 수 없다. 필자가 이 글을 읽는 PHP 프로그래머에게 하고 싶은 말은 자신에게 맞는 방법과 도구를 찾으라는 것이다(굳이 말하자면 필자는 많은 템플릿 옹호론자 중 한 사람이다). 그럼 앞으로 6회에 걸쳐 Smarty라는 멋진 템플릿 엔진에 대해 소개하도록 하겠다.
'어설픈' 템플릿은 사용하지 말자 필자는 마소 Jr.에서 PHP 강좌를 진행하면서 템플릿 개념이 아직 완전하지 않던 시절에 작성된 템플릿 엔진(FastTemplate이나 PHPLib의 템플릿 엔진)과 유사한 형태를 갖고 있었던 PEAR의 IT(IntegratedTemplate) 클래스를 소개한 적이 있다. 다음의 <리스트 1>은 중첩된 동적 블럭을 사용한 IT 템플릿과 그것을 제어하는 PHP 코드인데, 템플릿 내의 동적 블럭 구조를 제어하기 위한 반복문이 들어가야 함을 알 수 있을 것이다. '디자인과 코드의 분리'라는 숭고한 목적은 어디로 갔을까? 불행히도 IT 클래스를 포함한 대다수의 템플릿 엔진은 이것을 제대로 지키지 못해 템플릿 예찬론자들을 쑥스럽게 만드는 것이 사실이다.

그리고 많은 시스템 부하가 걸리기 마련인 서버 상에서 똑같은 HTML을 만들어 내는데, 한가롭게 정규표현식을 갖고 문장을 탐사하고 있는 것은 CPU와 메모리의 부담을 생각하지 않는 '사치'라고도 할 수 있다(<그림 1> 참조). 분명히 템플릿이라는 개념과 무관하게 작성된 순수한 PHP 스크립트는 빠르다. 하지만 템플릿 엔진을 사용하고 있는 PHP 스크립트라면 얘기가 달라진다. 아마도 템플릿 엔진에서 템플릿을 처리하느라 정규표현 함수에서 낑낑대다가 겨우겨우 출력물을 만들어 보고하는 동안 PHP 코드는 이미 웹 서버에게 대여섯 번은 출력물을 보고하고 있을 것이다. 이것 역시 기존의 그리고 대다수의 템플릿 엔진이 갖고 있는 한계였다.



<리스트 1> 중첩된 동적 블럭을 사용한 템플릿과 PHP 코드
it.tpl 1  <html>
2   <table border>
3  <!-- BEGIN row -->
4   <tr>
5  <!-- BEGIN cell -->
6 <td>
7   {DATA}
8   </td>
9  <!-- END cell -->
10   </tr>
11  <!-- END row -->
12  </table>
13 </html>

it.php 1 <?php
2 require_once "HTML/IT.php";
3
4 $data = array
5 (
6    "0" => array("Stig", "Bakken"),
7    "1" => array("Martin", "Jansen"),
8    "2" => array("Alexander", "Merz")
9    );
10
11    $tpl = new IntegratedTemplate("./");
12    $tpl->loadTemplatefile("it.tpl", true, true);
13
14    // 템플릿의 동적 블럭을 처리하기 위해
15    // PHP 코드가 템플릿의 구조를 따라가야만 한다.
16    foreach($data as $name) {
17      foreach($name as $cell) {
18      // Assign data to the inner block
19      $tpl->setCurrentBlock("cell") ;
20      $tpl->setVariable("DATA", $cell) ;
21      $tpl->parseCurrentBlock("cell") ;
22    }
23    // Assign data and the inner block to the
24    // outer block
25    $tpl->setCurrentBlock("row") ;
26    $tpl->parseCurrentBlock("row") ;
27 }
28 // print the output
29 $tpl->show();
30 ?>

Smarty란 무엇인가? 앞에서 말한 것을 다시 한 번 반복하자면, PHP 코드는 분명히 빠르다. 그렇다면 템플릿을 실행시킬 때마다 매번 정규표현을 사용해가며 출력물을 만들기보다는 차라리 처음 실행할 때 PHP 코드로 컴파일해 주고, 다음부터는 컴파일된 템플릿을 PHP가 직접 실행하도록 하면 어떨까? 이것이 ISPI라는 회사의 PHP 프로그래머들이 만든 Smarty라는 템플릿 엔진의 핵심이다(<그림 2> 참조). 그렇다고 Smarty가 단순히 다른 템플릿 엔진보다 빠르기만 한 녀석이었다면 필자에게 관심의 대상이 될지언정 열광의 대상은 될 수 없었을 것이다. 템플릿 엔진의 '실행시 성능과 효율'도 중요하지만 이미 말한 것처럼 템플릿을 사용하는 애초의 목적은 디자인과 로직의 분리이다. "Smarty는 디자인과 로직의 분리를 완벽하게 가능하게 해 주는가"라는 질문에 필자는 적어도 여타의 템플릿 엔진보다는 체계적이라고 말해 줄 수 있을 것 같다. 여타의 경쟁자들에 비해 빠르고 또한 체계적인 Smarty의 특징들을 매뉴얼에 있는 그대로 옮겨보면 다음과 같은데, 들여다보면 볼 수록 PHP와 Smarty의 관계는 자바와 JSP와의 관계와 동작 방식에서 약간의 차이는 있지만, 개념적으로는 비슷하다는 것을 알 수 있을 것이다(JSP에서는 jsp 파일들이 요청의 대상이 되지만, smarty 템플릿들이 요청의 대상이 되는 것이 아니라 이를 처리하는 PHP 스크립트가 요청의 대상이 된다).


◆ 놀라울 정도로 빠르다.
◆ PHP 파서로서 동작하기 때문에 효율적이다.
◆ 템플릿 파일을 파싱하는 오버헤드가 없고, 오직 한 번 컴파일하는 시간이 필요할 뿐이다.
◆ 템플릿 파일들이 바뀌는 경우만 재 컴파일을 수행할 정도로 영리하다.
◆ 커스텀 함수와 커스텀 변수 변환자를 추가해서 템플릿 언어를 손쉽게 확장할 수 있다.
◆ 템플릿 태그 문법을 {}, {{}}, 와 같이 사용하고 싶은 것으로 바꿀 수 있다.
◆ {if}와 같은 동적 블럭 문장을 원하는 대로 복잡 혹은 간단하게 중첩시켜 만들 수 있다.
◆ Section이나 If와 같은 동적 블럭을 중첩하는데 제한이 없다.
◆ 템플릿 파일에 PHP 코드를 내장하는 것도 가능하다(이것을 권장하는 것은 아니다).
◆ 내장된 캐싱 시스템을 지원한다.
◆ 독자적인 템플릿 소스들을 갖고 있다.
◆ 캐싱 핸들링 함수를 커스텀화하는 것이 가능하다.
◆ 플러그인을 추가하는 것이 가능하다.



Smarty 설치하기 Smarty는 'the compiling template engine for PHP'이다. 두말할 나위 없이 Smarty를 설치하기 이전에 여러분은 PHP를 설치하고 설정하는 방법을 알아야 한다(하지만 이 글에서는 이 부분에 대한 설명을 하지 않는다). 그렇다면 PHP는? PHP는 어쨌거나 'Server-side scripting language'이므로(예전 매뉴얼에는 PHP를 이렇게 기술했지만 최근의 매뉴얼에서는 'General-purpose scripting language'로 바뀌었다) 여러분들은 PHP와 연동이 가능한 웹 서버를 설치하고 설정하는 방법에 대해서도 알고 있어야 한다. 이 부분 역시 여러분들이 이미 알고 있다고 가정하겠다. MySql과 같은 데이터베이스는? 이건 Smarty하고는 별 상관이 없고 그다지 필요하지 않으며 분명한 것은 4.0.6 이상의 버전의 PHP가 꼭 필요하다는 것이다(필자는 이 글의 내용을 PHP 4.2.2에서 테스트했다).

또한 여러분이 운영하고 있는 OS 환경의 파일 퍼미션에 대해 이해하고 있어야 한다. 특히 파일의 소유주와 쓰기 퍼미션의 관계에 대한 이해가 정말로 필요하다. 모든 OS에 대한 것을 설명하기에는 필자에게 주어진 시간과 환경이 허락하지 않는 관계로 리눅스 환경(RedHat 7.3)을 중심으로 설명할 것이다. 하지만 아마도 유닉스 계열의 환경이라면 대부분 그대로 따라하는 것으로 Smarty 설치와 설정을 끝낼 수 있다. 제일 먼저 Smarty를 구해야 할 텐데, 가장 최근의 Smarty는 http://cvs.php.net에서 CVS로 존재하고 있고 가장 최신의 릴리즈된 버전은 http://smarty.php.net/download.php에서 구할 수 있다.

◆ http://smarty.php.net/do_download.php?download_file=Smarty-2.3.0.tar.gz

가장 최근 버전은 앞에 나온 대로 2.3.0인데 다음처럼 압축을 풀기 전에 여러분이 루트 권한을 갖고 있는지 확인해 보기 바란다. 루트 권한이 없다면 뒤에 나오는 계정 사용자를 위한 설치 방법을 읽어야겠지만, 그렇다고 해도 여러분들이 지금부터 진행되는 글을 읽지 않고 넘어가면 곤란해질 수도 있다.

$ tar xvzf Smarty-2.3.0.tar.gz
$ cd Smarty-2.3.0


Smarty-2.3.0 디렉토리 안을 살펴보면 몇몇 클래스 파일들과 디렉토리들이 있는데, 다음 나열되는 파일들은 Smarty 템플릿 엔진을 정상적으로 하기 위해 꼭 필요한 것들이다.

◆ Smarty.class.php
◆ Smarty_Compiler.class.php
◆ Config_File.class.php
◆ debug.tpl
◆ plugins/* (디렉토리 안의 모든 파일)

이 파일들을 적절한 디렉토리로 옮겨 보겠다. 필자의 경우 '/usr/share/php/Smarty'를 타겟으로 삼았는데 별다른 이유는 없고, 단지 '/usr/share/php' 디렉토리 안에 PEAR가 있었기 때문이다(PEAR에 대한 관심이 큰 필자의 입장에서 볼 때는 불만인 것 중 하나는 Smarty가 당분간 PEAR 안으로 이사갈 것 같지는 않아 보인다는 점이다).

$ mkdir /usr/share/php/Smarty
$ cp -rf *.class.php debug.tpl plugins/ /usr/share/php/Smarty

설정이 끝난 후 여러분의 PHP 스크립트에 포함하는 것이 필요한데, Smarty는 클래스의 경로 문제를 해결하기 위해 두 가지 방법을 제공한다. 우선 첫 번째 방법은 여러분의 PHP include_path에 '/usr/share/php/Smarty'를 추가하는 것이다(다음은 필자의 PHP 설정 내용이므로 여러분의 시스템에 맞게 수정하기 바란다).

◆ include_path = ".:/usr/share/php/PEAR:/usr/share/php/Smarty"

이런 후 PHP 스크립트 앞 부분에 다음과 같이 적어주면 PHP 실행기는 자동으로 'Smarty.class.php' 파일을 찾을 수 있을 것이다(만약 서버 모듈로서 PHP를 사용중이라면 웹 서버를 재 가동시켜야 한다).

require_once("Smarty.class.php");
$smarty = new Smarty;

혹은 PHP 스크립트에 SMARTY_DIR 상수를 정의한 후 이것과 함께 'Smarty.class.php'를 불러오는 방법을 사용할 수도 있는데, 이 때 SMARTY_DIR에 정의되는 경로는 여러분의 OS에 맞는 것이야 하고 또한 끝에 반드시 슬래시를 붙여줘야 한다. 참고로 앞의 방식대로 SMARTY_DIR을 지정하지 않는 경우, 이 상수는 자동으로 'Smarty.class.php'가 위치한 디렉토리가 지정되게 된다(이 방식을 사용할 경우 웹 서버를 재 가동시키지 않아도 된다).

define("SMARTY_DIR", "/usr/share/php/Smarty/");
require_once(SMARTY_DIR . "Smarty.class.php");
$smarty = new Smarty;

기본적인 Smarty 환경 설정하기 보통의 템플릿 엔진이라면 아마도 여기서 적당한 템플릿 디렉토리를 만들고 바로 템플릿 예제들과 이를 제어하는 PHP 코드들에 대해 설명해야 할 테지만, Smarty를 정상적으로 가동시키기 위해서는 아직 먼 길을 가야 한다. 앞에서 $smarty라는 객체를 만들었는데, 이것은 다음과 같은 뜻을 가진 멤버 변수들을 포함하고 있다.

◆ $config_dir : 템플릿에서 찾을 설정 파일들이 위치한 디렉토리를 가리킨다(템플릿에서 사용하지 않는 한 필요 없는 디렉토리이다).
◆ $template_dir : 스크립트에서 찾을 템플릿 파일들이 위치한 디렉토리를 가리킨다(필수적인 디렉토리지만 쓰기가 가능할 필요는 없다).
◆ $compile_dir : 컴파일된 템플릿들이 위치할 디렉토리를 가리킨다(필수적이고 쓰기가 가능해야 한다).
◆ $cache_dir : 캐시된 템플릿 결과물이 위치할 디렉토리를 가리킨다(캐쉬 기능을 사용할 경우 필요하고 쓰기가 가능해야 한다).


각 멤버 변수들이 가리키는 디렉토리를 사전에 만들어주고 일부 디렉토리는 쓰기가 가능해야 한다. 필자는 이 디렉토리들을 '/var/www/php/Smarty/'라는 디렉토리 하에 만들 생각인데, 이것 역시 여러분의 취향에 따라 달라질 수 있다. 하지만 아무리 취향이 그렇다고 해서 이들 디렉토리를 문서 루트 디렉토리처럼 외부로부터 접근이 가능한 디렉토리 아래에 두는 것은 가급적 피하는 것이 좋다. 그리고 참고로 이들 멤버 변수들에 별도로 값을 지정하지 않는다면 기본적으로 현재 실행중인 스크립트의 디렉토리 밑에 있는 './configs/', './templates/', './templates_c/', './cache/' 디렉토리가 지정되게 된다.

$ mkdir /var/www/php
$ mkdir /var/www/php/Smarty
$ cd /var/www/php/Smarty
$ mkdir configs templates templates_c cache

앞과 같이 디렉토리를 만든 후 templates_c와 cache 디렉토리의 소유주를 여러분이 사용하고 있는 웹 서버가 작동할 때의 프로세스와 소유주를 일치시키고 쓰기가 가능하도록 파일 퍼미션을 수정하는 과정을 거쳐야 한다. 보통의 유닉스에서는 nobody:nobody이지만, 필자가 사용하는 것은 apache:apache인 것처럼 이것은 시스템마다 다르므로 여러분은 사용하고 있는 웹 서버 프로세스의 소유주와 그룹 아이디를 확인한 뒤 각자에 알맞게 수정하기 바란다.

$ chown apache:apache templates_c/ cache/
$ chmod 770 templates_c/ cache/

그런데 앞과 같이 파일 퍼미션을 주면 일반 사용자가 셸 상에서 Smarty 템플릿 엔진을 시험하는 스크립트를 작동시킬 때는 templates_c/와 cache/에 쓰기가 불가능하므로 Smarty에서는 컴파일 시 쓰기 에러를 내고 작동을 멈추게 된다. 이런 이유로 아래처럼 모든 유저가 쓰기가 가능하도록 수정할 수도 있으나, 시스템 보안상 썩 바람직한 것은 아니다.

$ chmod 777 templates_c/ cache/

Smarty가 제대로 동작하는지 확인하기
이제는 Smarty가 제대로 설치되고 설정됐는지 확인해 볼 차례이다. <리스트 2>의 index.php 파일을 여러분의 문서 루트 디렉토리에 옮겨 놓고, <리스트 3>의 index.tpl 파일은 앞에서 만든 '/var/www/php/Smarty/templates'에 옮기고 나서 웹 브라우저를 통해 index.php를 수행시켜 보길 바란다. 브라우저에 'Hello, Sizer!'라는 메시지를 받으면 지금까지 제대로 따라왔다는 것이고 그렇지 않다면 무엇인가를 놓치고 진행했다는 소리다. 처음으로 돌아가서 차근차근 잘 따라했는지 확인해야 할 것이다.

<리스트 2> index.php
1 <?php
2
3 require_once("Smarty.class.php");
4
5 $smarty = new Smarty;
6 $smarty->caching = true; // 캐쉬 기능을 활성화시킨다.
7
8 $smarty->assign("Name","Sizer");
9 $smarty->display("index.tpl");
10
11 ?>

<리스트 3> index.tpl
1 <HTML>
2 <TITLE>Hello</TITLE>
3 <BODY>
4    Hello, {$Name}!
5 </BODY>
6 </HTML>

계정 사용자를 위한 Smarty 설치와 설정 방법 앞에서 소개한 Smarty 설치 방법은 루트 권한을 가진 사용자만을 고려한 것인데, 계정 사용자의 경우 어떻게 Smarty를 설치하고 설정하면 좋은지 알아보도록 하겠다. 일단 여러분의 사용자 웹 디렉토리를 '$HOME/ public_htm/''으로, Smarty를 설치할 곳은 '$HOME/php/Smarty'로 가정하도록 하겠다. 임의의 디렉토리에 Smarty 압축 파일을 풀었다면 다음과 같이 우선 Smarty를 설치하도록 하자.

$ cd ~
$ mkdir php
$ mkdir php/Smarty
$ cd /your/smarty/source/path
$ cp -rf *.class.php debug.tpl plugins/ ~/php/Smarty

물론 '∼/php/Smarty'가 PHP 설정 파일(php.ini)의 include_path 항목에 포함돼 있을 가능성은 전무하고 또한 서버 관리자에게 이것을 include_path로 걸어달라고 해도 맞지 않을 게 뻔하므로 SMARTY_DIR 상수를 PHP 스크립트에 정의하는 방법을 사용해야 한다. 여기서 앞의 내용을 잘 읽어봤다면 적어도 'templates_c/' 디렉토리가 어딘가에 존재해야 하고 또한 쓰기 가능해야 한다는 것을 눈치챌 것이다. 일단 필요한 디렉토리들은 다 만들어 보자.

$ cd ~/php/Smarty
$ mkdir configs templates templates_c cache

여기서 'templates_c/'와 'cache/'를 어떻게 처리해야 할지 잠시 고민을 해야 하는데, 한순간의 편의를 위해 아무나 쓰기 가능하도록 하는 것은 위험 부담이 너무 크므로 관리자에게 이 디렉토리들의 소유주와 퍼미션을 웹 서버와 일치시켜달라는 부탁 메일을 날리는 방법이 제일 안전할 것이라고 생각할지도 모르겠다. 하지만 이 방법에는 큰 단점이 있는데, 'templates_c/' 디렉토리의 소유주가 웹 서버이므로 Smarty가 임시로 만든 컴파일 파일들을 마음대로 지울 수가 없다는 점이 그것이다. 만약 여러분이 'templates_c/' 아래 디렉토리에 생긴 파일들을 지우고 싶다면 따로 PHP 스크립트를 작성한 뒤 웹 서버를 통해 그것을 실행시켜야 한다(Smarty 클래스에는 이런 기능을 수행하는 메쏘드가 있으며, 나중에 설명하도록 하겠다).

그래도 다소 불편하다고는 하지만 'templates_c/' 디렉토리의 파일 퍼미션을 777로 만들어서 위험을 자초할 필요는 없지 않을까라고 생각하는 사람도 있을 것이다. 여기서 한 가지 유용한 팁을 소개하자면, 우선 Smarty가 템플릿을 오직 한 번 컴파일하고 그 다음에는 컴파일된 PHP 코드를 실행시킨다는 점을 떠올려 보자. 이렇게 컴파일된 PHP 코드를 실행시키는 데는 읽기 권한만 있으면 족하다. 쓰기 권한이 필요한 이유는 최초의 컴파일 결과인 PHP 코드를 'templates_c/' 디렉토리 아래에 저장해 놓기 위해서일 뿐이다.

그러므로 일단 'templates_c/' 디렉토리의 권한을 우선은 777로 만든 다음 테스트를 하다가 템플릿과 PHP 코드가 완전하다고 생각될 때, 'templates_c/' 디렉토리의 쓰기 권한을 봉쇄하는 방법(chmod -R 755 "templates_c"정도의 명령)을 사용할 수 있다. 단, 이 방법은 주기적으로 내용이 업데이트되어야 하는 'cache/' 디렉토리에는 사용할 수 없다. 하지만 그렇다고 계정 사용자는 캐시 기능을 안전하게 사용하지 못 하는 것은 아니다. 캐시가 꼭 필요한 계정 사용자의 경우 저장 장소를 파일이 아닌 데이터베이스로 바꾸는 방법을 사용할 수도 있기 때문이다.

<리스트 4>는 지금까지의 설정 내용을 테스트하기 위해 Smarty 클래스의 객체 $smarty를 생성한 뒤 각각의 멤버변수들을 하나하나 일일이 수동으로 수정해 사용하고 있는데, 사실 이것보다 더 간편하면서도 유용한 방법이 있다.

<리스트 4> user_index.php
1 <?php
2
3 define(SMARTY_DIR, "/home/users/sizer/php/Smarty/");
4 require_once(SMARTY_DIR . "Smarty.class.php");
5
6 $smarty = new Smarty;
7
8 $smarty->config_dir = SMARTY_DIR . "configs";
9 $smarty->template_dir = SMARTY_DIR . "templates";
10 $smarty->compile_dir = SMARTY_DIR . "templates_c";
11 $smarty->cache_dir = SMARTY_DIR . "cache";
12
13 $smarty->assign("Name","Sizer");
14 $smarty->display("index.tpl");
15
16 ?>

서로 다른 애플리케이션을 위한 Smarty 설정법 이제는 여러분들도 Smarty를 설치하고 설정하는 방법에 대해 어느 정도 감을 잡았으리라 생각되므로, 바로 실제 웹 애플리케이션에 맞는 설정 방법까지 알아보겠다. 만일 여러분이 Smarty를 이용한 게시판을 만들고 있다고 가정해 보자. <리스트 4>처럼 수동으로 해도 잘 동작하지만, 클래스의 가장 큰 장점 중 하나인 상속을 이용하면 좀더 쉽게 할 수 있는 방법이 있다. <리스트 5>의 Smarty_Board.class.php의 내용을 살펴보면, Smarty 클래스를 상속한 Smarty_Board 클래스가 생성자를 호출할 때 매개변수로 넘긴 테마의 종류에 따라 필요한 디렉토리의 설정을 한 번에 끝마치는 것을 알 수 있다. 그리고 실제 게시판의 초기화 루틴이 들어있는 board.php에서 테마를 선택하기 위해 GET으로 넘어온 'theme'를 검사하는 방식을 사용했는데, 이것은 관리자가 관리하기에 적절한 설정 파일을 맞출 수 있을 것이다.


물론 설정 시 필요한 디렉토리들은 지금까지 설명한 방법대로 만들면 되지만, 필자가 웹에서 구한 설정 스크립트를 약간 수정한 버전('이달의 디스켓'을 통해 제공)을 사용하면 다음과 같이 좀더 간단하게 할 수 있다. 이것은 물론 루트 상태에서 한 것이지만, 일반 사용자들도 사용할 수 있다. 강좌가 진행되는 동안 더욱 괜찮은 smarty-setup.sh를 만들어서 여러분들에게 제공하도록 하겠다.

◆ mkdir /var/www/template
◆ mkdir /var/www/template/Board
◆ mkdir /var/www/template/Board/default
◆ cd /var/www/template/Board/default
◆ /usr/sbin/smarty-setup.sh


<리스트 5> Smarty를 상속해서 환경을 설정하는 방법
Smarty_Board.class.php 1 <?php
2
3 if (false == defined(SMARTY_DIR)) {
4    define(SMARTY_DIR, "/usr/share/php/Smarty/");
5 }
6
7 if (false == defined(BOARD_DIR)) {
8    define(BOARD_DIR, "/var/www/template/Board/");
9 }
10
11 class require_once(SMARTY_DIR . "Smarty.class.php");
12
13 Smarty_Board extends Smarty {
14
15    function Smarty_Board($theme) {
16      $this->Smarty();
17
18      $this->template_dir = BOARD_DIR . "${theme}/templates";
19      $this->compile_dir = BOARD_DIR . "${theme}/compiled_templates";
20      $this->config_dir = BOARD_DIR . "${theme}/configs";
21    }
22 }
23
24 ?>

borad.php 1 <?php
2
3 require_once("Smarty_Board.class.php");
4
5 if (false == isset($_GET["theme"])) {
6    $theme = "default";
7 }
8 else {
9    $theme = &$_GET["theme"];
10 }
11
12 $smarty = new Smarty_Board($theme);
13
14 // .......
15
16 ?>

Smarty 소개를 마치며 이번 시간에는 Smarty에 간략하게 소개하고 설치와 설정하는 방법에 대해 알아봤다. 순수한 PHP 프로그래머를 지향하는 경우라면 결코 알고 싶지 않은 부분이기도 하지만, 여러분과 함께 일하는 디자이너와의 원활한 의사소통을 위해서, 혹은 보다 새로운 Smarty의 문법들을 만들어내기 위해서 Smarty의 템플릿 언어에 대해 알아둘 필요가 있다. 그럼 다음 시간에는 Smarty의 템플릿 문법 요소에는 어떤 것들이 있는지 소개하도록 하겠다. @

참고자료
  http://smarty.php.net/, Smarty 공식 웹 사이트
  http://smarty.incutio.com/, Smarty 커뮤니티
  http://pear.php.net/, Pear 공식 웹 사이트
  http://www.php.net/, PHP 공식 웹 사이트

Posted by 나현재

2004/11/23 11:33 2004/11/23 11:33
,
Response
1 Trackbacks , 0 Comments
RSS :
http://j.finfra.com/tt/rss/response/126

[php]Smarty QuickStart Guide

출처 - http://www.phpschool.com/bbs2/inc_view.html?id=7186&code=tnt2&start=0&mode=search&field=title&search
http://blog.naver.com/hitennisman/100000593395

내용 추가-

1. php.ini => include_path = ".;F:\Inetpub\_program\smarty"
2.


- php 프로세스가 templates_c를 write할 수 있도록 users가 templates_c를 수정할 수 있게 해 주었으나 보안상의 문제점은 상존한.(<-해결해야할 문제)



Smarty 메뉴얼을 번역하기 전 준비운동으로 먼저 이 문서를 번역해 봤습니다.
(세시간밖에 안 걸린 날림 번역이라 오역이 있을 수도있습니다. ^^;)
classroom에 올려야 할지 Tip & Tech에 올려야 할지 고민하다가 그냥 이곳으로
올립니다.

역자 : 조한석

역자의 변
---------

메뉴얼도 아니고 가이드이므로 되도록 너무 딱딱하지 않게 원문의 뜻을 훼손하지 않는 범
위에서 직역보다는 의역으로 번역했습니다(그런 이유로 거북한 느낌을 가질 분도 생길지도
모르지만 그에 대해서는 책임지지 않겠습니다. 잘못 번역 된 부분의 있다면 위의 메일 주
소로 연락 부탁드리며, 특별히 사이트에서 참조하고 싶으신 분은 역자의 신상을 그대로 유
지하는 한 얼마든지 가능합니다(특별히 역자에게 허락을 받을 필요는 없고, 알려줄 필요도
없지만, 해 주면 고맙겠죠. ^^;).




SMARTY QUICKSTART GUIDE (Smarty 빠르게 시작하기)
------------------------------------------------

Smarty QuickStart Guide(Smarty 빠르게 시작하기)에 오신 것을 환영해요~ 이 가이드는
Smarty에 처음 발을 적시는 당신에게 Smarty가 어떻게 동작하는지 안내해 줄 거랍니다.

우리는 여기서 몇 가지 가정을 해볼 생각인데요. 당신이 이미 웹 서버에 PHP를 어떻게 설
치해야 하는지라던가, Unix 파일 퍼미션들에 대한 기초지식이나 그리고 PHP가 어떻게 동작
한다든지 등에 대한 기초지식을 가지고 있어야 하겠지요. 만약 당신이 Unix 환경이 아닌
곳에서 Smarty를 사용하고 있다면 당신은 자신의 OS와 관련된 파일 파미션 시스템이 Unix
와 어떤 차이점을 가지고 있는지 알고 있을 필요가 있답니다.


INSTALLATION (설치하기)
-----------------------

Smarty 압축 파일을 풀면 당신은 Smarty.class.php, Smarty_Compiler.class.php,
Config_File.class.php 그리고 "plugins" 디렉토리 같은 여러 파일들을 볼 수 있을 텐데
우선 이 모든 파일들을 당신의 PHP include_path에 지정되어 있는 디렉토리 어딘가에 옮
길 필요가 있어요. 그러고 나서 PHP 스크립트에[역주: 원문에서는 PHP 스크립트라고 하
는 대신 "your application"이라고 했지만, 이 편이 더 이해가 빠를 것 같아 이렇게 번역
했습니다] require("Smarty.class.php") 문장을 적어주면 해당 클래스를 찾을 수 있게 되
겠지요. 음, 하지만 다른 방법으로 당신의 PHP 스크립트에 SMARTY_DIR 상수를 설정하는 방
법도 있어요. Smarty 클래스 파일들이 위치한 패스가 있는 디렉토리들은 이 두 가지 방식
을 사용할 수 있는데, 여기서 매우 중요한 것 하나는 SMARTY_DIR 패스를 지정할 때는 끝에
슬래쉬를 꼭 붙여야 한다는 것이겠죠!

자 그럼 이제 실제로 당신의 웹 서버의 Document Root 디렉토리 어딘가로 시야를 옮겨 보
도록 하지요. 이 가이드에서는 당신이 웹 서버의 Document Root에 만들 디렉토리 이름으
로 Smarty를 사용할 텐데, 모든 작업은 여기에서 이루어지고 있음을 잊지 마세요.


$> cd /home/htdocs
$> mkdir Smarty
$> cd Smarty


다음 차례는 Smarty가 사용할 디렉토리들을 만들 차례가 되겠군요.


$> mkdir templates
$> mkdir templates_c
$> mkdir configs


Smarty는 쓰기가 가능한 templates_c 디렉토리를 필요로 한답니다. 그러므로 당연히 당신
은 해당 디렉토리를 웹 서버 유저(보통 Unix에서는 "nobody:nobody"이 사용되고 Max OS에
서는 "www:www"이 사용되지요.[역주:레드햇 리눅스에서는 "apache:apache"가 사용됩니다])
가 쓰기가 가능하도록 해당 디렉토리의 소유주와 퍼미션을 아래와 같이 고쳐주어야겠지요.

물론 당신은 'chmod 777'을 사용할 수도 있어요. 음 그렇지만, 글쎄요. 많은 사용자들이
사용하는 시스템에서는 보안 문제도 있고 하니 별로 권장하고 싶지는 않군요. 이것에 대
해서는 메뉴얼에서 보다 많은 정보를 찾아보는 것이 좋을 것 같군요.


$> chown nobody:nobody templates_c
$> chmod 700 templates_c
$> ls -l
drwxrwxr-x 2 user group 512 Jan 18 14:18 configs/
drwxrwxr-x 2 user group 512 Jan 18 14:18 templates/
drwx------ 2 nobody nobody 512 Jan 18 14:18 templates_c/


위와 같이 하거나 덜 안전한 방법으로 아래와 같이 해 줄 수도 있어요.


$> chmod 777 templates_c
$> ls -l
drwxrwxr-x 2 user group 512 Jan 18 14:18 configs/
drwxrwxr-x 2 user group 512 Jan 18 14:18 templates/
drwxrwxrwx 2 user group 512 Jan 18 14:18 templates_c/


자 이제 당신은 index.php와 templates/index.tpl이라는 두 개의 파일을 만들 차례가 되
었네요. 물론 index.php는 당신의 웹 브라우져에서 부를 수 있는 것이어야겠지요.

index.tpl은 Smarty가 템플릿 파일로서 사용할 파일인데, 이것은 브라우져에서 직접 엑세
스되지는 않고, 오직 Smarty 클래스에 의해서만 접근된답니다[역주:실제로 위와 같이 하
면 웹 서버에 특별한 설정을 추가하지 않는 웹 브라우져를 통해 접근할 수 있습니다].


--------- index.php --------
$smarty->assign("name","ned");
$smarty->assign(array(
"firstname"=">" "ned",
"lastname"=">" "flanders",
"address"=">" new smarty;
$smarty->assign("name","ned");
$smarty->assign(array(
"firstname"=">" "ned",
"lastname"=">" "flanders",
"address"=">" "55555";
$smarty->assign("zipcode",$zipcode);
$smarty->display("index.tpl");
?>

--------- templates/index.tpl --------
{include file="header.tpl" title="Home Page" }
hello, {$name}!

{$firstname}, {$lastname}

{$address}, {$zipcode}
{include file="footer.tpl" }

--------- templates/header.tpl --------




--------- templates/footer.tpl --------




우리가 포함한 header.tpl에 어떻게 "title"이라는 변수를 넘겨주고 있는지 주목해 보세
요. 당신은 이런 식으로 당신이 원하는 더 많은 변수들을 넘겨줄 수 있어요. 포함된 템플
릿 파일들은 현재 템플릿 변수들을 모두 물려받게 되고 또한 위와 같이 넘겨진 변수들도
가지게 되는데, 이렇게 넘겨진 변수들은 오직 포함된 템플릿 파일에만 유효한 변수가 되
지요[역주: 함수에 넘겨진 변수는 함수 내에서만 접근되고 그 다음 사라지듯이 smarty도
템플릿에서 포함한 파일로 이루어지는 변수 전달을 같은 방식으로 처리한다는 뜻입니다].

그리고 templates/header.tpl에서 $title 변수를 어떻게 출력하는지도 주목할 필요가 있
겠지요. 이것은 "default"라고 불리는 변수 변환자[역주: "variable modifier"가 원문인
데 변수 치환자라고 할까 하다가 이렇게 번역했습니다]를 사용한 모습이랍니다.

{$title}이라는 문장이 $title로 대입된 변수가 없으면 아무것도 하지 않는데 반하여
{$title|default:"no title"}이란 문장은 $title로 대입된 변수가 없어도 앞의 경우처럼
빈둥거리는 대신 "no title"이라는 출력을 수행한답니다.


if/elseif/else
--------------

아래 에제는 매우 직접적인 문법을 보여주고 있을 뿐이랍니다. 메뉴얼에서 좀 더 자세하
게 이 문법에 대해 설명해 주니까 좀 더 알고 싶은 분은 메뉴얼을 참조하도록 하세요.


--------- templates/index.tpl --------
{include file="header.tpl" title="Home Page" }
{if $name eq ""}
hello, noname!

{elseif $name eq "ned"}
hello, neddy!

{else}
hello, {$name}

{/if}

{$firstname}, {$lastname}

{$address}, {$zipcode}
{include file="footer.tpl" new smarty;
$smarty->assign("firstname",array("ned","bart","montgomery"));
$smarty->assign("lastname",array("flanders","simpson","burns"));
$smarty->display("index.tpl");
?>

--------- templates/index.tpl --------
{include file="header.tpl" title="Home Page" }
{section name="people" loop="$FirstName}">
There were {$smarty.section.people.loop} names in this list.
{include file="footer.tpl"}


여기서 템플릿 내에서 사용된 {$smarty}라는 변수에 대해서 소개할 필요가 있을 것 같네
요. section 내에서 출력되는 변수들을 주목해 보세요. 이처럼 section 내에서 출력할 변
수들은 모두 반드시 섹션 이름으로 참조될 필요가 있음을 잊지 마세요. 이것은 당신이 출
력하고 싶은 값을 배열에서 현재 반복 횟수를 가지고 찾기 위해 필요한 거에요. 또한 내
부 템플릿 변수들을 가지고 현재 반복 중인 section의 총 반복횟수와 현재 반복 횟수 같
은 것도 출력이 가능하답니다. {sectoinelse}도 중요한 건데, 이것은 만일 반복할 배열인
$FirstName이 빈 배열의 경우 대신 출력되는 부분이 된답니다.

그리고 아래 예제에서 사용된 문법처럼 배열의 키들을 가지고 접근할 수도 있어요.


--------- index.php --------
require("Smarty.class.php");
$smarty = new Smarty;
$smarty->assign(array("ContactInfo" =>
array(
array("FirstName" => "Ned","LastName" => "Flanders"),
array("FirstName" => "Monty","LastName" => "Burns")
)
));
$smarty->display("index.tpl");
?>


--------- templates/index.tpl --------
{include file="header.tpl" title="Home Page"}
{section name=people loop=$ContactInfo}
{$ContactInfo[people].FirstName}
{$ContactInfo[people].LastName}

{sectionelse}
There are no values to loop through.
{/section}


There were {$smarty.section.people.loop} names in this list.
{include file="footer.tpl"}


혹은 아래 예제처럼 당신은 복합 중첩 section 문을 시도해볼 수도 있답니다.


--------- index.php --------
require("Smarty.class.php");
$smarty = new Smarty;
$smarty->assign("FirstName",array("Ned","Bart","Montgomery"));
$smarty->assign("LastName",array("Flanders","Simpson","Burns"));
$smarty->assign("ContactNames",
array(
array("email","home","cell"),
array("email","home"),
array("email","home","fax")
));
$smarty->assign("ContactVals",
array(
array("ned@simpsons.com","555-666-7777","555-444-3333"),
array("bart@simpsons.com","555-111-2222"),
array("monty@simpsons.com","555-888-9999","555-234-5678"),
));

$smarty->display("index.tpl");
?>


--------- templates/index.tpl --------
{include file="header.tpl" title="Home Page"}
{section name=people loop=$FirstName}
{$smarty.section.people.rownum} {$FirstName[people]} {$LastName[people]}

{section name=contacts loop=$ContactNames[people]}
{* for fun, lets bold every other row *}
{if $smarty.section.contacts.rownum is even}{/if}
{$ContactNames[people][contacts]}: {$ContactVals[people][contacts]}

{if $smarty.section.contacts.rownum is even}
{/if}
{/section}


{sectionelse}
There are no values to loop through.
{/section}


There were {$smarty.section.people.loop} names in this list.
{include file="footer.tpl"}



FOREACH (반복문)
----------------

특별히 당신이 오직 한 가지 변수를 통해 반복문을 만들고 싶다면, 그런 당신을 위해 좀
더 쉬운 방법으로 연관배열을 반복시킬 수도 있는데, 이를 보여주는 아래 예제는 Smarty
와 함께 제공하는 디폴트 index.php에서 작동하는 템플릿인데,


{foreach name=outer item=contact from=$contacts}
{foreach key=key item=item from=$contact}
{$smarty.foreach.outer.iteration}. contact {$key}: {$item}
{/foreach}
{foreachelse}
no contacts
{/foreach}


여기서 가능한 속성들로는 다음과 같은 것들이 있어요[역주: 아래의 item, key, from은
PHP에서는 foreach($array as $key=>$item)와 각각 대입된다고 생각하시면 됩니다]

from: 반복의 대상이 되는 배열
item: 배열의 현재 요소를 가리키는 변수의 이름
key: 배열의 현재 키를 가리키는 변수의 이름(선택적)
name: foreach의 이름 (선택적)

그리고 당신이 만일 'name'을 사용한다면 다음과 같이 보다 다양한 foreach 속성들을 추
가할 수도 있으며[역주: first, last, show는 무슨 소리를 하고 있는지 잘 모르겠습니다.
메뉴얼에도 이 부분은 설명한 게 없고요. 실제 예제를 작성해 봐야 알 것 같군요. --;],

name: foreach의 이름
iteration: 현재 반복 횟수
total: 반복할 전체 횟수
first: if it's first iteration
last: if it's last iteration
show: if foreach was shown at all

아래 있는 템플릿은 foreach의 모든 속성들을 출력해 주는 예제랍니다[역주:두번째
foreach 문장에서 $smarty.foreach.outer가 from 속성의 값으로 지정된 것을 주목하
시기 바랍니다. 여기에 contact를 지정한 경우 전혀 다른 출력이 나옵니다].


{foreach name=outer item=contact from=$contacts}
{foreach key=key item=item from=$smarty.foreach.outer}
{$key}: {$item}
{/foreach}
{/foreach}


자, 이제 Smarty에 들여놓은 당신의 발은 어느 정도 충분히 적셔졌을 거에요. 그러나, 아
직 config 파일 변수들이나, built-in 함수들, 커스텀 함수들, 변수 변환자 같은 굵직굵
직한 공부거리가 남아 있답니다. 지금 당장 메뉴얼을 읽으러 가세요[역주: 각종 템플릿
라이브러리 중에서 가장 방대한 양을 자랑하는 메뉴얼입니다. ^^;]. 메일링 리스트에도
가입하시는 것이 좋겠지요. 그럼 앞으로도 Smarty를 즐기시기를!!


역자가 추가한 문서 내 리소스
Smarty 웹 사이트 : http://smarty.php.net
Smarty 메일링 리스트 아카이브
일반: http://news.php.net/group.php?group=php.smarty.general
개발: http://news.php.net/group.php?group=php.smarty.dev
CVS: http://news.php.net/group.php?group=php.smarty.cvs

Posted by 나현재

2004/11/23 11:33 2004/11/23 11:33
,
Response
0 Trackbacks , 0 Comments
RSS :
http://j.finfra.com/tt/rss/response/125


블로그 이미지

Insufficient memory! So,Blog is my 2nd Brain!

- 나현재

Notices

Archives

Authors

  1. 나현재

Calendar

«   2012/02   »
      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      

Site Stats

Total hits:
202429
Today:
0
Yesterday:
18