Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: soojung 0.4: 템플릿 제작에 대한 헛소리

내용으로 바로 넘어 가기


TokigunStudio3

228 / 3282   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

soojung 0.4: 템플릿 제작에 대한 헛소리

2005/03/01 AM 02:57 | 개발/soojung | 5 comments | 0 trackbacks | AllBlog: vote, to pocket

최근 soojung에 템플릿이 많이 생기면서 프로그램 한 군데 고치면 여기 저기 찾아 다니면서 고쳐야 하는 일이 많이 생기고 있다. 오늘 같은 경우도 그랬는데, 프로그램 코드 수준에서 그냥 htmlspecialchars를 해 버리는 걸 보고 몇 군데 고쳤더니 해당하는 부분의 템플릿에서 escape modifier를 몽창 넣어 줘야 하는 것이었다. -_-; 그래서 결국 미친 척 하고 가능한 모든 곳에 저걸 추가해 줬더니 커밋 로그가 산더미처럼 나온다 -_-;;;;

이런 삽질을 한 고로, 혹시나 soojung 용 템플릿을 만드실 분께서 주의하셔야 할 것이나 몇 가지 팁 등등을 요약해 보았다. :)


1. escape modifier를 꼭 넣어 두자.

xhtml에서 <나 > 같은 문자 들어 가면 꼭 &lt;나 &gt; 등으로 entity를 넣어 줘야 한다. xhtml validation 안 되는 걸 막으려면 꼭 escape 해 줘야 하는데, smarty의 경우 {$variable|escape} 하면 된다. 다음 몇 가지 예외만 빼고는 escape를 넣어 주는 게 좋겠다. (0.4.6 cvs 버전 api 기준)

- $baseurl, $skin: 혹시 의심간다면 넣어 주는 것도 나쁘진 않다.
- $title, $description: classes/Template.class.php에서 이미 escape 해 줬다.
- $entry->getDate(), $comment->getDate(), $blogid, 등등: 별도의 modifier를 사용하거나 언제나 숫자라던지 그런 것들은 쓸데없이 escape 할 필요가 없다.
- $entry->getBody(): 별도의 formatter가 모든 작업을 다 해 준다. 사용자가 잘못 입력했으면... 씁, 어쩔 수 없지.
- $comment->getBody(): 입력 과정에서 이미 escape 된다. 사실 별로 마음에 들지는 않지만 하위 호환성 때문에 그냥 냅뒀다 -_-
- $calendar->getCalendar(): ...이걸 escape하는 사람은 없으리라 믿는다;
- $referer: classes/Soojung.class.php에서 escape한다. 다른 곳에 쓰일 일이 없기 때문에 일부러 남겨 놓았다.
- $license_link, $soojung_version: 별로 할 말 없다(...)
- 기타 등등


2. 템플릿 파일의 구성

사실 soojung에서 실제로 필요한 템플릿 파일은 index.tpl과 entry.tpl 뿐이다. (각각 index.php와 entry.php에 대응) 하지만 유지보수를 쉽게 하려면 적당한 수준에서 잘라 주는 것도 나쁘진 않아 보인다. header.tpl/footer.tpl 정도는 나눠 주는 센스를 발휘하자. (사실 기본 템플릿들이 모조리 이러니 따라 하기만 하면 땡이다 -_-)

참고: 옛날에 쓰던 sendping.tpl은 0.4.5부터 관리자 모드로 들어 갔으므로 기를 쓰면서 만들려고 하지 말자 -_-;;;


3. soojung의 api를 이해하자.

smarty는 말은 템플릿 엔진이지만 실제로 템플릿들을 보면 죄다 api를 사용하고 있는 걸 볼 수 있다. (물론 직접 처리하는 것보다야 낫다만) 좀 더 많은 기능을 구현하고 싶다면 api를 이해하는 것이 좋다. soojung의 api는 크게 어려운 편은 아니지만 이 글을 쓰는 시점에서는 문서화가 영 제대로 된 게 아니라서(...) 이해하기 어려운 것도 좀 있을 것 같다. 몇 가지 예시를 들어 보면 이런 것들이 있다.

- 공통된 메소드들: getHref() 같은 메소드들은 많은 클래스에 공통으로 들어 가 있다. 해당 객체가 가리키는 주소를 알아 낼 때는 거의 다 getHref를 쓰면 되겠다. 그 외에 date 속성(이나 getDate() 함수) 등등도 여기에 포함된다.
- $entry->category->name: 여기서 $entry->category는 문자열이 아니라 Category 객체이다. 덤으로 카테고리 페이지를 쓰고 싶다면 $entry->category->getHref()를 쓰면 되겠다. 이를 악용(?)하면 해당 글과 같은 카테고리에 있는 글들을 보여 줄 수도 있겠다.
- $entry->isSetOption(): 트랙백이나 댓글 보여 줄 지 안 보여 줄 지 확인할 때 쓴다. 여기에 대해서는 다음 장에서 조금 더...
- $bookmark->image: 현 시점에서는 대부분의 템플릿이 놀려 두고 있는(?) 속성이지만 북마크에다가 아이콘을 표시한다던지 하는 용도로 쓸 수 있다.


4. smarty를 이해하자.

smarty가 다른 템플릿 엔진에 비해서는 상당히 느린(...이라고 해서 1초 2초 걸리는 건 아니지만) 편이긴 하지만 대신 훨씬 유연하기도 하다. soojung 템플릿의 많은 부분이 smarty를 사용하고 있기 때문에 응용하면 여러 가지 활용을 할 수 있다.

- date_format modifier: soojung api에서 반환하는 모든 날짜 표시는 unix timestamp이다. 이것을 보기 좋은 문자열로 고쳐 주는 것이 date_format인데, php의 strftime 함수를 사용하므로 자기 입맛에 맞게 출력될 내용을 바꿀 수 있다. 예를 들어서 "2004년 12월 25일" 식이라면 "%Y년 %m월 %j일"이라고 하면 된다. (살짝 문제가 있긴 하지만)
- include: 저기 위에서 템플릿 파일을 여러 개로 나눌 수 있다고 했는데, 이 때 include를 쓴다. 참고로 include를 하면서 변수를 넘겨 주는 것도 가능하다. (simplebalance 템플릿을 참고하라)
- 설정 파일: smarty의 또 다른 특징은 설정 파일을 만들 수 있다는 것이다. 설정 파일을 부르는 것은 config_load를 사용하고, 거기서 나온 변수는 #variable# 형태로 사용할 수 있다. 이 역시 simplebalance 템플릿을 참고하라 (-_-;)
- foreach~else: 템플릿에서 대부분의 루프 구현은 foreach를 사용하는데, foreach의 내부 내용이 한 번도 출력되지 않으면 else 뒤의 내용을 대신 출력하게 되어 있다. 레이아웃을 깨지게 하지 않게 한다거나 할 때 유용하다.
- $smarty 내부 변수: 이 변수를 사용하면 현재 루프를 몇 번 돌았냐 등등의 정보를 얻어 낼 수 있다. 예를 들어서 아래 코드 같은 것이 가능하다. (템플릿의 과다 사용-_-이라고 하기도 하지만 필요할 때가 꼭 있게 마련이다)
{foreach name=loop from=$arr item=$var}
   {if $smarty.foreach.loop.first}<div id="loop">{/if}
   <p>{$smarty.foreach.loop.iteration}. {$var|escape}</p>
   {if $smarty.foreach.loop.last}</div>{/if}
{else}
   <p id="noloop">no iteration</p>
{/foreach}
- 달력 레이아웃 고치기: 별로 권장하는 방법은 아니지만(근데 다른 방법이 없다;) 달력에서 요일이 영문으로 나오는 게 싫다면 이런 방법을 쓸 수 있다. (smarty의 capture 함수를 쓴다)
{capture assign=$calendar}{$calendar->getCalendar()}{/capture}
{$calendar|replace:'<th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th>':'<th>일</th><th>월</th><th>화</th><th>수</th><th>목</th><th>금</th><th>토</th>'}
- 그 외에 smarty의 내장 함수들을 사용하면 여러 가지 효과가 가능하다.


그 외에도 몇 개 더 있을 것 같은데 밤도 깊어 가고 귀찮기도 하고 머리도 아프니 이 쯤에서 끝내기로 하자. -_-;; 아, 물론 이 모든 것들을 몰라도 템플릿은 누구라도 만들 수 있다는 걸 기억하자 :) 단지 배포하거나 할 사람들이 신경써야 할 거라는 거지.

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=516

Comment: 디토 (2005/03/01 AM 07:48)

토끼군: 저번에 simplebalance 템플릿에서 escape 뺐어요. 왜냐하면 이미 htmlspecialchars 함수가 적용되어있었거든요. ~_~

Comment: ydhoney (2005/03/01 AM 08:23)

아흠..수정은 객체지향이 아니야? =ㅅ=? 저렇게 일일이 고쳐야하다니..아흠..(물어보기만 하지 소스를 보기가 귀찮다.)
그리고 댓글 달려고 댓글버튼 누르니까 Name에 디토..라고 뜨네;; 왜 그르지..=ㅅ= 사용자에게서 쿠키값을 받는게 아니라 그냥 최근에 댓글 단 사람 이름으로 남는건가? 흐음...난감해..=ㅅ=

Comment: 토끼군 (2005/03/01 AM 11:24)

디토: $entry->title 같은 속성들은 기본적으로 escape 안 해 주는 게 정상이어서 다시 들어 갔어요 -_-;;;
ydhoney: 알 수 없는 일...

Comment: 신현석 (2005/03/01 PM 02:31)

보통 사람들은 글을 작성할때 html 을 사용하지 않나요? 링크 같은 것은 어떻게 거나요? 제가 사용해 본지 얼마 안되서...-_-a 코드레벨에서 escape 해버린다면 낭패

Comment: 토끼군 (2005/03/01 PM 03:20)

신현석: 아... 물론 글 쓸 때는 html이죠. 그래서 $entry->getBody()를 escape하면 절대 안 되는 거고요 -_-;

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).