CI 묻고 답하기

제목 페이징 처리 질문..
글쓴이 니로 작성시각 2015/06/23 13:39:26
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 16564   RSS
같은 홈페이지 내에 게시판에는 페이징 처리가 되어 사용중인데요

다른 php파일에 페이징 처리하는걸 추가했더니
Fatal error: Call to a member function segment() on a non-object in F:\Project\r_b2b\application\libraries\b2b.php on line 481
이와 같은 에러가 발생합니다

소스는 아래 와 같구요..
// 페이징 처리
    private function set_pagination($arr = array())
    {
        $base_url     = '/'.$this->uri->segment(1).'/'.$this->uri->segment(2, 'shop').'/'.$this->uri->segment(3, 'index');    //기본 페이지 url

        $uri_seg     = (!isset($arr['uri_seg'])) ? 3 : $arr['uri_seg'];    //기준이 될 페이지 segment

        $this->navi = array(
                'base_url'        => (!isset($arr['url']))     ? $base_url : $arr['url'],
                'total_rows'    => (!isset($arr['total_rows'])) ? 0 : $arr['total_rows'],
                'page'            => $this->uri->segment($uri_seg, '0'),
                'per_page'        => (!isset($arr['per_page']))     ? 15 : $arr['per_page'],
                'uri_segment'    => $uri_seg,
                'num_links'        => 4
        );
    
        $this->pagination->initialize($this->navi);
    
        $this->data['base_url']        = $this->navi['base_url'];
        $this->data['limit']        = $this->navi['per_page'];
        $this->data['offset']        = $this->navi['page'];
        $this->data['numbering']    = $this->navi['total_rows'] - $this->navi['page'];
        $this->data['pagination']    = $this->pagination->create_links();
    
    }



해당 php파일 상단부도 올려드릴게요
class B2B
{
	private $CI;

	public function __construct($COM_ID="")
	{
		$this->CI = & get_instance();
		
		$this->load		= $this->CI->load;
		$this->input	= $this->CI->input;
		$this->config	= $this->CI->config;
		$this->session	= $this->CI->session;

		$this->ComID = ($COM_ID) ? $COM_ID : $_COOKIE['SHOP'];	
		
		//if(!$this->ComID)	$this->errorMsg('Close');
			
	}


뭐가 문제 인지 모르겟어요...ㅠ
 다음글 (왕초보질문) view로 독립시키기 vs. 그냥 페이지... (2)
 이전글 초보개발자입니다. 설치관련 아주 기초적인 부분 문의드려... (2)

댓글

변종원(웅파) / 2015/06/23 13:45:39 / 추천 0
$this->uri 선언이 없어서 그렇습니다.

상단 construct에 선언하거나 $this->CI->uri 형태로 쓰시던가 해야합니다.
니로 / 2015/06/23 13:56:53 / 추천 0
아하! 그렇게 수정하고나니 에러는 안뜨는데...
 // 페이징 처리
 private function set_pagination($arr = array())
 {
  $base_url  = '/'.$this->CI->uri->segment(1).'/'.$this->CI->uri->segment(2, 'shop').'/'.$this->CI->uri->segment(3, 'index'); //기본 페이지 url

  $uri_seg  = (!isset($arr['uri_seg'])) ? 3 : $arr['uri_seg']; //기준이 될 페이지 segment

  $this->navi = array(
    'base_url'  => (!isset($arr['url']))  ? $base_url : $arr['url'],
    'total_rows' => (!isset($arr['total_rows'])) ? 0 : $arr['total_rows'],
    'page'   => $this->CI->uri->segment($uri_seg, '0'),
    'per_page'  => (!isset($arr['per_page']))  ? 15 : $arr['per_page'],
    'uri_segment' => $uri_seg,
    'num_links'  => 4
  );
 
  $this->pagination->initialize($this->navi);
 
  $this->data['base_url']  = $this->navi['base_url'];
  $this->data['limit']  = $this->navi['per_page'];
  $this->data['offset']  = $this->navi['page'];
  $this->data['numbering'] = $this->navi['total_rows'] - $this->navi['page'];
  $this->data['pagination'] = $this->pagination->create_links();
 
 }

$this->pagination->initialize($this->navi);
이부분에서 에러가 나네요..

Fatal error: Call to a member function initialize() on a non-object in F:\Project\r_b2b\application\libraries\b2b.php on line 494

이것도 선언을 해야하는건가요..찾아도 안보이는거 같은데..

변종원(웅파) / 2015/06/23 14:21:02 / 추천 0
똑같은 현상입니다.

라이브러리에서는 ci의 자원을 바로 사용할 수 없으므로 바로 $this->pagination을 사용하지 못합니다.
위 답변 참고해서 사용하세요. 
니로 / 2015/06/23 14:28:57 / 추천 0
음.. 그러면 다른데서 처리를 해야하나 보네요......
니로 / 2015/06/23 14:32:14 / 추천 0
그럼 view 밑에서는 가능할까요..
변종원(웅파) / 2015/06/23 15:53:02 / 추천 0
우선 기본적인 사용법을 아셔야 할 것 같습니다. 

ci 자체의 라이브러리 사용법(http://cikorea.net/user_guide_2.1.0/general/libraries.html)과 내가 추가한 라이브러리의 사용법(http://cikorea.net/user_guide_2.1.0/general/creating_libraries.html)을 읽어보세요.

똑같다고 말씀드린 이유는 소스를 보시면 
$this->pagination->initialize($this->navi); 라고 사용하는 부분은 있는데
$this->pagination <- 이걸 선언한 부분이 없는 겁니다. 그러니 initialize()를 호출할 수 없다고 나오는거구요.

php class에 대한 부분을 잘 모르신다면 php.net 에서 클래스 부분을 숙지하시고 codeigniter 작업을 하셔야 합니다. 
니로 / 2015/06/23 16:20:14 / 추천 0
ㅠㅠ 감사합니다
php쪽으로 새로 이직을 하다보니.. 실무에 바로 투입되고.. 일은많다보니 혼자 찾아보긴 하는데 힘든감이 있네요 ㅠㅠ
변종원(웅파) / 2015/06/23 18:25:05 / 추천 0
우선 $this 객체를 쓸 수 있는 범위부터 알아야 합니다. (mvc만 $this객체를 바로 사용할 수 있습니다)
그 외에는 ci $this 객체를 바로 사용하지 못하고 인스턴스를 할당해서(사용하시는 방법처럼) 써야합니다.
전 개발자가 그렇게 해놓은 것인지는 모르겠지만 
 
$this->CI = & get_instance();
 
$this->load      = $this->CI->load; <- 이런 식의 재할당은 헷갈릴 소지가 많습니다.

그냥 $this->CI나 $CI에 할당하여 사용하시는게 좋고
원래는 컨트롤러에서 선언하여 사용하는 initialize()를 라이브러리에서 사용하다 보니 방식이 달라 헷갈릴 수밖에 없습니다.

우선 매뉴얼을 쭉 읽어서 대략의 라이브러리 형태들을 익혀놓으시는 것이 좋습니다. 대략의 형태를 알면
라이브러리에서 $this->pagination->initialize($this->navi);  라고 사용하면 에러가 난다는 것을 알 수 있습니다.

ci는 매뉴얼만 잘 숙지해도 작업하시는데 큰 지장이 없습니다. ^^