CodeIgniter 한국사용자포럼 BETA
빠르고, 유연한 PHP Framework!

TIP게시판


$this->uri->get() 추가      
KangMin 10 2,438 0 0 2010-06-02 20:48:36

안녕들하세요...

허접해서 팁이라 하기도 뭐하지만, 해본김에...

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 2010-06-03 09:51:29
  
ㅎㅎ 미안하지만 http://www.codeigniter-kr.org/user_guide/libraries/uri.html 이미 있다능;;
KangMin 2010-06-03 10:31:34
  

@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" 요걸 잡아야하는 것 같은데....못잡네... 내가 잘못하고 있나...흠...

좀더 고민해봐야징....

kirrie 2010-06-03 10:46:15
  
아, 내가 네 소스 자세히 안봤어. 그냥 비슷한 건줄 알았는데 좀 다른가보네 ㅎㅎ
KangMin 2010-06-03 11:19:52
  
흠... 테스트 좀 해보니...

abc.com/controller/파라메터명/100/파라메터명/200

abc.com/controller/method/파라메터명/100/파라메터명/200

를 라우팅으로 동일하게 했을때...$this->uri->ruri_to_assoc() 해보니... uri_string을 꼴랑 controller/method/ 만 가져오네요.../method/파라메터명/100/파라메터명/200 이걸 다 가져와야하는데...쩝...

또, abc.com/controller/method/파라메터명//파라메터명/200

이렇게 앞 파라메터명의 값을 공백이 넘어와서 null로 인식하나 해봤더니만...

print_r 해보니, 무시하고서 Array ( [앞 파라메터명] => 뒤 파라메터 [200] => false) 이 되버리네요...

Array ( [앞 파라메터명] => false, [뒤 파라메터] => 200) 이렇게 잡아야하는디.... 이건 아닌거 같은데.... 

KangMin 2010-06-03 11:33:28
  
포럼 소스를 보니

	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 을 처리하고 계시는군요...흠... 바로 다음값을 잡아서....흠...
웅파 2010-06-03 13:19:47
  
강민/ 어 보통 쌍으로 처리를 하거나 강민이 방식대로 _로 나누거나 다른 기호를 사용하거나 하지.
난 써보니 dir/controller/method/?a=a&b=b 방식이 나은거 같아. ^^
혼용방식
KangMin 2010-06-03 13:46:26
  
웅파행님// 흐... 허용문자규약(?)을 손데기 싫어서리요.. 그거때문에 일전에 로그인 리턴 URL가지고도 거시기했었던.....
맥스 2010-06-04 23:37:42
  
비슷한 내용들 같은데. 저도 kirrie님이 남긴것 처럼
$default = array('name', 'gender', 'location', 'type', 'sort');

$array = $this->uri->uri_to_assoc(3, $default);
이거 사용합니다.
시작포인트 잡는 거는 어려운거 아니니까 잡아주고
필요에 따라 기본값 잡는 경우가 있어야 해서 거의 디폴트 값은 잡는 편입니다.

하지만 앞으로는 보안상의 이유로 해서 실제 get으로 받아야 하는 쿼리 부분은 암호화 처리 하려고 생각하고 있습니다.
양승현 2010-06-08 17:11:32
  
웹메이커는 혼용방식을 써요. 처리할께 많아지다보니 혼용방식을 쓸수밖에 없다는 ㅜ.ㅜ
SEB 2010-12-19 13:53:26
  
 검색 + 페이징만해도 상당히 머리가 아프네요..
저도 KangMin님 방법을 고려해보았었는데,, 혼자 이상한짓하는거 아닌가해서 안하고 그냥 assoc쓰고있다는 ㅋㅋ
실제로 하신분이 있었군요 ^^

아 그런데 점점 처리할양이 많아지면서 소스 중복도 많아지게되고
아무래도 혼용방식을 써야하나 생각하고 있습니다
번호 제   목 글쓴이 날짜 조회 추천수
862 form validation 에서 한글 체크 규칙 [3] sliplife 2012-05-14 89 0
859 간단한 웹페이지 캐쉬처리 라이브러리 (스마티 캐쉬 .. [2] sliplife 2012-05-10 145 0
855 워드프레스 + Codeigniter [4] 이현석 2012-05-07 209 0
850 CLI 모드로 실행할 때 로그파일 관련문제 [1] 사랑완샷 2012-04-09 262 0
848 Customization Pagination (페이.. [1] 얼짱짠군 2012-04-02 490 0
845 db library 에서 save_queries 옵.. [1] pithecus 2012-03-29 330 0
842 세션 분실 && 읽지못함 관련 팁...이 될 수 있.. [1] 밥아저씨 2012-03-10 643 0
836 Hook을 이용한 preload 이이지 구현에 대한.. [3] 핵잠함장 2012-02-22 572 0
833 CI_Cache_memcached 드라이버 버그 수정 [2] 한글이 2012-02-22 528 0
829 HMVC 5.4 & Template_ 타로구조 만들기 [2] 타로 2012-02-02 980 0
824 CI lang팩 -> Javascript lang팩 [4] KangMin 2012-01-25 772 0
823 anchor_popup 헬퍼 화면 정 가운데 띄우기.. [0] DJ구스 2012-01-17 652 0
822 [자바스크립트] 창을 화면 정중앙에 위치하게 계산하기 [1] 웅파 2012-01-11 680 0
815 hook에서 선언한 변수를 컨트롤러에서 사용하기 [2] 웅파 2011-12-27 853 0
812 mysql 부분적인 에러 핸들링 처리 [2] EziX 2011-12-20 856 0
811 컨트롤러 외부에서의 종료방법 [1] EziX 2011-12-20 682 0
809 icodekore sms 모듈 쓰는 분들 참고하세요.. [0] namGoos 2011-12-09 924 0
803 Upgrading from 2.0.3 to 2.1.0 [5] namGoos 2011-12-06 896 0
794 .svn 폴더 삭제 하기 [7] 불의회상 2011-11-30 1044 1
792 [1원] 윈도우서버+mssql 에서 CLI(Comm.. [2] 터프키드 2011-11-29 965 0