본문 바로가기

페이징- 다중 정렬 : 오름, 내림, 보통

반응형

저는 대부분의 소스들은 단순히 함수로만 제작하여 쓰고 있지만,
페이징기법처럼 여러가지 함수를 동시에 사용해야 될 경우에는 아래처럼
클래스를 도입하고 있습니다.

이 클래스의 장점이라고 한다면, 정렬 기능이 잘 되어 있다는 것입니다.
흔히들 타이틀을 눌렀을때, 오름, 내림차순으로 정렬 되는 기능을 구현하는 내용은
CSS환경에서는 대체로 구현이 잘되어 있지만, 웹에서는 많이 찾아 보기 힘든
내용인것 같습니다.

아래는 사용예제입니다.

< ?
/////////////////////////== 데이타처리 페이지이며, 선언부에 올려줍니다.
// 페이지 초기값 생성
$nowpg = ($nowpg) ? $nowpg : 1;

// 인스턴트 생성
$sql = new ListManager();

// 옵션
// 한화면에 보여줄 줄수 및 한 화면에 보여줄 페이지 및 이전, 다음, 처음, 끝 태그 셋팅
$sql->page_setting(15, 10, "<img src='./img/btn_page_first.gif' border='0' align='absmiddle'>", "  이전", "다음  ", "<img src='./img/btn_page_last.gif' border='0' align='absmiddle'>");

// 옵션
// 정렬하겠다고 맘 먹었다면 사용해 주세요.
// 차례대로 버튼 눌렀을때 색, 안눌렀을때 색, 내림차순, 오른차순 모양입니다.
$sql->sort_setting("#FF0000", "#6699CC", "△", "▽")

// 데이타 검색시 사용되는 예는 아래와 같으며, 기본적으로 아래 항목만 쓰이게 됩니다.
//
// $boardtable : 테이블명 (조인시 tablea, tableb 와 같은식으로 나열)
// $nowpg : 상수값 (변수 바꾸지 마세용)
// BF_delete='N' : 기본조건 (검색을 안한 상태에서의 조건절을 입력해 줍니다.)
// $findquery : 검색시 사용 (조건에 따라 변하는 조건을 입력해 주세요. 예) BF_name like '%검색어%')
// BF_index desc : 정렬 방식 (다중으로 가능합니다. 예) BF_index desc, BF_no asc)
$sql->ListDatabase($boardtable, $nowpg, "*", "BF_delete='N'", $findquery, "BF_index desc");

// 검색된 값을 배열로 받아오는 처리과정 (2차원배열로 받아짐, 받아오는형식- $rows[인덱스][DB필드명])
$rows = $sql->data();

// 옵션 : 출력시 바로 뿌려줘도 됨
// 이전, 다음, 처음, 끝, 페이지 정보를 가지고 있음 (개인으로 쓸 경우 아래에서 메소드를 직접 호출 예) $sql->pg_next())
$page = $sql->page();

// 옵션 : 출력시 바로 뿌려줘도 됨
// 기본조건으로 찾은 검색 라인수
$total = intval($sql->total());

// 옵션 : 출력시 바로 뿌려줘도 됨
// 검색조건으로 찾은 검색 라인수
$find = intval($sql->find());

// 옵션
// 만일 현재 페이지가 1보다 크게 가 있는데 데이타가 없다면 1페이지로 돌려 줘야 겠죠?
if($nowpg != 1 && count($rows)==0) {
    $nowpg = $sql->page_all;
    tomove(url_clear("$_SERVER[REQUEST_URI]&nowpg=$nowpg"));
}

/////////////////////////== 출력페이지
?>
< table>
< tr>
    <td>NO</td>
    <!-- 차례대로 타이틀명, 정렬할 필드, 초기정렬타입 입니다. -->
    <td><?=$sql->sortting("이름별정렬", "BF_name", "asc")?></td>
    <td><?=$sql->sortting("등록시간별정렬", "BF_insert_time", "desc")?></td>
    <td></td>
< /tr>

< ? for($i=0, $count=count($rows); $i<$count; $i++) { ?>
< tr>
    <!-- _facing 필드를 주게 되면, 정해진 규칙에 의해 인덱스 순서로 정렬해 준다. -->
    <td><?=$rows[$i][_facing]?></td>
    <td><?=$rows[$i][BF_name]?></td>
    <td><?=$rows[$i][BF_insert_time]?></td>
< /tr>
< tr align="center">
    <td colspan="2"><?=$page?></td>
< /tr>

< ? } if($count == 0) { ?>
    <tr align="center">
        <td colspan="2"><font color="red">데이타가 검색되지 않았습니다.</font></td>
    </tr>
< ? } ?>

< /table>



< ?
/************************************************************************************
아래부터는 실제로 사용할수 있게 하는 소스입니다
*************************************************************************************/
class ListManager {
    var $ords='', $url='', $urlqry='', $href_first='', $href_next='', $query_str='';
    var $nowpg=1, $line_num=10, $page_num=10, $find='', $total=0, $page_first=0, $page_last=0, $page_all;
    var $button_first='[처음]', $button_pre='[이전]', $button_next='[다음]', $button_last='[끝]';
    var $onbg='#FF0000', $offbg='#6699CC', $str_asc='△', $str_desc='▽';

    function ListDatabase($tbname, $nowpg, $flds="*", $whrs="", $fndqry="", $ords="", $grps="") {
        global $_SERVER, $_GET;
        
        $geturlkey = &$_GET[sortfldkey];
        $geturlarrow = &$_GET[sortfldarrow];
        $arykey = explode(",", $geturlkey);
        $aryarrow = explode(",", $geturlarrow);
        $cnt=0; while($cnt<count($arykey)) {
            if($arykey[$cnt] && $aryarrow[$cnt]) {
                $ords_tmp[] = "$arykey[$cnt] $aryarrow[$cnt]";
            }
            $cnt++;
        }
        if($ords) $ords_tmp[] = $ords;
        if(count($ords_tmp)) { $ords = implode(",", $ords_tmp); }
        if($ords) $ords = "order by $ords";

        $cnt_fld="count(*)";
        $this->nowpg = $nowpg;
        $this->ords = $ords;
        $this->url = $_SERVER[PHP_SELF];
        $this->urlqry = $_SERVER[QUERY_STRING];

        if($whrs) { $whrs = "where $whrs"; }
        if($grps) {
            $cnt_fld = "count(distinct $grps)";
            $grps = "group by $grps";
        }
        if($fndqry) { $fndqry = "and $fndqry"; }
        if($this->urlqry) { $this->urlqry = "$this->urlqry&"; }

        if($this->nowpg <= 0) { $this->nowpg = 1; }

        //검색된카운트
        $query = "select $cnt_fld cnt from $tbname $whrs $fndqry";
        $res = query($query);
        $row = mysql_fetch_row($res);
        $this->find = $row[0];

        //전체카운트
        $query = "select $cnt_fld cnt from $tbname $whrs";
        $res = query($query);
        $row = mysql_fetch_row($res);
        $this->total = $row[0];

        //현재스텝
        $sp_now = ceil($this->nowpg / $this->page_num);
        //전체스텝
        $sp_all = ceil($this->find / ($this->page_num*$this->line_num));
        //전체페이지
        $this->page_all = ceil($this->find / $this->line_num);
        //현재스텝의 첫페이지
        $this->page_first = 1 + ($sp_now-1) * $this->page_num;
        //현재스텝의 끝페이지
        $this->page_last  = $this->page_first + $this->page_num - 1; if($this->page_last > $this->page_all) $this->page_last = $this->page_all;

        //처음버튼
        if($this->nowpg > 1) { $this->href_first = $this->urlqry . "nowpg=1"; }
        //이전버튼
        if($sp_now > 1) { $this->href_pre = $this->urlqry . "nowpg=" . ($this->page_first - $this->page_num); }
        //다음버튼
        if($sp_now * $this->line_num * $this->page_num < $this->find) { $this->href_next = $this->urlqry . "nowpg=" . ($this->page_last + 1); }
        //마지막버튼
        if($this->page_all != $this->nowpg) { $this->href_last = $this->urlqry . "nowpg=$this->page_all"; }

        //데이타 검색
        $limit_first = ($this->nowpg - 1) * $this->line_num;

        $this->query_str = "select $flds from $tbname $whrs $fndqry $grps $this->ords limit $limit_first, $this->line_num";
        $query = &$this->query_str;
        $res = query($query);
        $i = 0;
        while($row = mysql_fetch_assoc($res)) {
            $row["_facing"] = $this->total - ($limit_first + 1) - ($i - 1);
            $this->view[] = $row;
            $i++;
        }
    }

    //페이지설정 셋팅
    function page_setting($line=10, $page=10, $first="[처음]", $pre="[이전]", $next="[다음]", $last="[끝]") {
        $this->line_num   = $line;
        $this->page_num   = $page;
        $this->button_first = $first;
        $this->button_pre   = $pre;
        $this->button_next  = $next;
        $this->button_last  = $last;
    }

    //정렬설정 셋팅
    function sort_setting($onbg="#FF0000", $offbg="#6699CC", $str_asc="△", $str_desc="▽") {
        $this->onbg = $onbg;
        $this->offbg   = $offbg;
        $this->str_asc  = $str_asc;
        $this->str_desc  = $str_desc;
    }

    //정렬
    function sortting($subject, $sortfld, $base_arrow="asc") {
        global $_SERVER, $_GET;

        $geturlkey = &$_GET[sortfldkey];
        $geturlarrow = &$_GET[sortfldarrow];
        $geturlflag = &$_GET[sortfldflag];

        $arykey = explode(",", $geturlkey);
        $aryarrow = explode(",", $geturlarrow);
        $arrflag = explode(",", $geturlflag);

        $arrow_ary_img = array("asc"=>$this->str_asc, "desc"=>$this->str_desc);
        $arrow_ary_rep = array("asc"=>"desc", "desc"=>"asc");

        //초기값호출
        $cnt=0; while($cnt<count($arykey)) {
            if($sortfld == $arykey[$cnt]) {
                $tmp_urlkey = $arykey[$cnt];
                $tmp_urlarrow = $arrow_ary_rep[$aryarrow[$cnt]];
                $tmp_urlflag = $arrflag[$cnt];
                $arrow = $arrow_ary_img[$aryarrow[$cnt]];
            }
            else if($arykey[$cnt] && $aryarrow[$cnt]) {
                $urlkey[$arykey[$cnt]] = $arykey[$cnt];
                $urlarrow[$arykey[$cnt]] = $aryarrow[$cnt];
                $urlflag[$arykey[$cnt]] = $arrflag[$cnt];
            }
            $cnt++;
        }
        $urlkey[$sortfld] = $tmp_urlkey;
        $urlarrow[$sortfld] = $tmp_urlarrow;
        $urlflag[$sortfld] = $tmp_urlflag;

        //초기값셋팅
        if(!$urlkey[$sortfld] && $urlflag[$sortfld] != 2) {
            $urlkey[$sortfld] = $sortfld;
            $urlarrow[$sortfld] = $base_arrow;
            $urlflag[$sortfld] = 0;
        }

        switch($urlflag[$sortfld]) {
            case 1:
                $urlflag[$sortfld]++;
                break;

            case 2:
                unset($urlkey[$sortfld]);
                unset($urlarrow[$sortfld]);
                unset($urlflag[$sortfld]);
                break;

            default :
                $urlflag[$sortfld]++;
                unset($arrow);
                break;
        }

        if(count($urlkey)) { $sortfldkey = implode(",", $urlkey); }
        if(count($urlarrow)) { $sortfldarrow = implode(",", $urlarrow); }
        if(count($urlflag)) { $sortfldflag = implode(",", $urlflag); }

반응형

댓글


Copyright ⓒ SmartWeb All rights reserved.