CI 묻고 답하기

제목 [질문] wiki의 url을 해석하기 위한 _remap() 을 만들어 봤습니다.
글쓴이 우노 작성시각 2009/07/12 02:05:54
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 40778   RSS
여러가지 wiki가 있지만, trac의 wiki를 기준으로 만들어 보고 있습니다.

구현을 위한 순서는 url 해석 -> wiki parser -> version/history -> diff 순으로 생각하고 있습니다.
최종적으로는 user auth 와 연결하여 특정 wiki와 sub-wiki 에 접근 권한에 따라 읽기를 허용하려고 합니다.

trac의 위키는 name 을 wiki/ 이후에 나오는 aaa, aaa/bbb, aaa/bbb/ccc 를 name 으로 쓰고 있습니다. (이점이 일반적인 주소체계와 가장 큰 차이점인데요.)
따라서, _remap() 을 이용하여 다음과 같이 결과를 얻도록 제작하였습니다.

> 정제된 name 을 얻도록 한다( 맨앞의 wiki/ 를 없앤 후, aaa/bbb/ccc/ 인 경우에는 aaa/bbb/ccc 로 바꾼다.).
> 상위 레벨의 위키주소까지 얻도록 한다. ( $name 이 aaa/bbb/ccc 이면, $name_levelup 은 aaa/bbb )
> 경로에 대한 링크를 작성한다.
> aaa/bbb/ccc 와 같은 페이지 이름이 나온 이후에 ::action:delete::version:32::var:param 과 같이 사제 스트링을 제작하였습니다.
> wiki table 에서 위에서 얻는 name 을 가진 것들 중에서, 최신 버전 - ( 'version' field 의 숫자가 가장 높은 것) 을 가지고 온다.
> www.example.com/wiki 와 같이 wiki 페이지 주소가 없는 경우 wiki/WikiStart 페이지를 초기화면으로 보여줍니다.
> 위에서 얻은 action 값에 따라 다른 view_page를 불러옵니다.
> 위키의 특성상 페이지네이션은 고려하지 않았습니다.
> 우선은 구조화나 최적화, 예외처리 보다는 구현에 촛점을 두었습니다.

보시고, 개선할 점, 혹은 더 좋은 방법이 있으면 말씀해 주시면 많은 도움이 될거 같습니다.

function _remap()
{

$total_segments = $this->uri->total_segments();

$name = NULL;
$location = NULL;
$wiki_name_levelup = NULL;

if ($total_segments > 1)
{
for ($i = 2; $i <= $total_segments; $i++)
{
if ($i > 2)
{
$name = $name."/";
$location = $location." / ";
}

if ($i == $total_segments)
{
$last_url = $this->uri->segment($i);
$parsed_uri = explode("::", $last_url);
$count_result = count($parsed_uri);

if ($count_result > 1)
{

$j = 0;
foreach($parsed_uri as $array)
{
if ($j > 0)
{
$parsed_array = explode(":", $array);
$get_param[$parsed_array[0]] = $parsed_array[1];
}
$j++;
}

$segment = $parsed_uri[0];
$name = $name.$segment;
$location = $location.anchor('/wiki/'.$name, $segment);

}
else
{
$get_param['action'] = 'read';
$segment = $last_url;
$name = $name.$segment;
$location = $location.anchor('/wiki/'.$name, $segment);
}

}
else
{
$segment = $this->uri->segment($i);
$name = $name.$segment;
$location = $location.anchor('/wiki/'.$name, $segment);
}



if ($i < $total_segments)
{
$wiki_name_levelup = $name;
}

}

$wiki_name = $name;
$wiki_location = $location;
}
else
{
$get_param['action'] = 'read';
$wiki_name_levelup = NULL;
$wiki_name = 'WikiStart';
$wiki_location = $location.anchor('/wiki/'.$wiki_name, $wiki_name);
}

$data['wiki_name'] = $wiki_name;
$data['wiki_name_levelup'] = $wiki_name_levelup;
$data['wiki_location'] = $wiki_location;

$sql_wiki = "select * from wiki where name='$wiki_name' order by version desc limit 1";
$query_wiki = $this->db->query($sql_wiki);

if ($query_wiki->num_rows() > 0)
{

if ($get_param['action'] == 'edit') {

$data['query_wiki'] = $query_wiki;

$this->load->view('header_view', $data);
$this->load->view('wiki/wiki_edit', $data);
$this->load->view('footer_view');

}
else if ($get_param['action'] == 'delete') {

$data['query_wiki'] = $query_wiki;

$this->load->view('header_view', $data);
$this->load->view('wiki/wiki_delete', $data);
$this->load->view('footer_view');

}
else {

$data['query_wiki'] = $query_wiki;

$this->load->view('header_view', $data);
$this->load->view('wiki/wiki_view', $data);
$this->load->view('footer_view');

}

}
else
{
$data['query_wiki'] = NULL;

$this->load->view('header_view', $data);
$this->load->view('wiki/wiki_create', $data);
$this->load->view('footer_view');
}

}
 다음글 [질문] url에서 마지막에 나오는 / 를 제거하는 방... (3)
 이전글 포럼 개발에 대한 의견 (2)

댓글

우노 / 2009/07/13 08:16:52 / 추천 0
주말에 작성한 것으로 업데이트 하였습니다.
이제 diff 를 봐야겠는데... 주중에 시간이 어떻게 될지 모르겠네요.
우노 / 2009/07/13 08:43:31 / 추천 0
_remap() 을 이용하면, 주소체계를 완전히 나만의 것으로 만들 수 있겠군요.
위의 파라미터를 가지고 오는 부문과 페이지네이션 부문과 곁들이면 여러가지로 쓸모가 있을거 같습니다.
역시 CI는 유연성이 많군요.