포럼
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
RewriteEngine class 제안
2011.08.03 12:31
XE의 경우 코어에서 정한 Rewrite rule을 따르고 있습니다.
/document_srl/
/mid/document_srl/
/vid/document_srl/
/vid/mid/document_srl/
하지만 사이트를 만들다보면 이러한 룰은 한계가 있습니다.
주소도 길어지고 외우기 힘들고 지저분해보입니다.
모듈에서 Custom rewrite rule을 지원한다면 좀 더 간결한 주소를 만들 수 있겠죠.
RewriteEngine 클래스 레퍼런스
<?php
class RewriteEngine {
var $rules;
/**
* @brief constructor
**/
function RewriteEngine() {
}
function set($regex, $rewrite, $target_module) {
if(!isset($this->rules[$regex])) {
$rule = new stdClass;
$rule->regx = $regex;
$rule->rewrite = $rewrite;
$rule->target_module = $target_module;
$this->rules[$regex][] = $rule;
}
}
function unset($regex, $index = null) {
if($index) {
unset($this->rules[$regex][$index]);
} else {
unset($this->rules[$regex]);
}
}
function setTargetModule($regex, $target_module) {
$this->rules[$regex]->target_module = $target_module;
}
function getRules() {
return $this->rules;
}
function getTargetModules($regex) {
return $this->rules[$regex]->target_module;
}
}
?>
before_module_init 혹은 before_module_proc 시점에서 룰을 추가하거나 삭제할 수도 있고요.
<?php
if($called_position == 'before_module_init') {
RewriteEngine::set('[a-zA-Z0-9_+]/category/[0-9+]', 'index.php?mid=$1&category_srl=$2', 'board');
}
?>
conf/module.xml 파일에 룰을 선언할 수 있습니다.
<module>
...
<rewriteRules>
<rule regex="[a-zA-Z0-9_+]/category/[0-9+]" rewrite="index.php?mid=$1&category_srl=$2" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/write/" rewrite="index.php?mid=$1&act=dispBoardWrite" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/modify/[0-9+]" rewrite="index.php?mid=$1&document_srl=$2&act=dispBoardWrite" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/delete/[0-9+]" rewrite="index.php?mid=$1&document_srl=$2&act=dispBoardDelete" module="board" />
</rewriteRules>
...
</module>
module="board"인 경우 board 모듈에서만 동작하는 룰임.
잊어먹지 않기 위해 적어놓는 글이라 새로운 생각이 떠오르면 언제든지 바뀔 수 있습니다.
/document_srl/
/mid/document_srl/
/vid/document_srl/
/vid/mid/document_srl/
하지만 사이트를 만들다보면 이러한 룰은 한계가 있습니다.
주소도 길어지고 외우기 힘들고 지저분해보입니다.
모듈에서 Custom rewrite rule을 지원한다면 좀 더 간결한 주소를 만들 수 있겠죠.
RewriteEngine 클래스 레퍼런스
- RewriteEngine::set();
- RewriteEngine::unset();
- RewrtieEngine::getRules();
- RewriteEngine::setTargetModule();
- RewriteEngine::addTargetModule();
- RewriteEngine::getTargetModules();
<?php
class RewriteEngine {
var $rules;
/**
* @brief constructor
**/
function RewriteEngine() {
}
function set($regex, $rewrite, $target_module) {
if(!isset($this->rules[$regex])) {
$rule = new stdClass;
$rule->regx = $regex;
$rule->rewrite = $rewrite;
$rule->target_module = $target_module;
$this->rules[$regex][] = $rule;
}
}
function unset($regex, $index = null) {
if($index) {
unset($this->rules[$regex][$index]);
} else {
unset($this->rules[$regex]);
}
}
function setTargetModule($regex, $target_module) {
$this->rules[$regex]->target_module = $target_module;
}
function getRules() {
return $this->rules;
}
function getTargetModules($regex) {
return $this->rules[$regex]->target_module;
}
}
?>
before_module_init 혹은 before_module_proc 시점에서 룰을 추가하거나 삭제할 수도 있고요.
<?php
if($called_position == 'before_module_init') {
RewriteEngine::set('[a-zA-Z0-9_+]/category/[0-9+]', 'index.php?mid=$1&category_srl=$2', 'board');
}
?>
conf/module.xml 파일에 룰을 선언할 수 있습니다.
<module>
...
<rewriteRules>
<rule regex="[a-zA-Z0-9_+]/category/[0-9+]" rewrite="index.php?mid=$1&category_srl=$2" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/write/" rewrite="index.php?mid=$1&act=dispBoardWrite" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/modify/[0-9+]" rewrite="index.php?mid=$1&document_srl=$2&act=dispBoardWrite" module="board" />
<rule regex="[a-zA-Z0-9_+]/act/delete/[0-9+]" rewrite="index.php?mid=$1&document_srl=$2&act=dispBoardDelete" module="board" />
</rewriteRules>
...
</module>
module="board"인 경우 board 모듈에서만 동작하는 룰임.
잊어먹지 않기 위해 적어놓는 글이라 새로운 생각이 떠오르면 언제든지 바뀔 수 있습니다.
댓글 7
-
Xiso
2011.08.03 12:58
하.. 그냥생각없이 올린글 하나가 이렇게 커지는군요 하하...;;;후덜 ㅋㅋ -
Xiso
2011.08.03 13:03
<rewriteRules>
<rule name="default_srl/" regx="[0-9+]" module="module" check_func="getModuleInfoByDocumentSrl" /><rule name="default_srl/" regx="[0-9+]" module="member" check_func="getMemberInfoByMemberSrl" />
<rule name="default_srl/" regx="[0-9+]" module="comment" check_func="getModuleInfoByCommentSrl" />
</rewriteRules>이런식으로, 우선순위를 정해준다거나,,말이죠
-
씨지
2011.08.03 15:04
XE Core 자체적으로 srl 외에 숫자+영문대소문자 를 이용한 자체짧은주소 생성해서 그걸 기본 퍼머링크로 사용하도로고 해버리는건 어떨까? 하는 상상도 해봤습니다. -
Xiso
2011.08.03 18:16
그러면 일일이 페이지를 지정해줘야하지않나요, 일정한 룰을따른다면 srl룰을 따르는게 좋은것 같아요
html페이지를 위함이라면, 외부페이지생성하시면 mid만적어도 출력이되니 별 문제는없을듯합니다만...하하 -
씨지
2011.08.09 11:01
문서에 관한 얘기였구요.
srl은 srl대로 Core 상의 key로서 10진수+1되면서 key 로 서 사용되고.
alias를 자동으로 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,....A,B,C,D,E,...11,12,13...,1a,1b,,,1A,1B... 이런식으로 또다른 n진수+1로 쌓아나간다면 자동생성 짧은 퍼머링크가 될 수 있지 않을까 하는 아이디어였습니당.^^
게시판에서 alias가 존재할때는 alias를 퍼머링크로 표시하구요. -
Hexa
2011.08.04 09:31
"좋아요" 기능없나요? 라우터 기능 정말 간절히 필요합니다. .htaccess 건드려도 되지만, 그건 업데이트 할때마다 성가셔서요. 잘못 없데이트하면 증발해버리기도 하고... SMaker님! 하나 맹글어주세요!! -
SMaker
2011.08.17 23:25
으음 라우터 기능은 뭐죠!?