코드이그나이터(CodeIgniter) 페이지네이션(pagination) 현재 페이지를 아무래도 내 맘대로 정하고 싶다면?

| 2014. 5. 2. 02:53

코드이그나이터에서 제공하는 기본적인 클래스라든지 헬퍼 함수들은 사실 그렇게까지 잘 만들었다거나 하는 게 마땅히 없긴 하지만 그래도 페이지네이션 클래스 정도는 적지 않은 수고로움을 덜어주는 고마운 친구다. 예전 썰타임 사이트가 대개 페이지네이션 형식으로 돌아갈 때 녀석을 잠시 다뤘다가 반년이 훌쩍 넘어서야 다시 녀석을 만져대니 무엇보다 아쉬운 것이 하나 있었다. 제목에서도 제대로 언급되어 있지만 바로 현재 페이지의 위치를 사용자가 정말 입맛대로 고치는 것이 쉽지 않다는 것이다.

기본적으로 코드이그나이터의 페이지네이션 클래스는, 예외 케이스 ㅡ 페이지 번호가 0보다 작다거나, 주어진 정보에서 만들어낼 수 있는 최대 페이지 수를 넘어선다거나 하는 ㅡ 를 제외하면 단 두 가지 방식으로만 현재 페이지를 인식한다. 코드이그나이터가 자랑하는 URI 세그먼트 형식, 즉 "domain.com/page/3"과 같은 형식, 아니면 쿼리 스트링 형식, 즉 "domain.com?page=3"과 같은 형식이다. 그러나 페이지를 만들다 보면, 특히나 AJAX 등을 이용해 페이지 내용을 동적으로 구성해야 할 경우 항상 주어진 형식대로만 현재 페이지를 정하게 하는 것은 대단히 어려운 일이다. 어느 때는 전자의 방식으로, 때로는 후자의 방식을 써야 할 경우가 꽤나 빈번하다는 말이다.

스택오버플로우 등에 많은 검색을 해보았지만 페이지네이션 클래스가 구성되어 있는 방식이 마지막 create_links() 메소드를 호출할 때 주어진 정보로부터 현재 페이지를 뽑아내는 방식이라 어떻게 손을 대는 것이 불가능했다. 사실 더욱 놀란 것은 나와 같은 고민을 한 사람이 (내가 찾아본 바로는) 온라인 세계에 아무도 없다는 것.

고래? 그렇다고 포기할 순 없지.

클래스 내부의 메소드가 어떤 식으로 상속되는지 몰라 코어 코드를 건드려야 한다는 다소간의 부담감은 있지만 어쨌든 단 코드 2줄로 쉽게 언제나 사용자가 원하는 페이지 번호를 정할 수 있게끔 하는 방법을 고안했다.

우선 system/libraries/Pagination.php에서 페이지네이션 클래스의 create_links()가 디폴트 값이 FALSE인 변수를 하나 전달받게 하자.

function create_links($page = FALSE)

그 뒤 현재 페이지($cur_page)를 결정하는 마지막 부분에 다음과 같은 코드를 추가하자. 만약 create_links() 메소드에 아무런 변수를 넘겨주지 않는, 원래 페이지네이션 클래스 매뉴얼과 일치하는 방식으로 사용할 경우 페이지네이션 클래스는 종전의 방식과 동일하게 동작할 것임을 확인하자. 사용자가 필요에 따라 페이지 변수를 넘겨주었을 때만 강제로 현재 페이지를 그 값으로 대체하는 것이다. 새롭게 추가된 코드 아래로는 예외 처리를 하는 알고리즘이 있기 때문에 예외 처리 코드보다는 위에 작성하는 것이 맞다고 판단했다.

// Added: Set $cur_page with $page
$this->cur_page = $page? $page: $this->cur_page;
		
// Set current page to 1 if using page numbers instead of offset
if ($this->use_page_numbers AND $this->cur_page == 0)
{
	$this->cur_page = $base_page;
}

마지막으로 컨트롤러에서 실제로 페이지 값을 강제로 정해야 할 때는 아래와 같은 식으로 활용하면 된다.

$page = $this->input->get('page');
$pagination = $this->pagination->create_links($page);