제목 | [질문] wiki의 url을 해석하기 위한 _remap() 을 만들어 봤습니다. | ||
---|---|---|---|
글쓴이 | 우노 | 작성시각 | 2009/07/12 02:05:54 |
|
|||
여러가지 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
|
우노
/
2009/07/13 08:43:31 /
추천
0
_remap() 을 이용하면, 주소체계를 완전히 나만의 것으로 만들 수 있겠군요.
위의 파라미터를 가지고 오는 부문과 페이지네이션 부문과 곁들이면 여러가지로 쓸모가 있을거 같습니다. 역시 CI는 유연성이 많군요. |
이제 diff 를 봐야겠는데... 주중에 시간이 어떻게 될지 모르겠네요.