CI 묻고 답하기

제목 pagination 링크 관련 문의드림돠..^^
글쓴이 씨아이세상 작성시각 2011/11/07 21:37:45
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 24664   RSS

  세그먼트 방식으로 검색기능을 햇습니다.post방식으로 해보고 이번에는 세그먼트 방식으로 해보고 있습니다.
  검색을 하고 링크 클릭시에
  1 2 3 이 있으면 2페이지 누르면 데이터는 바뀌는데 링크는 1에걸려있고 게속 2페이지만 링크가 걸리네요
  2페이지 눌럿으면 2페이지에 링크가 걸리고 1페이지 누르면 1페이지가 되어야하는데 데이터는 바꼈는데 링크가
  1페이지에서 멈쳐잇고 2페이지링크만 공링크만 게속결려요~~
  검색않하고 페이지 눌럿을땐 잘되는데요
  어디부분이 잘못된건지 ^^ 부탁드려요...요즘 ci에 공부에 푹빠져서
  ㅎㅎ
http://127.0.0.1/public/lists/keyword/꽃  ==>검색시링크
http://127.0.0.1/public/lists/keyword/꽃/3  ==>2페이지 눌럿을때

http://127.0.0.1/public/lists/==>검색하지 않고 index페이지
http://127.0.0.1/public/lists/3==>검색하지 않고 2페이지 눌럿을씨
http://127.0.0.1/public/lists/6 ==>검색하지 않고 3페이지 눌럿을씨

controller

   $this->form_validation->set_rules('keyword', 'Keyword', 'trim|required|xss_clean');
   
    $data['keyword']=$this->input->post('keyword', TRUE);
  
   $data['keyword']=$this->uri->segment(4);
      
      //검색어가 있을시
     if($data['keyword']){
       $offset =$this->uri->segment(5);
       $config['base_url'] = "/public/list/keyword/".$data['keyword'];
     
     }else{
      //검색어가 없을시
       $offset =$this->uri->segment(3);
       $config['base_url'] = "/public/list/";
     
     }

   $list=$this->model->total_list($data['keyword']);// 게시물총수
   

   $data['perPage']=$config['per_page'] = 3; // 페이지 출력수

   $config['total_rows']=$list; //게시물수

    $data['TotalData']=$list;

    
   $data['result']=$this->model->data_entry($data['keyword'], $data['perPage'], $offset);
   
   
   $this->pagination->initialize($config);

   $data['cfg_paging'] = $this->pagination->create_links();

 다음글 CI에서 CI가 아닌 곳으로 값을 어떻게 넘기나요? (2)
 이전글 데이터를 array 형식으로 veiw 페이지로 넘겼을 ... (5)

댓글

변종원(웅파) / 2011/11/07 22:12:30 / 추천 0
 저렇게 주소가 가변적일 경우에는 uri segment()함수로 페이징 위치를 가져오지 못합니다.
그래서 주소에 page/1 이라고 변수명/값 형태로 쓰셔야 합니다.

lists/1, lists/keyword/aaa/1 <- 이거 1이라는 값 어떻게 가져올까요? 중간에 주소가 또 늘어난다면 어떻게 가져올까요?

lists/page/1, lists/keyword/aaa/page/1

위와 같이 쓰시면 주소변수중에 page 다음 값을 가져오면 페이징변수가 되겠죠.

포럼 소스 받아서 왜 그렇게 복잡하게 게시물보기 뷰 상단하고 컨트롤러에서 주소를 자르고 붙이고 했는지
이해가 되실 겁니다. (물론 초기에 만든거라 지금은 더 간단하게 처리를 하고 있습니다만..)

포럼소스 라이브러리중 common 라이브러리에 보시면 url_explode()라는 함수가 있습니다.
포럼소스 보시면서 포럼이 동작하는 구조 보시면 이해가 빨리 되실 겁니다.
(그럴 목적으로 소스를 공개한 것이기도 하구요)

/**
  * url중 키값을 구분하여 값을 가져오도록
  * @param Array $url : segment_explode 한 url값
  * @param String $key : 가져오려는 값의 key
  * @return String $url[$k] : 리턴값
  */
 function url_explode($url,$key){
  for($i=0; count($url)>$i; $i++ ){
   if($url[$i] ==$key){
    $k = $i+1;
    return $url[$k];
   }
  }
 }

//주소가 http://aaa.com/lists/keyword/aaa/page/1 일 경우 
$page = url_explode($this->uri->uri_to_accoc(), 'page'); echo $page;
// 1 나옵니다. //위 함수에서 page 대신 keyword 넣으면 aaa를 반환하겠죠.
위 함수 쓰다보면 이런 질문 하시는 분이 계십니다. 
"keyword/aaa/page/1 이 아니라 keyword/page/1로 쓰면 에러가 나는데 어떻게 하느냐고?"
주소는 개발자가 원하는 형태로 마음대로 만들어서 쓸 수 있는 것이고 
그 주소가 틀려서 에러가 난다면 그것은 당연한 것입니다. 
정해진 규칙에서 벗어난 것이 되죠. 그 벗어난 경우에 에러처리만 하면 될뿐
잘못된 규칙에 대해 정상적으로 처리해줄 방법을 찾을 필요는 없습니다.

주소를 만든다는 것 = 컨트롤러와 메소드명을 만들어내고 변수형태를 규칙화 하는 것 = 아키텍쳐
아키텍쳐 정의 없이 개발을 할 수는 없죠.  ^^ (할 수는 있으나 중구난방)

그래서 다음번 강좌는 컨트롤러, 메소드 명 정하고 변수규칙 정하는 제 방법에 대해 
만들어보려고 합니다. ^^
씨아이세상 / 2011/11/08 21:10:52 / 추천 0

웅파님감사합니다..검색기능을 post방식으로 작업햇다가 검색어가 유지가 안돼어 세그먼트방식으로 햇는데 많은 공부되었습니다..
위에 함수를 응용삼아
$this->uri->uri_to_assoc이것을 사용하여 처리해보앗어요..^^ㅎㅎ 감사합니다..
     function arr_word$key)
    {
   
     $segment = $this->uri->segment_array();
  
     $s_key = array_keys($segment, $key);//검색어 키값찾기

     if($s_key)
     {
       $s_array = $this->uri->uri_to_assoc($s_key[0]);//키값으로 배열을 리턴

       return $s_array[$key]; //검색어 리턴 
     }     
 
    }