Моя функция контроллера
function test($start_from = 0) { $this->load->library('pagination'); $data = array(); $per_page = 3; $total = $this->activity_model->count_by(); $config['base_url'] = base_url() . 'test'; $config['total_rows'] = $total; $config['per_page'] = $per_page; $config['uri_segment'] = 2; $config['num_links'] = 2; $config['use_page_numbers'] = TRUE; $data['follow'] = $this->activity_model->get($per_page, $start_from); $this->pagination->initialize($config); $data['pagination'] = $this->pagination->create_links(); $this->load->view('front_end/test' ,$data); }
мой маршрут:
$route['test'] = "user_activity/test"; $route['test/(:any)'] = "user_activity/test/$1";
модель:
function get($limit,$start_from) { $sql = "SELECT * FROM user_follow LIMIT $start_from, $limit"; $query = $this->db->query($sql); return $query->result_array(); }
Проблема в том, что у меня есть разбиение на страницы 1,2,3,4,5 …. и на каждой странице я показываю 3 элемента. Я хочу сделать это по URL-адресу, чтобы показать мои номера страниц 1,2,3,4,5
Когда я нажимаю вторую страницу, показываю URL-адрес 3 Когда я нажимаю ссылку на страницу третьей страницы, и т. Д. +3
возможно, я трачу часы на поиск советов в Интернете, но ничего, как я понимаю [code] $ config ['use_page_numbers'] = TRUE; [/ code] делает то, что мне нужно, но в моем случае он все еще не работает.
Может быть, вы можете посоветовать любую библиотеку?
Внесите следующие изменения в класс Pagination (/system/libraries/Pagination.php), чтобы он использовал номера страниц вместо смещений.
СТАРЫЙ (строки 146-153):
if ($CI->uri->segment($this->uri_segment) != 0) { $this->cur_page = $CI->uri->segment($this->uri_segment); // Prep the current page - no funny business! $this->cur_page = (int) $this->cur_page; }
NEW:
Добавить опцию 'else' в if-statement, чтобы убедиться, что значение по умолчанию: page = 1.
if ($CI->uri->segment($this->uri_segment) != 0) { $this->cur_page = $CI->uri->segment($this->uri_segment); // Prep the current page - no funny business! $this->cur_page = (int) $this->cur_page; } else { $this->cur_page = 1; }
СТАРЫЙ (строка 175):
$this->cur_page = floor(($this->cur_page/$this->per_page) + 1);
NEW:
Просто прокомментируйте эту строку, чтобы текущая страница подчинялась контроллеру / URI.
//$this->cur_page = floor(($this->cur_page/$this->per_page) + 1);
СТАРЫЙ (строка 206):
$i = $uri_page_number - $this->per_page;
NEW:
На предыдущей странице всегда должна быть вычитана текущая страница на 1.
$i = $uri_page_number - 1;
OLD (строка 230):
if ($this->cur_page == $loop)
NEW:
URI, отсутствующие в разбивке на страницы, следует рассматривать на стр. 1.
if ($this->cur_page == $loop || ($this->cur_page == 1 && $this->cur_page == $loop))
СТАРЫЙ (строка 238-247):
if ($n == '' && $this->first_url != '') { $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close; } else { $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close; }
NEW:
URL страницы должны использовать номера страниц, а не смещения.
if ($n == '' && $this->first_url != '') { $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$loop.'">'.$loop.'</a>'.$this->num_tag_close; } else { $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$loop.'">'.$loop.'</a>'.$this->num_tag_close; }
OLD (строка 256):
$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page * $this->per_page).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close;
NEW:
Следующая страница всегда должна быть суммой текущей страницы и 1.
$output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.($this->cur_page + 1).$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close;
СТАРЫЙ (строка 262):
$i = (($num_pages * $this->per_page) - $this->per_page);
NEW:
На последней странице должно быть общее количество страниц.
$i = $num_pages;
Замените все старые строки новыми строками. Перед изменением убедитесь, что вы делаете резервную копию файла.
Надеюсь это поможет 🙂
РЕДАКТИРОВАТЬ:
Вам необходимо обновить тестовую функцию контроллера следующим образом:
function test($start_from = 0) { $this->load->library('pagination'); $data = array(); $per_page = 3; $total = $this->activity_model->count_by(); $config['base_url'] = base_url() . 'test'; $config['total_rows'] = $total; $config['per_page'] = $per_page; $config['uri_segment'] = 2; $config['num_links'] = 2; $config['use_page_numbers'] = TRUE; $start = $per_page * ($start_from-1); $data['follow'] = $this->activity_model->get($per_page, $start); $this->pagination->initialize($config); $data['pagination'] = $this->pagination->create_links(); $this->load->view('front_end/test' ,$data); }
Здесь я добавил новую переменную $ start, которая равна $per_page * ($start_from-1)
. Теперь передайте этот $ start в качестве аргумента для модели.
Это означает, что количество элементов на странице умножается на число (номер текущей страницы -1). Это означает, что если ваши позиции на странице равны 10
а вы на второй странице – $start = 10 *(2-1)
что дает 10
, Таким образом, ваш результат будет начинаться с 10,20, и поэтому один
Надеюсь это поможет 🙂
Мне удалось это сделать без изменения класса. Лучший способ – сделать копию класса разбиения на страницы, внести изменения и использовать его. Таким образом, если вы обновите CI, вы не потеряете модификацию. Вот мое решение без изменения класса.
Сначала я хочу сказать, что использование только опции конфигурации $config['use_page_numbers'] = TRUE
также сделает трюк, но не полностью. То, что я выяснил, не работает, используя только этот параметр:
если вы попытаетесь вручную отредактировать страницы строки url, они обрабатывают их как смещенные не похожие страницы, а также, если вы попытаетесь вернуться со страницы 2 на страницу 1, используя ссылку «prev», она также рассматривает номер страницы как смещение.
Код:
$config['base_url'] = base_url('my/url/page'); $config['total_rows'] = count($this->my_model->get_all()); $config['per_page'] = 2; $config['use_page_numbers'] = TRUE; $config['uri_segment'] = 4; //i'm looading the pagination in the constuctor so just init here $this->pagination->initialize($config); if($this->uri->segment(4) > 0) $offset = ($this->uri->segment(4) + 0)*$config['per_page'] - $config['per_page']; else $offset = $this->uri->segment(4); //you should modify the method in the model to accept limit and offset or make another function - your choice $data['my_data'] = $this->my_model->get_all($config['per_page'], $offset);
Сюда
page = false (my / url) или (my / url / page) – в основном, если четвертый сегмент uri является ложным,
page = 0 (my / url / page / 0),
а также
page = 1 (my / url / page / 1)
будет отображаться первая страница, а затем другие ссылки будут работать нормально. Я также проверяю страницу, например, если кто-то хочет ввести (my / url / page / 2323), это вызовет ошибку, и в модели вы должны проверить, является ли результат ложным, и если это контроллер должен показать ошибку страницы или что-то еще. Надеюсь это поможет.
Вы можете избежать ошибок php, если кто-то вручную вводит номер страницы из URL-адреса:
например, my / url / page / 786, ваш результат может не иметь ничего, что можно было бы отобразить для запроса 786, по умолчанию он покажет вам ошибку php .., чтобы избежать этого, вы можете использовать:
if (isset($result)) { $isArray = is_array($result) ? "YES" : "NO"; //check that result is an array or not as per your requirement. if ($isArray == "YES") { echo "show your stuffs here.."; } else{ echo "display your message instead for php error here.."; } }
надеюсь, это поможет … для запроса tweet me в twitter @sufiyantech