웹마스터 팁

퍼머링크란게 주소번호(document_srl) 변경과 관계없이 유일한 주소를 가지게 되는 방식입니다.
(허나 zbXE는 게시물 이동되도 번호 그대로 더라고요;;)

또하나는 한글 주소로도 사용가능합니다.
텍스트큐브를 예로 들면 "http://textcube.org/entry/퍼머링크-입니다" 이런식의 주소 체계입니다.

아래 내용을 적용 후에 글 하나 등록하시면 xe_documents 테이블에 글제목이 extra_vars20 컬럼으로 저장되도록 했습니다.

주소체계는 "http://홈페이지/zbXE경로/board/:퍼머링크-입니다" 이렇게 했습니다.

동일한 제목으로 글 등록시 "퍼머링크-입니다-1"로 주소가 바뀌며 방식은 텍스트큐브 방식과 동일하게 해봤습니다.

예) http://www.animeclub.net/idea/:zbXE에-퍼머링크-달기 <-클릭해보세요

수정에 필요한 파일
제로XE/.htaccess
제로XE/module/board/board.view.php
제로XE/module/board/board.controller.php
제로XE/module/board/skin/xe_board/style_list.html
제로XE/module/document/document.admin.controller.php
제로XE/classes/context/Context.class.php

XML Query
제로XE/module/board/queries/getDocumentSrlInfo.xml
제로XE/module/board/queries/getPermaSearch.xml
->파일은 첨부함

제로XE/.htaccess 제일하단에 추가
# Permalink link
RewriteRule ^:(.*)$ ./index.php?entry=$1 [L]
RewriteRule ^([a-zA-Z0-9_]+)/:(.*)$ ./index.php?mid=$1&entry=$2 [L]

제로XE/board/board.view.php
/**
* 게시글 목록을 추출함
**/

// 목록 구현에 필요한 변수들을 가져온다
$document_srl = Context::get('document_srl');
/*------------------------Permalink 추가-------------------------*/
    // document_srl 을 Permalink 주소로 변경
    $perma = (mb_detect_encoding(Context::get('entry')))?
        Context::get('entry'):
        iconv("EUC-KR","UTF-8", Context::get('entry'));
$oPermaController = &getController('board');
    if(!$document_srl) $document_srl = ($perma)? $oPermaController->getDocumentSrlInfo($perma):'';
/*------------------------Permalink 추가 끝-------------------------*/
$page = Context::get('page');

// document model 객체를 생성
$oDocumentModel = &getModel('document');
.......

제로XE/board/board.controller.php
class boardController extends board {

/**
* @brief 초기화
**/
function init() {
}
/*------------------------Permalink 추가-------------------------*/
/**
* @brief Permalink 주소로 document_srl 알아오기
**/
function getDocumentSrlInfo($perma) {
// $perma로 document_srl의 정보를 구함
if($perma) {
$args->extra_vars20 = $perma;
$output = executeQuery('board.getDocumentSrlInfo', $args);
}

    if(!$output->toBool()) return $output;

$list = $output->data;
if(!$list) return;
if(!is_array($list)) $list = array($list);

foreach($list as $key => $val) {
$document_srl = $val->document_srl;
}

return $document_srl;
}

/**
* @brief Permalink 주소를 검사
**/
function getEntrySearch($obj){
    $output = executeQuery('board.getPermaSearch', $obj);
    if(!$output->toBool()) return $output;
    $list = $output->data;
    if(!$list) return;
    if(!is_array($list)) $list = array($list);
    foreach($list as $val) {
        $perma->count = ($val->entry == 0) ? true : false;
    }
    return $perma;
}

/**
* @brief Permalink value 처리(HTML,특수문자 등 제거)
**/
function getEntryReplace($obj){
    $title_arr = array("?","!","@","#","$","%","^","&","\\",";",":",".","/","=");
    $title = strip_tags($obj->extra_vars20);
    $title = str_replace($title_arr,"",$title);
    $title = str_replace(" ","-",$title);
    $perma->extra_vars20 = $title;
    // Permalink 처리를 위한 controller 객체 생성
$oPermaController = &getController('board');
    $permaSearch = $oPermaController->getEntrySearch($perma);

    $i = 0;
    while(!$permaSearch->count)
    {
    $i++;
    $perma->extra_vars20 = $title."-".$i;
    $permaSearch = $oPermaController->getEntrySearch($perma);
    }
    return $perma->extra_vars20;
}
/*------------------------Permalink 추가 끝-------------------------*/      
/**
* @brief 문서 입력
**/
function procBoardInsertDocument() {
.........
  
이어서...
// document module의 model 객체 생성
$oDocumentModel = &getModel('document');

// document module의 controller 객체 생성
$oDocumentController = &getController('document');
/*------------------------Permalink 추가-------------------------*/
// entry url 처리를 위한 controller 객체 생성
$oPermaController = &getController('board');
/*------------------------Permalink 추가 끝-------------------------*/
// 이미 존재하는 글인지 체크
$oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager);

// 이미 존재하는 경우 수정
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) {
/*------------------------Permalink 추가-------------------------*/
        // 기존 permalink 정보와 같은지 확인
        if($oDocument->get('extra_vars20')!=$obj->extra_vars20){
        // permalink 결과 저장
        $ebj->extra_vars20 = ($obj->extra_vars20)?$obj->extra_vars20:$obj->title;
        $obj->extra_vars20 = $oPermaController->getEntryReplace($ebj);
        }
/*------------------------Permalink 추가 끝-------------------------*/
$output = $oDocumentController->updateDocument($oDocument, $obj);
$msg_code = 'success_updated';

// 그렇지 않으면 신규 등록
} else {
/*------------------------Permalink 추가-------------------------*/
        // permalink 결과 저장
        $ebj->extra_vars20 = ($obj->extra_vars20)?$obj->extra_vars20:$obj->title;
        $obj->extra_vars20 = $oPermaController->getEntryReplace($ebj);
/*------------------------Permalink 추가 끝-------------------------*/
$output = $oDocumentController->insertDocument($obj);
$msg_code = 'success_registed';
$obj->document_srl = $output->get('document_srl');
}
............

제로XE/module/board/skin/xe_board/style_list.html
<!-- 공지사항 출력 -->
<!--@foreach($notice_list as $no => $document)-->
<tr class="notice">
    <!--@if($module_info->display_number!='N')--><td class="notice"><!--@if($document_srl == $document->document_srl)--><img src="./images/common/iconArrowD8.gif" border="0" alt="" /><!--@else-->{$lang->notice}<!--@end--></td><!--@end-->
    <!--@if($grant->is_admin)--><td class="checkbox"><input type="checkbox" name="cart" value="{$document->document_srl}" onclick="doAddDocumentCart(this)" <!--@if($document->isCarted())-->checked="checked"<!--@end--> /></td><!--@end-->
    <td class="title">
    <!--@if($module_info->use_category == "Y" && $document->get('category_srl'))-->
    <strong class="category">{$category_list[$document->get('category_srl')]->title}</strong>
    <!--@end-->
<!------------------------Permalink 변경------------------------->
    <a href="{getUrl('document_srl', $document->document_srl, 'listStyle', $listStyle, 'cpage','','entry',$document->get('extra_vars20'))}">{$document->getTitle($module_info->subject_cut_size)}</a>
<!------------------------Permalink 변경 끝------------------------->
    <!--@if($document->getCommentCount())-->
..........

이어서...
<!-- 일반 글 출력 -->
<!--@foreach($document_list as $no => $document)-->
<tr class="bg{($no+1)%2+1}">
    <!--@if($module_info->display_number!='N')--><td class="num"><!--@if($document_srl == $document->document_srl)--><img src="./images/common/iconArrowD8.gif" border="0" alt="" /><!--@else-->{$no}<!--@end--></td><!--@end-->
    <!--@if($grant->is_admin)--><td class="checkbox"><input type="checkbox" name="cart" value="{$document->document_srl}" onclick="doAddDocumentCart(this)" <!--@if($document->isCarted())-->checked="checked"<!--@end--> /></td><!--@end-->
    <td class="title">
    <!--@if($module_info->use_category == "Y" && $document->get('category_srl'))-->
    <strong class="category">{$category_list[$document->get('category_srl')]->title}</strong>
    <!--@end-->
<!------------------------Permalink 변경------------------------->
    <a href="{getUrl('document_srl', $document->document_srl, 'listStyle', $listStyle, 'cpage','','entry',$document->get('extra_vars20'))}">{$document->getTitle($module_info->subject_cut_size)}</a>
<!------------------------Permalink 변경 끝------------------------->                       
    <!--@if($document->getCommentCount())-->
............

제로XE/module/document/document.admin.controller.php
/*------------------------Permalink 추가-------------------------*/
$oPermaController = &getController('board');
        $ebj->extra_vars20 = ($obj->extra_vars20)?$obj->extra_vars20:$obj->title;
        $obj->extra_vars20 = $oPermaController->getEntryReplace($ebj);
/*------------------------Permalink 추가 끝-------------------------*/
// 글의 등록
$output = $oDocumentController->insertDocument($obj, true);
if(!$output->toBool()) {
    $oDB->rollback();
    return $output;
}
................

제로XE/classes/context/Context.class.php
// rewrite모듈을 사용하고 인자의 값이 4개 이하일 경우
if($this->allow_rewrite && $var_count < 10) {
$var_keys = array_keys($get_vars);

        if($var_count == 1) {
    if($var_keys[0]=='mid') return $this->path.$get_vars['mid'];
    elseif($var_keys[0]=='document_srl') return $this->path.$get_vars['document_srl'];
} elseif($var_count == 2) {
    asort($var_keys);
    $target = implode('.',$var_keys);
    if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']);
    elseif($target=='document_srl.mid')  return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']);
    elseif($target=='act.document_srl'+
 '+
 ')  return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']);
    elseif($target=='mid.page')  return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']);
    elseif($target=='category.mid')  return sprintf('%s%s/category/%s'+
 ',$this->path,$get_vars['mid'],$get_vars['category']);
    elseif($target=='act.mid')  return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act'+
 ']);
} elseif($var_count == 3) {
            asort($var_keys);
    $target = implode('.',$var_keys);
    if($target=='act.document_srl.key') {
    return sprintf('%s%s/%s/%s',$this->path,$get_vars['document_srl'],$get_vars['+
 'key'],$get_vars['act']);
    } elseif($target=='document_srl.entry.mid') {/*-----------Permalink 추가-----------*/
    return sprintf('%s%s/:%s',$this->path,$get_vars['mid'],$get_vars['entry']); /*-----------Permalink 추가-----------*/
    } elseif($target=='category.mid.page') {
    return sprintf('%s%s/category/%s/page/%s',$this->path,$get_vars['mid'],$get_vars['+
 'category'],$get_vars['page']);
    } elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='tag') {
    return sprintf('+
 '%s%s/tag/%s',$this->path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
.......


/*------------------------Permalink 추가-------------------------*/
/*------------------------Permalink 추가 끝-------------------------*/
이부분만 추가하거나 수정해주세요

위 파일 줄라인 번호는 다를 수 있으니 비슷한 곳 찾으셔서 등록해주세요.



ps :
1. 소스 적용 이후 제대로 동작 안될 수도 있습니다. 자료는 백업 후 적용하세요. (제가 많이 허접합니다. ^^;)
2. 보안점이나 사항이 있다면 같이 개선했으면 합니다. 저 잘 못합니다. ^^;
3. 게시판 설정에서 확장변수 20번 설정해서 사용하면 제목따라가지 않고 원하는 이름으로 입력가능합니다.
4. 변수명이나 명칭정하는게 좀 엉성해서... 멋진 변수명들 없을까요?? ^^


5. 조금 오류가 있어서 Context.class.php와 style_list.html 수정했습니다. 08.03.13 13:50
제목 글쓴이 날짜
코어 1.5.1에서 회원정보에 성별아이콘 쓰기 file 늘푸른이 2011.12.10
게시판 글작성 선택적 메일보내기 - 확장변수 이용 [2] file noirzo 2009.10.28
확장변수에서 본문 입력 빼기 [10] file Diver 2007.11.12
관리툴 회원관리에서 확장변수로 검색 시 숫자 이외 검색불가 해결 방법 카리브 2011.10.10
특정 확장변수를 로그인한 회원에게만 보이게 하기 [3] 비밀얌 2011.09.17
계시판 확장변수에 대하여 여쭤봅니다. [1] 마지막드론 2011.08.14
게시판에 회원확장변수정보 받아서 표시하기 [3] burster 2011.03.26
확장변수 - 주소입력 받을 시 안내문구 출력 [2] 반디소리 2011.02.24
[확장변수] 게시물을 새창에서 전체화면으로 보기 [2] file 고진감래 2009.10.09
XE 공식 게시판에 (다운로드) 같은 '임의목록' 집어 넣기 (확장변수x) [1] file 999 2010.12.30
확장변수에 회원정보를 넣어보자 [10] file 개돌 2009.06.30
확장변수값 이미지로 대체하여 나타내기 (실시간 응대목적) [12] file sm3 2009.06.10
게시판 글 검색시 검색 대상 선택을 자유롭게 고치기 [6] file June Oh 2009.07.15
zbXE에 퍼머링크 달기 [3] file 라르게덴 2008.03.13
확장변수 한줄입력칸 폭 조정하기 [2] 아고라 2009.09.30
[수정 했습니다.]본문 입력없이 확장 변수로만 글작성 작성하기(그림삽입포함) [13] file 대암지기 2008.03.09
게시판 하단 검색 옵션 원하는 것만 넣기 (확장변수 포함) [10] shtjdals 2008.01.02
확장변수 사용 (전화번호) 사용 예제 - 참고용 [2] 무대포2 2010.03.17
게시판 목록을 확장 변수로 정렬하기 [5] 대암지기 2008.10.10
게시판에 사전질문 넣기 특히 확장 변수 없는 지식in 게시판 - 초보자용 [3] file THEOTHERS 2010.08.07