웹마스터 팁
각 리스트형 위젯에 페이지 기능을 달자.
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
-
팔공산
2008.09.02 18:30
-
라르게덴
2008.09.02 23:13
그 내용은 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--> -
팔공산
2008.09.02 23:36
잘 되네요.
생각보다 팁 적용이 쉽네요.
감사합니다. -
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++;
- }
소스는 불필요한가요??? 만약 필요하면 어떤 위치에 놓아야 하나요?? 위 아래로 중략이라고 적어놓으셔서 어디가다 붙여넣기 해야 할찌 감이 안옵니다...
여러가지로 질문을 드려서 죄송합니다... 그래도 좀 부탁 좀 드리겠습니다.. -
라르게덴
2008.09.05 15:51
만들 위젯모델로 부터 만드셔야 합니다.
다른 위젯(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를 만들어 사용해도 되는건지요?
추석이네요.... 명절 잘 보내세요! -
라르게덴
2008.09.15 09:31
별도로 만드셔도 됩니다.
다만 이용되는 공통 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;
/* 페이지 네비게이션 기능 추가 끝 */ -
라르게덴
2008.09.16 09:50
여기 글만 보지마시고 위 자세한 설명을 해놨다는 제 사이트에 오셔서 보다 자세히 봐주시기 바랍니다.
그곳에 해당 코드에 대한 설명이 기재되어있습니다.
제목 | 글쓴이 | 날짜 |
---|---|---|
밑에 페이지 네비게이션 수정 (다음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님이 팁으로 올려주신 네비게이션수정을 님의 팁에 적용할 수는 없는지요?
두개가 합쳐지면 더욱 멋진 페이지기능이 될 것같습니다.
자꾸만 어려운 부탁드려 한번더 죄송!!!!!!!!