웹마스터 팁
각 리스트형 위젯에 페이지 기능을 달자.
2008.09.02 14:32
이번 소스모델이 된 위젯은 newest_image(최근 이미지 위젯) 입니다.
최근 이미지 위젯에 페이지 기능을 위한 추가, 수정 파일
: 관리자페이지에서 코드 실행하기전에 이곳으로부터 정보를 입력 받습니다.
./widgets/newest_image/newest_images.class.php <- 입력 받은 정보를 처리
: 입력 받은 정보를 적절히 정리해서 DB로 부터 결과값들을 받고 스킨 처리를 하는 파일
./widgets/newest_image/queries/getOneFileInDocument.xml<- DB Query용 XML 파일
: $page 번호 값에 따라서 결과를 출럭하기 위해 <navigation>에 내용을 추가 해야 합니다.
: 또한 기존 files 모듈에 있던 내용을 위젯에 생성이 필요합니다.
./widgets/newest_image/queries/getOneFileInDocumentCount.xml <- DB Query용 XML 파일
: 결과값용 Query와 다르게 페이지 기능을 만들기 위해 하나의 Query를 더 해야합니다.
./widgets/newest_image/skin/default/list.html <- DB로 부터의 결과를 이용하여 표현하는 스킨 파일
(※ 이미 설명드린 부분(하단참조) 있기 때문에 아래부터는 존칭을 생략 하겠습니다.)
- info.xml -
........ XML 선언 문들......
<options>
<name xml:lang="ko">표시하지 않음</name>
<name xml:lang="jp">非表示</name>
<name xml:lang="zh-CN">不显示</name>
<name xml:lang="en">Hide</name>
<name xml:lang="es">Ocultar</name>
<name xml:lang="ru">Скрывать</name>
<value>N</value>
</options>
</var>
<var id="page_count">
<name xml:lang="ko">페이지 목록수</name>
<type>text</type>
<description xml:lang="ko">출력될 페이지의 수를 정하실 수 있습니다. (기본 5개)</description>
</var>
<var id="page_type">
<name xml:lang="ko">페이지 출력 여부</name>
<type>select</type>
<description xml:lang="ko">페이지를 출력할지 선택하세요.</description>
<options>
<name xml:lang="ko">N</name>
<value></value>
</options>
<options>
<name xml:lang="ko">Y</name>
<value>Y</value>
</options>
</var>
</extra_vars>
</widget>한 페이지 당 출력할 페이지 번호 갯수와, 페이지 출력 여부 설정 값을 입력 받기 위해
page_count, page_type 항목을 선언
- newest_images.class.php -
/* 페이지 네비게이션 기능 추가 */
// 페이지 목록 수 (1,2,3,4....)
$page_count = $args->page_count;
if(!$page_count) $page_count = 5;
$obj->page_count = $page_count;
// 페이지 출력 여부
$page_type = $args->page_type;
// 페이지 번호 구하기
if($page_type=='Y') $obj->page = (Context::get('+
'+
'page'))? Context::get('page'): 1;
// 기존 변수 추가로 저장
$list_count = $obj->list_count;
/* 페이지 네비게이션 기능 추가 끝 */
// 정해진 모듈에서 문서별 파일 목록을 구함
$files_output = executeQueryArray("widgets.newest_images.getOneFileInDocument", $obj);
$output_count = executeQueryArray('widgets.newest_images.getOneFileInDocumentCount', $obj);
...중략...
$z=0;
foreach($files_output->data as $key => $val) {
$files_output->data[$z] = $files_output->data[$key];
unset($files_output->data[$key]);
$z++;
}
...중략...
/* 페이지 네비게이션 기능 추가 */
$widget_info->page_type = $page_type;
$widget_info->total_count = $output_count->data[0]->count; // 전체 개시물 수
$widget_info->page = (!Context::get('page'))? 1:Context::get('page'); // 현재 페이지
// 총 페이지 수
$total_count = $widget_info->total_count/$list_count;
if($widget_info->total_count%$list_count != 0) $total_count+=1;
$widget_info->total_page = floor($total_count); // 총 페이지 수
$widget_info->page_count = $page_count; // 총 페이지 수
/* 페이지 네비게이션 기능 추가 끝 */
...중략...
/**
* @brief 다음 페이지 요청
**/
function WD_getNextPage($total_count, $total_page, $cur_page, $page_count = 10) {
$first_page = $cur_page - (int)($page_count/2);
if($first_page<1) $first_page = 1;
$last_page = $total_page;
if($last_page>$total_page) $last_page = $total_page;
if($total_page < $page_count) $page_count = $total_page;
$GLOBALS['wd_total_page'] = $total_page;
$GLOBALS['wd_first_page'] = $first_page;
$GLOBALS['wd_page_count'] = $page_count;
$GLOBALS['wd_last_page'] = $last_page;
$page->first_page = $first_page;
$page->last_page = $last_page;
return $page;
}
function WD_getNextPage2() {
$page = $GLOBALS['wd_first_page']+$GLOBALS['wd_i'+
']++;
if($GLOBALS['wd_i'] > $GLOBALS['wd_page_count'] || $page > $GLOBALS['wd_last_page']) $page = 0;
return $page;
}
function WD_getNextClear() {
$GLOBALS['wd_i'] = 0;
}newest_images.class.php 파일안에 구석구석 위의 변수가 들어가면 페이지 기능이 완성 된다.
1. 첫번째 페이지 기능을 위한 정보 입력 및 처리
/* 페이지 네비게이션 기능 추가 */
// 페이지 목록 수 (1,2,3,4....)
$page_count = $args->page_count;
if(!$page_count) $page_count = 5;
$obj->page_count = $page_count;
// 페이지 출력 여부
$page_type = $args->page_type;
// 페이지 번호 구하기
if($page_type=='Y') $obj->page = (Context::get('page'))? Context::get('page'): 1;
// 기존 변수 추가로 저장
$list_count = $obj->list_count;
/* 페이지 네비게이션 기능 추가 끝 */
XML로 만들었던 page_count와 page_type을 DB로 보내기 위해 위와 같이 선언 한다.
(※ 다른 위젯과 다르게 $list_count 변수가 없어서 마지막에 $list_count = $obj->list_count;을 추가 선언해준다.)
2. DB로 보낼때 페이지 기능에서 필요로 하는 값중에는 전체 게시물수가 필요함.
전체 게시물 수를 구할 수 있도록 아래와 같이 선언
// 정해진 모듈에서 문서별 파일 목록을 구함
$files_output = executeQueryArray("widgets.newest_images.getOneFileInDocument", $obj);
$output_count = executeQueryArray('widgets.newest_images.getOneFileInDocumentCount', $obj);기 존 $files_output = executeQueryArray("file.getOneFileInDocument", $obj); 를 수정하게 되면 중심 모듈을 건드리게 되기 때문에 아래와 같이 위젯 폴더안에 queries라는 폴더를 하나더 만들어서 새로이 생성해준다.
전체 게시물 수를 구하도록 끝에 Count를 더 달아서 파일을 생성해준다.
3. 결과값의 순서를 수정
$z=0;
foreach($files_output->data as $key => $val) {
$files_output->data[$z] = $files_output->data[$key];
unset($files_output->data[$key]);
$z++;
}다른 위젯과 다르게 임의의 page( limit 0, 5 ) 가 선언되면
$files_output->data[0] ..[1]..[2]..... 가 아니라 $files_output->data[343]... [344]...[345].....
순으로 저장 되기에 이를 0번 부터 사용하도록 수를 수정 한다.
4. 페이지 계산에 필요한 정보를 list.html로 보내기 위해 아래와 같이 정리 한다.
/* 페이지 네비게이션 기능 추가 */
$widget_info->page_type = $page_type;
$widget_info->total_count = $output_count->data[0]->count; // 전체 개시물 수
$widget_info->page = (!Context::get('page'))? 1:Context::get('page'); // 현재 페이지
// 총 페이지 수
$total_count = $widget_info->total_count/$list_count;
if($widget_info->total_count%$list_count != 0) $total_count+=1;
$widget_info->total_page = floor($total_count); // 총 페이지 수
$widget_info->page_count = $page_count; // 총 페이지 수
/* 페이지 네비게이션 기능 추가 끝 */
Context::set('widget_info', $widget_info);
...중략...
5. list.html에서 호출에 오는 함수 정보.
/**
* @brief 다음 페이지 요청
**/
function WD_getNextPage($total_count, $total_page, $cur_page, $page_count = 10) {
$first_page = $cur_page - (int)($page_count/2);
if($first_page<1) $first_page = 1;
$last_page = $total_page;
if($last_page>$total_page) $last_page = $total_page;
if($total_page < $page_count) $page_count = $total_page;
$GLOBALS['wd_total_page'] = $total_page;
$GLOBALS['wd_first_page'] = $first_page;
$GLOBALS['+
'wd_page_count'] = $page_count;
$GLOBALS['wd_last_page'] = $last_page;
$page->first_page = $first_page;
$page->last_page = $last_page;
return $page;
}
function WD_getNextPage2() {
$page = $GLOBALS['+
'wd_first_page'+
']+$GLOBALS['wd_i']++;
if($GLOBALS['wd_i'] > $GLOBALS['wd_page_count'] || $page > $GLOBALS['wd_last_page'+
']) $page = 0;
return $page;
}
function WD_getNextClear() {
$GLOBALS['wd_i'] = 0;
}위와 함수를 이용하여 페이지 계산, 초기화 등의 정보를 구한다.
- getOneFileInDocument.xml -
<query id="getOneFileInDocument" action="select">
<tables>
<table name="files" alias="files"/>
<table name="documents" alias="documents"/>
</tables>
<columns>
<column name="files.upload_target_srl" alias="document_srl"/>
</columns>
<conditions>
<condition operation="in" column="files.module_srl" var="module_srls" notnull="notnull" filter="numbers" />
<condition operation="equal" column="files.direct_download" var="direct_download" pipe="and" />
<condition operation="equal" column="files.isvalid" var="isvalid" pipe="and" />
<condition operation="equal" column="files.upload_target_srl" var="documents.document_srl" pipe="and" />
</conditions>
<groups>
<group column="files.upload_target_srl" />
</groups>
<navigation>
<index var="list_order" default="documents.list_order" order="asc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>기존의 기본 XML에서 아래의 내용을 추가한다. (페이지 별로 내용 축출을 위해 필요)
<page_count var="page_count" default="10" />
<page var="page" default="1" />
- getOneFileInDocumentCount.xml -
<query id="getOneFileInDocumentCount" action="select">
<tables>
<table name="files" alias="files"/>
<table name="documents" alias="documents"/>
</tables>
<columns>
<column name="count(files.upload_target_srl)" alias="count"/>
</columns>
<conditions>
<condition operation="in" column="files.module_srl" var="module_srls" notnull="notnull" filter="numbers" />
<condition operation="equal" column="files.direct_download" var="direct_download" pipe="and" />
<condition operation="equal" column="files.isvalid" var="isvalid" pipe="and" />
<condition operation="equal" column="files.upload_target_srl" var="documents.document_srl" pipe="and" />
</conditions>
<groups>
<group column="files.upload_target_srl" />
</groups>
<navigation>
<index var="list_order" default="documents.list_order" order="asc" />
</navigation>
</query>내용은 그대로 getOneFileInDocument.xml에서 가져오돼 바꿔줘야 할 부분
<query id="getOneFileInDocumentCount" action="select">id명을 파일명과 일치시킨다.
<column name="count(files.upload_target_srl)" alias="count"/>count()로 감싸고 alias="count" 라는 이름으로 명시.
<list_count var="list_count" default="20" />해당 내용 삭제하여 전체 게시물로써의 게시물수를 구한다.
- list.html -
<!--@if($widget_info->page_type=='Y')-->
<!-- 페이지 네비게이션 -->
<div class="pageNavigation">
<a
href="{getUrl('page','','document_srl','','division',$division,'last_division',$last_division)}"
class="goToFirst">
<img src="./images/common/bottomGotoFirst.gif" alt="{$lang->first_page}" width="7" height="5" /></a>
<!-- 페이지 정보 구하기 위해 선언 -->
{@$page_view =
WD_getNextPage($widget_info->total_count,$widget_info->total_page,$widget_info->page,$widget_info->page_count)}
<!-- 중복 페이지 정보 출력을 위해 사전 초기화 -->
{@WD_getNextClear()}
<!--@while($page_no = WD_getNextPage2())-->
<!--@if($widget_info->page == $page_no)-->
<span class="current">{$page_no}</span>
<!--@else-->
<span class="pageNavigations"><a
href="{getUrl('page',$page_no,'+
'document_srl','','division',$division,'last_division',$last_division)}"
class="pageNavigation2">{$page_no}</a></span>
<!--@end-->
<!--@end-->
<a
href="{getUrl('page',$page_view->last_page,'document_srl','','division',$division,'last_division',$last_division)}"
class="goToLast">
<img src="./images/common/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
</div>
<!--@end-->중요한 선언만 설명
{@$page_view =
WD_getNextPage($widget_info->total_count,$widget_info->total_page,$widget_info->page,$widget_info->page_count)}$widget_info로 넘겨받은 페이지 계산을 위한 전체 게시물 수, 전체 페이지 수, 현재 페이지 번호, 한페이지에 출력될 페이지 번호의 수를 WD_getNextPage로 호출하여 $page_view에 결과를 저장한다.
{@WD_getNextClear()}상 하로 중복 선언이 될 경우 기존에 이용되었던 $GLOBALS 변수를 초기화 시킨다.
<!--@while($page_no = WD_getNextPage2())--> ...내용... <!--@end-->
WD_getNextPage2() 를 호출시마다 반복시켜서 내용이 없을때까지 수행한다.
1~5번의 위치만 제대로 잡아주시고 DB용 xml만 제대로 선언해주신다면 페이지 네비게이션 이용에
문제가 없을 걸로 봅니다.
전체 소스결과를 출력하긴 좀 그래서 newest_images 위젯을 배포하겠습니다.
위 소스를 기반으로 확인해보시고 다른곳에 적용해보시고 하세요.
http://www.animeclub.net/zbXE
- [2015/08/01] 포럼 [XE기초강좌 동영상] 휴면계정 정리 모듈 사용방법 *5
- [2015/07/20] 포럼 [아프리카TV 생방송] 충쌤의 XE랑(월,화 밤11시) * 진화쌤의 반응형 레이아웃 제작(수,목 밤10시) *29
- [2014/05/29] 포럼 XE 오픈 세미나 - 5월 31일 xdebug, XE 개발 전반에 대한 Q&A *4
- [2014/05/26] Blog 5월 XE 오픈 세미나 - [3회차] XE 모듈 개발 걸음마부터 날기까지 *1
- [2014/05/19] Blog XE 오픈 세미나 - XE 모듈 개발 1회차 리뷰
댓글 10
-
그 내용은 list.html에 페이지 네비게이션에서 while의 위 아래에 있는 부분에 추가해주시면 될 듯 한데요...
<!--@if ($page > $widget_info->page_count)-->
<a href="{getUrl('page',$page-$widget_info->page_count,'document_srl',''+ '+ ','division',$division,'last_division',$last_division)}" class="goToFirst">이전{$widget_info->page_count}개<img src="./images/common/bottomGotoFirst.gif" alt="이전" width="7" height="5" /></a>
<!--@end-->
<!--@if(($page_view->last_page-$page) > $widget_info->page_count)-->
<a href="{getUrl('page',$page+$widget_info->page_count,'document_srl','','division',$division,'last_division',$last_division)}" class="goToLast">다음{$widget_info->page_count}개<img src="./images/common/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
<!--@end--> -
잘 되네요.
생각보다 팁 적용이 쉽네요.
감사합니다. -
Clanss
2008.09.04 15:29
원하던 기능인데 ^^ 아주 좋네요.
리미에 한번 달아봐야겠어요 ㅎㅎ -
zzang84
2008.09.05 15:42
이미지 위젯말고 다른위젯에(최근게시물,최근위젯등등)에 적용할려면
newest_images.class.php 안에 있는- $z=0;
- foreach($files_output->data as $key => $val) {
- $files_output->data[$z] = $files_output->data[$key];
- unset($files_output->data[$key]);
- $z++;
- }
소스는 불필요한가요??? 만약 필요하면 어떤 위치에 놓아야 하나요?? 위 아래로 중략이라고 적어놓으셔서 어디가다 붙여넣기 해야 할찌 감이 안옵니다...
여러가지로 질문을 드려서 죄송합니다... 그래도 좀 부탁 좀 드리겠습니다.. -
만들 위젯모델로 부터 만드셔야 합니다.
다른 위젯(newest_images가 아닌)으로 제작을 할껀데 굳이 getOneFileInDocument.xml를 가지고와야 할 필요는 없겠죠??
제작하려는 그 위젯에 있는 XML을 가지고 추가하는것과 Count 붙여서 하라는 방법만 적용하셔야지요.
그리고 본문 하단에 위젯 자료실에 올려뒀으니 다운받으셔서 소스를 여셔서 보라고 해줬자나요.
위치 등은 다른 위젯도 비슷비슷하니까 그 소스를 보시고 다른모델을 찾으셔서 적용시켜보시고요...
제 사이트에 저것보다 더 자세히 써놨으니 거기도 한번 읽어보세요.
ps : 그리고 적어주신 소스(3번 내용)는 다른위젯과 다르게 xml에 page 항목을 넣으면 DB Query문이 limit 0,5 등으로 됩니다.
원래는 limit 5 입니다.
page가 달리면 그것을 계산해서 15번째 부터 5개만.. (limit 15,5) 이런식으로 중간부터 뽑아내기위해 그리 선언되는 겁니다.
이건 Query문을 아시면 이해되실 내용 같고요...
그러기에 저런 limit 0,5 상황이 될 경우 번호부여가 잘못되니 그걸 패치 하는겁니다. -
zzang84
2008.09.14 18:29
이제야 하니 잘 됩니다... 정말 감사드립니다.
그래서 요번에는 웹진형 위젯에 도전을 할려하는데요~~~
라르게덴 고수님 싸이트에 가보니 웹진형 위젯이 있는데 여기에 관해서 질문이 있습니다..
웹진형 위젯에서는 쿼리를 최근게시글 폴더 newest_document에서 불러와서 쓰시는거 같은데요...(라르게덴님께서도 웹진형 위젯을 쓸려면 꼭 그전에 ※ 이 스킨을 사용하기 전에 newest_document 스킨도 페이지 기능이 적용되어 있어야 합니다.) 라고 적어놓으셨습니다.
그래서 말은데 꼭 최근게시글 스킨을 먼저 설치하고 나서 사용해야 하나요?
아니면 웹진폴더안 쿼리폴더에다가 각각 newest_document 와 newest_documentcount를 만들어 사용해도 되는건지요?
추석이네요.... 명절 잘 보내세요! -
별도로 만드셔도 됩니다.
다만 이용되는 공통 xml이 있으면 활용하는게 좋다고 봐서 그리 설명된거에요 ^^ -
zzang84
2008.09.15 18:58
최근 웹진게시글를 적용한 결과 코드생성페이지에서 코드가 생성이 안됩니다.
에러페이지라고 나오는데 무엇이 문제가 되는건가요?
새로 다 지우고 깔아도 잘 안되네요~
그리고 웹진 쿼리파일을 보면 getNewestDocuments파일안에 첫윗줄에 <query id="getDocumentList" action="select"> 이라고 되어있는데요
이상하게도 왜 웹진만은 쿼리파일명 하고 파일안에 있는 쿼리 id 하고 이름이 틀리게 되어있는지요?
그리고 질문 하나가 더 있습니다.
라드게덴님께서 올려주신 최근웹진게시글에서 webzine.class.php 열어보면 아래 빨간글씨소스가 다른 위젯에는 없는게 더 추가되어 있었습니다.(참고로 여기 윗 팁란에서도 빨간글씨소스가 없는걸로 되어있습니다.)
혹시 빨간글씨소스를 지워도 무관하는지요? 계속이나마 귀찮게 해드려서 죄송합니다.
/* 페이지 네비게이션 기능 추가 */
// 페이지 목록 수 (1,2,3,4....)
// 출력된 목록 수
$list_count = (int)$args->list_count;
if(!$list_count) $list_count = 5;
$page_count = $args->page_count;
if(!$page_count) $page_count = 5;
$obj->page_count = $page_count;// 페이지 출력 여부
$page_type = $args->page_type;// 페이지 번호 구하기
if($page_type=='Y') $obj->page = (Context::get('page'))? Context::get('page'): 1;
/* 페이지 네비게이션 기능 추가 끝 */ -
여기 글만 보지마시고 위 자세한 설명을 해놨다는 제 사이트에 오셔서 보다 자세히 봐주시기 바랍니다.
그곳에 해당 코드에 대한 설명이 기재되어있습니다.
| 제목 | 글쓴이 | 날짜 |
|---|---|---|
|
밑에 페이지 네비게이션 수정 (다음10개, 이전10개등으로)
[6]
| Clanss | 2008.08.29 |
| 문서 카테고리를 메뉴에 적용하기 위한 레이아웃 수정 팁과 개념토론 [7] | 제베 | 2008.08.31 |
| 원하는 위치에 구글 (맞춤)검색창 달기 [2] | 다케루 | 2008.09.02 |
| 각 리스트형 위젯에 페이지 기능을 달자. [10] | 라르게덴 | 2008.09.02 |
| 카멜레온 최근글 위젯 클릭시 새창 팁 | 가랑바람 | 2008.09.04 |
| 회원 포인트 선물 하기 등 포인트 변경시 바로 적용 방법 | 한꼬마 | 2008.09.06 |
| 등록하시겠습니까? 등록할까요? 안 나오고 바로 글 등록되게 하는 법 [6] | 황건순 | 2008.09.08 |
| IP 주소 4자리수 모두 공개하는 방법 [1] | 블루파티 | 2008.09.11 |
|
에디터 9pt 추가 및 에디터에도 웹폰트 보이게 하기.
[13]
| 욜리 | 2008.09.11 |
| 사진 한꺼번에 일괄적으로 올리기 [4] | 안정수650 | 2008.09.12 |
| 게시판 에디터 폰트 글자(글씨)크기 변경하는 법 | 씨에씨에 | 2008.09.12 |
| 아이프레임 | 나나나나난 | 2008.09.18 |
| 글이나 코멘트에서 글자수 제한하기 | 老姜君 | 2008.09.23 |
| 첨부파일이 다운로드 되지 않을떄.. [2] | 규민 | 2008.09.23 |
| ● 탈퇴버튼 없애기 - - ; [4] | Eris | 2008.09.23 |
| 제로보드XE 중복설치방법 있나요? [4] | bsy.myid.net | 2008.09.24 |
| XAMPP 프로그램사용시 Error500 이 뜰경우 해결방법 [2] | 지레프 | 2008.09.26 |
| VPN 환경에서 제로보드 [4] | superion | 2008.09.26 |
|
메뉴 모듈 기능 조금 추가
[23]
[1] | 반도체맨 | 2008.09.29 |
| 감점되는 게시판에서 점수 부족한데 글 써지는 문제점 수정 [1] | 반도체맨 | 2008.10.07 |
죄송하지만 부탁하나 더 드려도 될런지......
http://www.zeroboard.com/17221901에 Clanss님이 팁으로 올려주신 네비게이션수정을 님의 팁에 적용할 수는 없는지요?
두개가 합쳐지면 더욱 멋진 페이지기능이 될 것같습니다.
자꾸만 어려운 부탁드려 한번더 죄송!!!!!!!!