Добавление get переменных в пагинацию codeigniter

В ci станартная библиотека Pagination не решает многие задачи. Пример на то как передавать Get массив, строку в пагинацию codeigniter. вот так будет выглядеть наш код в контроллере.

//Пример стандартной настройки
//Новое тут только $config['arrGet']

$config = array();
$config['first_url'] = base_url();
$config['base_url'] = base_url();
$config['uri_segment'] = 3;

$config['arrGet'] = $arrGet;

/*

$arrGet - это заранее подготовленный массив с get переменными для передачи в пагинацию.

Например
$arrGet = array(
    'type' => 3,
    'marka' => 'destination'
);

*/
           
$config['total_rows'] = $count;
$config['use_page_numbers'] = TRUE;
$config['per_page'] = 20;
$config['first_link'] = 'В начало';

$config['num_links'] = 3;
$config['next_link'] = false;
$config['prev_link'] = false;

//Грузим настройки
$this->pagination->initialize($config);

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

/*
На выходе будут выходить ссылки вида:
http://домен/контроллер/метод/2?type=3&marka=destination
http://домен/контроллер/метод/3?type=3&marka=destination
*/

 

Теперь придется чуть отредактировать класс system/libraries/Pagination.php. Добавим обработку нашей переменной $config['arrGet'] = $arrGet в функцию initialize, она где-то с 90 строчки начинается.

function initialize($params = array())
	{
		if (count($params) > 0)
		{
               
            //Добавленный кусок
            $this->arrGet = ''; 
            if(isset($params['arrGet'])){
                
                if(!empty($params['arrGet'])){
                    $this->arrGet = '?';
                    $i = 1;
                    foreach($params['arrGet'] as $key => $val){
                        
                        if(!$i){
                            $this->arrGet .= '&';
                        }
                        
                        if($val || $val === 0){
                            $this->arrGet .= $key.'='.$val;
                        }else{
                            $this->arrGet .= $key;
                        }
                        
                        
                        
                        $i = false;
                    
                    }
                }else{
                    $this->arrGet = false;
                }
                unset($params['arrGet']);
                
            }
            // ---- конец

			foreach ($params as $key => $val)
			{
				if (isset($this->$key))
				{
					$this->$key = $val;
				}
			}
		}
	}

 

Дальше где-то на 300 строчке будет коммент // Render the pages после него ищем ссылки вида ниже и добавляем нашу переменную в конец атрибута href

$output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.$this->arrGet.'">'.$loop.'</a>'.$this->num_tag_close;

Также ссылки надо сменить после комментов // Render the "Last" link // Render the "next" link, но это не обязательно, все зависит от настроек пагинации.

Все теперь пагинация в codeigniter обрабатывает get строку

Этот пример наверное можно сделать изящнее расширением ядра, что не потребует изменения самой библиотеки. Но так быстрее и сам класс не большой, можно и отредактировать.