안녕들하세요...
허접해서 팁이라 하기도 뭐하지만, 해본김에...
mycastor의 input 확장을 보고 제 입맛에 맞추어보고자 해봤습니다.. mycastor Thanks~
많은 분들이 느끼시는 부분이실 $this->uri->segment(순서); 로 GET 대신 사용하는...
순서가 너무도 중요하므로 다소 곤란하거나 수정할 부분이 많이 생길 수 있죠...
그래서 얼마전 mycastor도 올리고, 이런저런 라이브러리 확장 방식등이 보이는 것 같습니다.
CI자체에 일반 쿼리스트링을 쓰는 방법도 있긴하지만... 고건 좀 싫어서....
전 get이긴한데... ?a=1&b=2 방식의 일반적인 방식은 아니고
abc.com/controller/method/파라메터명_값/파라메터명_값
이런 방식으로 만들어봤습니다.
이렇게 한 이유는 아래 소스에도 써있지만,
$config['permitted_uri_chars'] 을 손대지 않고, CI 기본 segment를 우선 거친 후 믿을 수 있는 놈을 이용하기 위함입니다. 또, 기존 segment와 병행도 가능하기 위함입니다..
파라메터 추가할 일이 생겼는데 너무 손댈데가 많아서, 제 입맛에 맞게 만들어봤습니다. 다소 오타쿠스러울지 모르겄지만..ㅋ
사용하실 분들은 마음껏~ 사용해주시면 제가 오히려 감사~~~
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* @author BaeKangMin.com
* @param (파라메터명 또는 seg, $no_result) -> 파라메터명이 숫자면 $this->uri->segment(숫자) 와 동일
* @url 타입 : abc.com/controller/method/파라메터명_값/파라메터명_값
* 즉, abc.com/controller/method/a_100/b_200 일때
* $this->uri->get('a') 하면 100이 리턴됩니다.
* $this->uri->get(3) 하면 a_100이 리턴됩니다.
* @목적1 : $config['permitted_uri_chars'] 손대지말기
* @목적2 : CI 기본 segment를 우선 거친 후 믿을 수 있는 놈을 이용
* @목적3 : 파라메터 순서 상관없이 일반(?) get방식과 비스무레하게 사용
* @단점 : 단순히 URL을 파싱하므로, 컨트롤/함수명등과 중복되지 않게 주의해야함...
*/
class MY_URI extends CI_URI
{
public function __construct()
{
parent::CI_URI();
/*
// fail...
foreach($this->segments as $key=>$val)
{
$temp = $this->segment($key);
if($temp != '_' && strpos($temp, '_') !== FALSE)
{
$temp = explode('_', $temp);
// a_ba_bb 의 경우 a를 호출하면 ba_bb가 나와야 하므로 '_' 으로 다시 조합
$this->param[$temp[0]] = join('_', array_slice($temp, 1));
}
}
*/
}
public function get($param, $no_result=FALSE)
{
//파라메터가 숫자면 CI 기본 segment 함수 호출
if(is_numeric($param) === TRUE)
{
return $this->segment($param, $no_result);
//파라메터가 문자면 쿼리스트링을 파싱해서
} else
{
foreach($this->segments as $key=>$val)
{
$temp = $this->segment($key, $no_result);
//ver 2
//정규표현식으로 파라메터명으로 시작하는 것만 잡음
//substr로 파라메터명에 '_' 붙이면 안되는 것 해결
//explode 안함으로인해 시간/메모리 이득
if($temp != $param.'_' && preg_match('/^'.$param.'_/', $temp))
{
return substr($temp, strlen($param.'_'));
}
/*
//ver 1
//파라메터명에 '_' 붙이면 안됨
if($temp != $param.'_' && strpos($temp, $param.'_') !== FALSE)
{
$temp = explode('_', $temp);
// a_ba_bb 의 경우 a를 호출하면 ba_bb가 나와야 하므로 '_' 으로 다시 조합
if($temp[0] == $param) return join('_', array_slice($temp, 1));
}
*/
}
return FALSE;
/*
// fail...
if(array_key_exists($param, $this->param))
{
return $this->param[$param];
} else {
return FALSE;
}
*/
}
}
}
/* End of File */
위 소스를 application/libraries/MY_URI.php로 저장하면, $this->uri->segment 대신 $this->uri->get(순서 혹은 파라메터명)으로 유동적으로 사용할 수 있습니다.
원래, 위 소스에 주석으로 fail.. 된 부분이 mycastor 처럼 우선 파싱하고서 골라서 써보려했는데...
지금대로면 함수 호출때마다 루프를 돌아야하므로...
단순 파싱이 아니라 URI 라이브러리의 것을 좀 쓰려고 했더니만... __construct 에서 사용이 아니되서...흠...
오늘은 그만 하고 내일 회사서 좀 더 만지작거려볼라꼬용...쩝..
어찌하면 저 fail 부분을 살릴 수 있을지 아시는 분 알려주세용~ 흠.. 질답으로 옮겨야하나...
급히 만들고 잠깐만 테스트해본지라 문제가 될 부분 있으면 말씀해주시기 바랍니다...
꾸지람 및 버그 리포팅 환영합니당~
휴일 마무리 잘 하세용~ 오늘 제가 뽑은 사람들 반띵만 되면 좋겠네용..ㅋ
@kirrie// $this->uri->uri_to_assoc(숫자); 요걸 말하는거?
요걸 말하는거라면...흠...
만약 abc.com/controller/method/지역코드/파라메터명/100/파라메터명/200
지역코드는 기본적인 segment로 가져오고 뒤는 파라메터명으로 가져오고 하려면...
일때... 물론 $this->uri->segment(3), $this->uri->uri_to_assoc(4)를 병행사용하면 되겠지만...
상황에 따라 상당히 복잡해지거나, 수정하기 힘들 수도 있을 것 같은데....흠....
물론, 무조건 $this->uri->uri_to_assoc 방식으로 간다하면 문제 없겠지만....
또 이상한게 라우팅으로 method를 생략하거나해서
abc.com/controller/파라메터명/100/파라메터명/200
와
abc.com/controller/method/파라메터명/100/파라메터명/200
이걸 동일하게 동작하게 했을때... $this->uri->ruri_to_assoc()을 사용하면
둘다 "파라메터명/100/파라메터명/200" 요걸 잡아야하는 것 같은데....못잡네... 내가 잘못하고 있나...흠...
좀더 고민해봐야징....
function segment_explode($seg) { //세크먼트 앞뒤 '/' 제거후 uri를 배열로 반환
$len = strlen($seg);
if(substr($seg, 0, 1) == '/') {
$seg = substr($seg, 1, $len);
}
$len = strlen($seg);
if(substr($seg, -1) == '/') {
$seg = substr($seg, 0, $len-1);
}
$seg_exp = explode("/", $seg);
return $seg_exp;
}요런 함수를 만들어서 page/1 을 처리하고 계시는군요...흠... 바로 다음값을 잡아서....흠...
$default = array('name', 'gender', 'location', 'type', 'sort');
$array = $this->uri->uri_to_assoc(3, $default);이거 사용합니다.