조금 색다른 스킨처리 방식을 소개할까한다.
먼저 말하자면, 서버 부하나 이런것에 대한 고려는 전혀 이루어지지 않았다. 단지, 디자이너가 쓰기 편한 그래서 내가 손을 대지 않아도 되는 방법을 생각하다가 나온 꽁수에 가까운 방법이기 때문이다. 하지만 실제로 내가 하는 개발은 다 이딴식으로 이루어지고 있다.
난...
같은 일 두번하는게 정말 싫다. -_-;;
.
.
.
보통 최근 게시물을 만들때 "따로" 만들어진 파일에 스킨도 박아넣고 iframe 이나 혹은 조금 이해하기 어려운 구조로 최근게시물을 사용한다. 그래서, 자신의 작업물과 분위기를 맞추기 위해서 많은 삽질을 한다.
다음 코드를 보자.
< ?php
// Define skin pattern
define('SKIN_PATTERN', ';(.*)|\{([a-z_]+)\};isU');
// MySQL Connection
$conn = mysql_connect('localhost', '*****', '****');
mysql_select_db('*****');
function skin_start($page, $table)
{
global $current_table, $skin_page;
$current_table = 'gb_write_'.$table;
$skin_page = $page;
ob_start();
}
function skin_end()
{
global $current_table, $skin_data, $skin_page;
$skin = ob_get_contents();
ob_end_clean();
$skin_data = array();
$res = mysql_query('SELECT wr_subject as subject, wr_id, UNIX_TIMESTAMP(wr_datetime) as regdate FROM '.$current_table.' WHERE wr_comment=0 order by wr_id desc limit 0, 5');
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
if (strlen($row['subject']) > 30) {
$row['subject'] = mb_strcut($row['subject'], 0, 30).'...';
}
$row['link'] = $skin_page.'?wr_id='.$row['wr_id'];
$row['date'] = date('m/d', $row['regdate']);
$skin_data[] = $row;
}
$skin = preg_replace_callback(SKIN_PATTERN, 'skin_callback', $skin);
echo $skin;
}
function skin_callback($m)
{
global $skin_data;
static $rowidx;
if ($m[1]) {
switch ($m[1]) {
case 'nodata':
if (count($skin_data) > 0) return '';
else return preg_replace_callback(SKIN_PATTERN, 'skin_callback', $m[2]);
case 'data':
$loop = count($skin_data);
if ($loop == 0) return '';
else {
$ret = ''; $rowidx = -1;
while (++$rowidx < $loop) {
$ret .= preg_replace_callback(SKIN_PATTERN, 'skin_callback', $m[2]);
}
return $ret;
}
case 'new':
if ($skin_data[$rowidx]['regdate'] + (86400*3) < time()) return '';
else return $m[2];
}
} elseif ($m[3]) {
return $skin_data[$rowidx][$m[3]];
}
}
?>
조금 길어보이지만 그런것엔 신경쓰지 말고 그 다음엔 사용법을 보자.
아래에 최근게시물이 들어갑니다.
<s:nodata>게시물이 없습니다.</s:nodata>
<s:data>- <a href="{link}">{subject}</a> <s :new>*</s:new></s:data>
위쪽이 최근게시물입니다.
s: 로 시작하는 태그들이 바로 템플릿의 블럭이고 {}와 같은 형식을 지닌게 변수들이다.
보통 메인페이지로 만들게 되는 index.html 에서 최근게시물을 사용할 부분만 저렇게 처리해주면 된다. 페이지의 제일 상단에 함수등의 정의를 위해 include 'latest.php' 를 해주는 것 외에는 딱히 못쓸것이 없다는 거다.
보통 디자이너들이 작업할때는 하나의 전체페이지를 만들어내고 많은 개발자들이 그것을 다시 쪼개는 작업을 하고 있다. 하지만 이 방식대로라면... 디자이너에게 간단한 몇가지의 교육만으로도 개발자는 손을 털 수 있다. 그리고 그것이 내가 궁극적으로 지향하는 목표이다.
만약, 조금 더 많은 데이타를 뽑아와야 한다면 그저 latest.php 라는 파일만 살짝 손봐주고 변수나 블럭명만을 디자이너에게 알려주면 된다. 지긋지긋한 HTML 코드를 안봐도 되고 디자이너가 CSS를 잘쓰니 못쓰니 따위의 스트레스받는 논쟁은 더 이상 안해도 되는 것이다.
지금 개발중인 게시판이며 많은 프로그램들을 이런식으로 처리하고 있는데, 물론 내가 개발하는 것들이란게 규모가 뻔한 것들이라서 그런지는 몰라도 속도의 차이는 크게 느끼지 못했다. 벤치마킹해본 적은 물론 없다.
이런 방식을 가리켜 나름대로 "인라인 스킨처리법" 이라고 부르고는 있는데, 의외로 쓸만한 방식인 듯 하다.
그렇다면 인덱스 페이지에서 사용하는 여러번의 쿼리질을 다해야 하는가? 라는 물음에 좀 더 자신있게 답하기 위해서 생각한 것이 바로 캐싱기법이다. 이에 대해선 클래스를 만들고 있으니 다음에 올리도록 하겠다.
PHP코드에서는 스마티 탬플릿 클래스에 출력을 완전히 위임해버리는 방식도 있지요. 개인적으로는 TT의 방식보다는 스마티의 방식을 더 선호하는 편입니다.
디자이너와 함께 작업을 할 수록 느끼는 것은...
내가 편해지려면 디자이너가 사용하기 쉬워야 한다는 것입니다.
스마티.... 솔직히 디자이너가 쉽게 이해하고 쓸 수 있을만한 수준인가요?
html 코딩작업 할수 있느냐에 따르겠죠..^^
나물 // HTML 코딩이 전제조건이 되어야 하겠지요. 하지만, 문제는 저 개념 자체를 제대로 받아들이지 못한다는 겁니다. 프로그래머에서 웹디자인으로 클래스전직(RPG?)한 웹디자이너와 예술(?)인에서 웹디자이너로 전직한 사람과 차이가 꽤 마니 납니다. 예술인에서 웹디자인으로 클래스 전직(RPG!)한 웹디자이너에게 한참을 설명하다가 포기했습니다. 끄응..--;;;;;