웹마스터 팁

몇몇분이 소스를 공개하라고 해서 페이지 기능을 구현하는 방법을 소개해볼까 합니다.
이번 소스모델이 된 위젯은 newest_image(최근 이미지 위젯) 입니다.


최근 이미지 위젯에 페이지 기능을 위한 추가, 수정 파일

./widgets/newest_image/conf/info.xml <- 입력을 받기 위한 입력창
: 관리자페이지에서 코드 실행하기전에 이곳으로부터 정보를 입력 받습니다.

./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

제목 글쓴이 날짜
제로보드XE에서 표 쉽게 만드는 방법.. [23] 청개구리00 2008.07.27
제로보드XE 설치 완료버튼 누르니까 My sql 관련 내용 나오던데요 [3] Naver™ 2008.07.30
1원팁) 톱메뉴를 제거하고 왼쪽 서브메뉴만 출력하는 방법 [2] file Gnee 2008.08.02
제로보드 문자열 정교하게 자르기 [11] 젝망치 2008.08.03
TRAC과 SVN을 참조하여 1.0.5의 애드온 설정 버그 해결하기 Adios 2008.08.04
첨부화일 등록시 사라지는 현상 [2] 0라이트0 2008.08.05
닉네임, 이름 정보변경 못하게 하기. [6] 부엉이 2008.08.06
설치시 초기화면으로 돌아가는 현상 해결 [1] spk 2008.08.07
오픈 아이디(OpenID)로만 로그인 허용하기 [7] withover.com 2008.08.07
댓글 첨부파일부분 닫기/열기 추가 [1] file Gnee 2008.08.09
렙업시 소속그룹 없어지는 문제! 얍실하게 해결.. 쿨럭. [2] file 이슈카ㆀ 2008.08.12
rewrite mod 사용 않될 경우 해결 방법 1가지 블루스카이77 2008.08.13
권한 문제 때문에 생길 수 있는 문제 해결 방안 꽃들 2008.08.14
zbxe에서 piclens 사용하기 [2] 우정진 2008.08.15
미국 yahoo zbxe 설치 및 mysql 연결 [4] mr007 2008.08.15
이미지 좌측 정렬시 내용이 적으면 아래부분 올라오는 문제 해결법 [2] file 대류 2008.08.16
한글로 된 이미지 문제 [17] Defy 2008.08.19
[게시판] 이미존재하는 모듈이름 입니다. 오류. [2] 나이스가이212 2008.08.21
라이프팟 연동에서 XML 주소 얻기 최재원541 2008.08.23
한 페이지(화면)에 두개(2개)의 모듈(게시판 등)을 넣는 법 [6] 황건순 2008.08.25