리스트에서 빠질 수 없는게 페이징 시스템입니다…
[1][2][3][4][5][6][7][8][9][10]
위와 같은 페이지를 누름으로써 그에 대한 리스트만 출력하는 것이지요…
이렇게 하는 이유는 전체의 리스트를 화면에 다 보여준다면 빨리 찾을 수도 없고
속도 또한 느립니다. 그래서 페이지로 구분해놓으면 찾아가기 싶게 됩니다..
여기서는 가장 기본적인 개념으로 페이징 시스템을 구현하겠습니다….
방법은 여러가지니깐 여러 각도로 시도해보는 것도 좋을 듯 합니다….
페이징 시스템에서 필요로 하는 것이
1. 현재 페이지
2. 현재 페이지의 블럭
(블럭은 페이지가 속해있는 그룹입니다. 예를 들어서 한 블럭에는 10페이지가 들어가는데 현재의
페이지가 20 페이지 라면 블럭은 두번째 블럭으로 선택이 됩니다.. 그럼 표시는
[11][12][13][14][15][16][17][18][19][20] 으로 되겠죠…
이렇게 하는 이유는 페이지 또한 무한히 많을 수 있기 때문에 페이지 자체의 페이징 시스템을
만드는 거죠. 그것이 블럭입니다. )
3. 전체 행의 개수
(이것을 알아야지만 현재 페이지가 속해 있는 블럭을 계산 할 수 있습니다. )
4. 현재 페이지의 블럭에서 시작페이지와 끝 페이지
(숫자 더하기, 빼기 계산만 하면 되기 때문에 특별한 건 없습니다.)
5. 한 페이지에 보여질 리스트 수 (limitList)
한 블럭에 보여질 페이지 수 (limitPage)
(위의 두가지가 있어야지 전체적인 계산이 됩니다… ^^ )
이상 위의 다섯가지로 일단은 페이지 시스템에 대해서 보여지는 것이 가능하구여
이제 가상으로 페이징 시스템을 만들어 보겠습니다…
1. 현재의 페이지 : 1페이지
2. 현재의 블럭 : 1블럭
3. 전체 행의 개수(total) : 100
4. limitList : 10, limitPage : 5
이렇게 네개의 구성요소로서 시작을 합니다….
리스트가 젤 처음 보여질 때 페이징 시스템은 1블럭의 1페이지를 가리키고 있어야 합니다..
1. 현재 페이지에서 현재 블럭구하는 방법
block=ceil(page/$limitPage);
=> ceil 함수는 만약 숫자가 4.5라고 하면 올림을 하여 5가 되게 하는 함수입니다.
2. 현재 블럭의 시작 페이지와 끝 페이지
// 현재 블럭이 1블럭이라면 1이지만 2 블럭일때는 11이 되어야 합니다
startPage=(block-1)*$limitPage + 1;
// 마지막 블럭에서 페이지가 총페이지 수 보다 커지면 안되기 때문에
// 미리 총 페이지 수를 구해서 큰지 확인해줍니다.
endPage=startPage + $limitPage – 1;
if (endPage>totalPage ) endPage=totalPage;
3. 총 페이지 수 구하는 방법
totalPage=ceil(total/$limitList);
4. 그럼 페이징 시스템을 출력하는건 간단하죠…
for (i=startPage; i<=endPage; $i++)
{
if (page==i) echo “[$i]“;
else echo “[$i]“;
}
현재 페이지는 찐하게 표시해줍니다. 그럼 기본적인 페이지 표시 시스템이 끝이 납니다.
설마 여기서 끝내는건 아니겠죠.. ^^
아까 블럭이란걸 만들었기 때문에 블럭 자체도 이동할 수가 있어야 겠습니다..
보통 게시판에 보면 ◀, ▶ 이런 화살표로 표시 되거나 prev, next 라는 말로 표시되거나 합니다.
[prev] 1 2 3 4 5 6 7 8 9 10 [next]
그래서 블럭을 옮길 수 있게 됩니다..
1. 현재의 블럭이 어딘지 알고 그 앞에 블럭이 있는지 뒤에 블럭이 있는지를 계산해서 표시합니다
현재 블럭은 위에서 구했기 때문에 넘어가구여
// 현재의 블럭이 앞에 있는 아닌지 검사
if ($block <= 1) echo "";
else echo “[prev]“;
// 위의 페이징 시스템 표시
// 마지막 블럭인지 아닌지 검사
totalBlock=ceil(totalPage/$limitPage);
if (block>=totalBlock) echo ” “;
else echo ["next"];
위와 같이 쉽게 구할 수 있습니다. 이건 완전히 산수네요.. ㅋㅋㅋ
이제 페이징 시스템의 마지막 단계가 남았습니다..
디비 관련 작업입니다.. ^^
정렬한 것에 대해서 그 페이지에 맞는 내용을 가져와야 하기 때문에
여기서는 디비 쿼리 명령중 limit라는게 사용됩니다.
예 : select * from test order by groupNum desc, listNum asc limit start,limitList;
젤 마지막에 변수 두개만 설정 해주면 되는데요,,
두가지 옵션은 처음에는 시작되는 row의 번호구여, 뒤에꺼는 몇개를 얻어올껀지 입니다
0, 5 하면 0번째에서 5개행을 얻어온다는 소리하고 같죠.. ^^
마지막 $limitList는 아까 위에 있는 변수랑 같은 거기 때문에 그 대로 주시면 되구여
$start만 계산하면 됩니다..
계산하는 방법은 1페이지 일때 1에서 10, 2 페이지 일때 11에서 20 이런식으로 된다면
디비에서 row는 0부터 시작하기 때문에 0에서 9, 10에서 19 이런식으로 됩니다. 하나 작죠.. ^^
그럼 어떻게 계산을 하느냐…
(page−1)∗limitList;
어디서 많이 본 공식인데..ㅋㅋ 저위에 보면 블럭의 시작페이지 구하는 공식하고 비슷한데
+1 이 빠졌네요 .. 왜 그렇냐면 1씩 작으니깐요.. ^^ 그래서 +1을 해 줄 필요가 없죠….
그래서
select * from test order by groupNum desc, listNum asc limit 0, 10;
하면 0번째 행에서 10개의 행을 얻어오는것이니 바로 리스트에 적용할 수 있겠죠..
리스트 화면에서는 이것에 대한 처리만 해주면 되구여… ^^
약간씩 복잡해 보일 수도 있지만 실상은 더하기 빼기밖에 없네요.. ^^
우리 모두 게시판을 누워서 떡 먹듯 다루는 그 날까지.. 화이팅.. ^^
ps . 예전에 개발해본적이 있는데 jsp로 다시 할라니 조금 헤멧넹…
암튼 이런 자주 사용하는 로직은 정리가 필수다..