글쓴사람 이성노
글쓴시간2004년 5월 28일 오후 4시 39분 2초
    제목template_ 로 처음짠 게시판 로직 입니다. 함 봐주세요.
<?php
    include "../../_include/Template.class.php";
    include "../../_include/conf.inc";

    $DB = new DB_class;
    $tpl = new Template;

    $type     = $_GET["type"];   

    $nos     = $_POST["no"];            //from post방식
    $id       = $_POST["id"];            //form에서 아이디값을 받는다.
    $title    = $_POST["title"];        //  "      제목을        "
    $comm     = $_POST["comm"];            //  "        내용        "
    $email    = $_POST["email"];        //  "        이메일        "
    $homepage = $_POST["homepage"];        //  "        홈페이지    "
    $pass     = $_POST["pass"];            //  "        비밀번호    "
    $groups     = $_POST["groups"];
    $laver    = $_POST["laver"];
    $date     = date('Y-m-d');            // 글등록 시간 추출   
    $ip         = $_SERVER["REMOTE_ADDR"];// 접속자 아이피 추출

    $no       = $_GET["no"];       //GET방식 보여줄 글번호를 받아온다.
    $page     = $_GET["page"];    //페이지 번호를 받는다.
    $re       = $_GET["re"];      //
           
    if(empty($page)) $page = 1;
    if(empty($type)) $type="list";      //타입 값이 없을때 list 값입력

           
switch($type){

################################글 리스트 부분 시작####################################################
    case "list" :
        $arr = DB_Select("freeboard", "*", 0, $sql_where, "ORDER BY groups desc", $page, $page_sprit);
            $totrecord=TotalRecord("freeboard");  //전체 레코트 수를 구한다.
            $pages = page($totrecord,$page_sprit,"free_in.php");
           
            $page = ($page-1)*10; //글번호 계산하는 부분


            $loop = array();
            $i=0;
            while(is_array($arr[$i])){
                $nbsp = "";
                for($j=0 ; $j < $arr[$i]["laver"] ; $j++){
                        $nbsp .= "&nbsp;&nbsp;&nbsp;";
                }
                $loop[]= array(
                    'url'=>'free_in.php?type=view&no='.$arr[$i]['no'],
                    'no'=>$totrecord-($i+$page),
                    'id'=>$arr[$i]["id"],
                    'date'=>$arr[$i]["dates"],
                    'hit'=>$arr[$i]["hit"],
                    'tit'=>$nbsp.$arr[$i]["title"],
                    );
                $i++;
                }

   

        $tpl->define(array(
                'free_list'=>'freeboard/free_list.tpl',
                'top_menu'=>'menu/top_menu.tpl',
                ));
   
        $tpl->assign(array(
                'title'=>'best sungro homepage',
                'home_url'=>$home_url,
                'loop'=>$loop,
                'page'=>$pages["total"],
               
            ));
   
        $tpl->print_(free_list);
    break;
################################글 리스트 부분 끝####################################################

################################글 쓰기 부분 시작####################################################
    case "write" :
        $tpl->define(array(
                'free_in'=>'freeboard/free_in.tpl',
                'top_menu'=>'menu/top_menu.tpl',
                'down_menu'=>'freeboard/in_menu.tpl',
                'free_js'=>'freeboard/js/freeboard_js.tpl',
                ));

        $tpl->assign(array(
                'title'=>'best sungro homepage',
                'home_url'=>$home_url,
                'loop'=>$loop,
                'view_url'=>"guestbook/gb_write.php",
            ));
        $tpl->print_(free_in);
    break;
################################글 쓰기 부분 끝####################################################

################################글 저장 부분 시작####################################################
    case "input" :
       
        if($groups=="") { //원글 쓰기
            $lever = 0;         //답글이 아니면 들여쓰기 없음           
            $sql = "select max(groups) from freeboard";
            $max_num = $DB->frow($sql);                  //그룹의 최고값을 구해온다.
            $groups = ceil($max_num/100)*100+100;        //가져온 최고값에 100더한다.
           
        }else{ //리필글 쓰기
            $lever = $laver+1;                   //답글 들여쓰기 부분   
            $group = $groups-1;
            $groups_max = ceil($groups/100)*100; //원본글의 넘버를 알아낸다.
            $groups_min = $groups_max-99;        //리필 달수 있는 글 갯수의 끝
            $sql="update freeboard set groups=groups-1";
            $sql .= " where groups < ".$groups." and groups > ".$groups_min;
            $DB->sql($sql);
        }

        $DB->addItem('no','');       
        $DB->addItem('id',$id);          //값을 받아 additem함수를 호출하여 배열에 값을 넣는다.
        $DB->addItem('title',$title);
        $DB->addItem('comm',$comm);
        $DB->addItem('email',$email);
        $DB->addItem('homepage',$homepage);
        $DB->addItem('pass',$pass);
        $DB->addItem('dates',$date);
        $DB->addItem('ip',$ip);
        $DB->addItem('rip',$ip);
        $DB->addItem('groups',$group);
        $DB->addItem('laver',$lever);
           
        $DB->insert('freeboard');

       
        echo "<meta http-equiv=refresh content=0;url=free_in.php>";
       
       
       
    break;
################################글 저장 부분 끝####################################################

################################글 보기 부분 시작####################################################
    case "view" :
        $tpl->define(array(
                'top_menu'=>'menu/top_menu.tpl',
                'free_view'=>'freeboard/free_view.tpl'
                ));
        $sql = "select * from freeboard where no=".$no;
        $arr = $DB->fetchArray($sql);


        $tpl->assign(array(
                'no'=>$arr['no'],
                'id'=>strip_tags($arr['id']),
                'tit'=>strip_tags($arr['title']),
                'email'=>strip_tags($arr['email']),
                'homepage'=>strip_tags($arr['homepage']),
                //모든 태그 허용 금지 및 글 입력시 형태로 출력
                'comm'=>nl2br(strip_tags($arr['comm'],'<a><b><img><font><p><pre>')),
                'ip' =>$arr['ip'],
                'date'=>$arr['dates'],
               
       
                'title'=>'best sungro homepage',
                'home_url'=>$home_url,
                'list_url'=>$home_url.'/php/freeboard/free_in.php?type=list&no='.$no,
                'up_url'=>$home_url.'/php/freeboard/free_in.php?type=update&no='.$no,
                'del_url'=>$home_url.'/php/freeboard/free_in.php?type=delete&no='.$no,
                're_url'=>$home_url.'/php/freeboard/free_in.php?type=reins&no='.$no,
                'view_url'=>"guestbook/gb_write.php",
                ));       
       
        if($arr['rip'] != $ip){
            $DB->pri_key('no',$no);
            $DB->addItem('hit',$arr['hit']+1);
            $DB->addItem('rip',$ip);
            $DB->update('freeboard');
        }
   
        $tpl->print_(free_view);
    break;
################################글 보기 부분 끝####################################################

################################글 수정 글쓰기 부분 시작##############################################
    case "update" :
        $tpl->define(array(
                'top_menu'=>'menu/top_menu.tpl',
                'free_in'=>'freeboard/free_in.tpl',
                'down_menu'=>'freeboard/update_menu.tpl',
                'free_js'=>'freeboard/js/freeboard_js.tpl',
                ));
        $sql = "select * from freeboard where no=".$no;
        $arr = $DB->fetchArray($sql);


        $tpl->assign(array(
                'no'=>$arr['no'],
                'id'=>$arr['id'],
                'tit'=>$arr['title'],
                'email'=>$arr['email'],
                'homepage'=>$arr['homepage'],
                'comm'=>$arr['comm'],
                       
                'title'=>'best sungro homepage',
                'list_url'=>$home_url.'/php/freeboard/free_in.php?type=list',
                'view_url'=>"guestbook/gb_write.php",
            ));
        $tpl->print_(free_in);
    break;
################################글 수정 글쓰기 부분 끝###############################################

################################글 수정 저장 부분 시작################################################
    case "update_ok" :

        $sql = "select pass from freeboard where no=".$nos;
        $arr = $DB->fetchArray($sql);
       
        if($arr["pass"] == $pass){
            $DB->pri_key('no',$nos);
            $DB->addItem('id',$id);          //값을 받아 additem함수를 호출하여 배열에 값을 넣는다.
            $DB->addItem('title',$title);
            $DB->addItem('comm',$comm);
            $DB->addItem('email',$email);
            $DB->addItem('rip',$ip);
            $DB->addItem('homepage',$homepage);
            $DB->update('freeboard');
            echo "<meta http-equiv=refresh content=0;url=free_in.php?type=view&no=$nos>";
        }else{
            script_alert("비밀번호가 틀립니다");
            echo "javascrip:history.back();";
        }           
       
    break;
################################글 수정 저장 부분 끝####################################################

################################글 삭제 비밀번호 입력 시작################################################
    case "delete" :

        $tpl->define(array(
                'top_menu'=>'menu/top_menu.tpl',
                'free_in'=>'freeboard/free_in.tpl',
                'free_js'=>'freeboard/js/freeboard_js.tpl',
                'del_pass'=>'freeboard/del_pass.tpl',
                ));
        $tpl->assign(array(
                'title'=>'best sungro homepage',
                'no'=>$no,
            ));
        $tpl->print_(del_pass);
    break;
################################삭제 비밀번호 입력 끝####################################################

################################글 삭제 부분 시작########################################################
    case "delete2" :

        $sql = "select pass from freeboard where no=".$nos;
        $arr = $DB->fetchArray($sql);
       
        if($arr["pass"] == $pass){
            $DB->pri_key('no',$nos);
            $DB->deletes('freeboard');
            echo "<meta http-equiv=refresh content=0;url=free_in.php>";
        }else{
            script_alert("비밀번호가 틀립니다");
            echo "javascrip:history.back();";
        }       
    break;
################################글 삭제 부분 끝####################################################

################################글 답글 부분 시작##############################################
    case "reins" :
        $tpl->define(array(
                'top_menu'=>'menu/top_menu.tpl',
                'free_in'=>'freeboard/free_in.tpl',
                'down_menu'=>'freeboard/reins_menu.tpl',
                'free_js'=>'freeboard/js/freeboard_js.tpl',
                ));
        $sql = "select * from freeboard where no=".$no;
        $arr = $DB->fetchArray($sql);
   
        $recomm = "\r\r\r\r\r『 ".$arr['id']." 』";
        $recomm .= "\r------------------------------------------------------------------\r\n";
        $recomm .= $arr['comm'].".............";
        $recomm .= "\r\r------------------------------------------------------------------\r\n";

        $tpl->assign(array(
                'no'=>$arr['no'],
                'tit'=>"[re]".$arr['title'],
                'comm'=>$recomm,
                'groups'=>$arr['groups'],
                'laver'=>$arr['laver'],                       
                'title'=>'best sungro homepage',
                'list_url'=>$home_url.'/php/freeboard/free_in.php?type=list',
                'view_url'=>"guestbook/gb_write.php",
            ));
        $tpl->print_(free_in);
    break;
################################글 답글 부분 끝###############################################
}
$DB->DB_close();
?>

템플릿과 제가만든 db_class, 각종함수 function , 를 이용하여 함 만들어 봤습니다..
우선 함수를 많이 사용하였구요
저장, 수정, 함수를 만들어서 addItem의 배열에 담은 다음 insert("테이블명") 호출하면 쿼리문 전부 처리하게 하였습니다. 업데이트도 마찬가지고요.

현제 테스트 사이트는 http://sungro.plusyu.net 입니다.

근제 제가 템플릿 언더바를 제대로 사용했나 하는 궁굼증이 생겨 이렇게 소스와 함께 글을 올리게 되었습니다.  html과 php의 코드 분할은 된것 같은데 어딘가 좀 어설픈.......고수님들과 관리자님의 지적 부탁합니다.

ps db_class 와 각종 함수 파일 필요하신분 있으면 소스 공개해 드리겠습니다.
그럼이만




관리자 이성노님 안녕하세요.

게시판 소스 잘 봤습니다. 수고 많으셨구요.. 템플릿과 관련이 되어 있으니.. 답변을 안할 수 없지만 소스 평가는 뭔가 일거리(?)도 되고 어려운 일이네요.

그냥 언급할 만한 것이 있어서 그 부분만 말씀드리겠습니다. 템플릿뿐 아니라 전체적으로 배열이나 객체를 활용할 여지가 많이 보이거든요.

템플릿에서 배열을 활용했을 때 장단점이 있는데.. 장점은 소스가 짧아진다는 것이고 단점은 개발 레이어간 정보은닉(아래 설명하겠습니다)에 문제가 있다거나 템플릿파일이 좀 더 복잡해진다는 것입니다.


예를 들어..

게시판 테이블 필드가 title, name, 등이라면..

------php------

while ($data = mysql_fetch_assoc($result))
    $loop[]['data'] = $data;
$tpl->assign('list', $loop);

------tpl------

<!--{@ list}-->
    {=substr(list.data.title, 0, 40)}, {list.data.name}, ...
<!--{/}-->

이런 식으로 php 파일이 간단해지고 템플릿내에서 배열과 함수로 원하는 출력을 만들 수 있습니다.


그런데..

[ 데이터베이스 ] - [ 비즈니스로직 ] - [ 템플릿 ]

이런 식으로 개발 레이어를 고려했을 때 최상위 레이어인 템플릿이 최하위 레이어인 디비의 테이블 필드명을 알아야 하니까 인접하지 않은 레이어간 정보은닉(information hiding) 이 되지 않는다는 문제가 있는데.. 개발 레이어를 조금 다른 방식으로 생각해 볼 수 있을 것도 같구요. 이성노님께서 이런 것을 고려했기 때문인지, 아니면 템플릿파일을 간결하게 하기 위해서인지, 아니면 템플릿 언더바의 배열사용법을 몰라서 안쓰신 건지는 모르겠습니다만..

그리고 템플릿 외에 여러 가지 클래스 모듈을 운용했을 때, 모듈간 배열이나 객체로 데이터를 주고 받으면.. 소스가 더 간결하고 이해하기 좋게 되는 것 같습니다.

어쨌든.. 상황에 따라 방법이 달라질 수 있고 스스로 적절하고 만족스럽다고 생각하는 방법을 사용하시면 될 것 같습니다.
04-05-29 23:26
이성노 항상 좋은 답변 감사 합니다.
04-05-30 14:18
    이름
비밀번호
 
Since 2003-03-03 hosted on vultr.com