저는 대부분의 소스들은 단순히 함수로만 제작하여 쓰고 있지만,
페이징기법처럼 여러가지 함수를 동시에 사용해야 될 경우에는 아래처럼
클래스를 도입하고 있습니다.
이 클래스의 장점이라고 한다면, 정렬 기능이 잘 되어 있다는 것입니다.
흔히들 타이틀을 눌렀을때, 오름, 내림차순으로 정렬 되는 기능을 구현하는 내용은
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); }
'PHP∵SCRIPT' 카테고리의 다른 글
주요사이트들의 링크인기도 를 가져와서 보여주기 (0) | 2014.04.13 |
---|---|
사이트 방문경로와 검색한 단어 알기 (0) | 2014.04.13 |
문장에서 특정단어에 효과주기마스터 (0) | 2014.04.13 |
PHP를 이용한 이미지 사이즈 편집마스터 (0) | 2014.04.13 |
멀티 파일 업로드 예제 (Flex2+PHP) (0) | 2014.04.12 |
플래시 파일 정보 얻어오는 소스(PHP) (0) | 2014.04.12 |
문자열을 X로 마킹하는 함수 (0) | 2014.04.12 |
PHP 코드를 최적화하는 40가지 팁 (번역) (0) | 2014.04.11 |
댓글