Я пытаюсь сделать разбиение на страницы с помощью CodeIgniter, это должно быть так просто в соответствии с руководством Codeigniter, даже в примере это так
«Первая <1 2 3 4 5> Последняя»
$config['total_rows'] = $this->searchdesc_model->queryallrows(); $config['per_page'] = '10'; $config['uri_segment'] =4; $config['full_tag_open'] = '<p>'; $config['full_tag_close'] = '</p>'; $config['cur_tag_open'] = '<b>'; $config['cur_tag_close'] = '</b>'; $config['first_link'] = 'First'; $config['last_link'] = 'Last'; $config['last_tag_open'] = '<p>'; $config['last_tag_close'] = '</p>' $this->load->library('Company_Creation');
в представлении я называю это только так: pagination-> create_links (); ?> (или я отправляю его через представление, когда я его вызываю из контроллера, все же я получаю это
1 2 3>
и нет никакого способа сделать это похожим на exmaple, может показаться таким фиктивным, но кто-нибудь мог мне помочь в этом? или проблема аналогична?
благодаря
ИЗМЕНИТЬ 1
$config['total_rows'] = $this->searchdesc_model->queryallrows(); $config['per_page'] = '5'; $config['uri_segment'] =4; $config['full_tag_open'] = '<p>'; $config['full_tag_close'] = '</p>'; $config['cur_tag_open'] = '<b>'; $config['cur_tag_close'] = '</b>'; $config['first_link'] = ' First'; $config['last_link'] = ' Last'; $config['last_tag_open'] = '<p>'; $config['last_tag_close'] = '</p>'; $config['next_link'] = ''; $config['next_tag_open'] = '<p id="nextbutton" style="padding-left:5px;">'; $config['next_tag_close'] = '</p>'; $config['prev_link'] = ''; $config['prev_tag_open'] = '<p id="prevbutton" style="padding-right:5px;">'; $config['prev_tag_close'] = '</p>'; $config['num_links']=4; $data['retorno'] = $this->searchdesc_model->queryalldb($config['per_page'],$this->uri->segment(4,0)); $config['total_rows']=1000; $this->pagination->initialize($config);
Я сделал это в соответствии с некоторыми советами, которые я получаю, как вы сказали, когда многие данные работают хорошо, но я бы ЛЮБЛЮ показать первую и следующую кнопку все время, я установил total_rows после моего запроса (который я вызываю с правильным количеством строк ), и я тоже попробовал, и результаты одинаковы, мне также нужно показать только 4 числа, и я использую numb_links … все еще не работает (я не знаю, почему Ci docs говорят, что нужно работать ..) любая идея?
Благодаря!
Чтобы показать то, что показывает пример, на самом деле довольно легко. Вам просто нужно расширить библиотеку разбиения на страницы, чтобы учесть это. Я смог это сделать. Независимо от того, сколько страниц вы показываете, оно все еще показывает первую, последнюю, стрелку назад и стрелку вперед.
Если вы хотите показать 5 страниц в любое время с файловым и обратно, вам нужно иметь много результатов, чтобы заполнить эту страницу. Затем вы устанавливаете num_links
на то, что вы хотели бы до и после, если на третьей странице. Таким образом, это будет 2. Мои изменения, если вы на первой странице, должны отображать 4 страницы после того, когда это применимо. См. Изображение ниже. Белый – текущая страница. Зеленые страницы доступны.
Надеюсь, я все правильно объяснил, и это работает для вас. Дай мне знать.
контроллер
$this->pagingConfig = array(); $this->pagingConfig['base_url'] = 'URL'; $this->pagingConfig['total_rows'] = 0;//TOTAL ROWS $this->pagingConfig['cur_page'] = 0;//CURRENT PAGE NUMBER $this->pagingConfig['per_page'] = 0;//YOUR RESULTS PER PAGE $this->pagingConfig['num_links'] = 2;//NUMBER OF LINKS BEFORE AND AFTER CURRENT PAGE IF ON PAGE ONE WILL SHOW 4 PAGES AFTERWARDS IF YOU HAVE ENOUGH RESULTS TO FILL THAT MANY $this->pagingConfig['first_link'] = "<< First"; $this->pagingConfig['last_link'] = "Last >>"; $this->pagingConfig['full_tag_open'] = "<div class='pagination'>"; $this->pagingConfig['full_tag_close'] = "</div>"; $this->pagingConfig['last_tag_open'] = ""; $this->pagingConfig['first_tag_close'] = ""; $this->pagingConfig['anchor_class'] = "page"; $this->pagination->initialize($this->pagingConfig); $strPaging = $this->pagination->create_links();
РАСШИРЕННАЯ БИБЛИОТЕЧНАЯ БИБЛИОТЕКА
function create_links() { // EDIT: ADDED THIS BECAUSE COULDN'T SEEM TO SET THIS ANYWHERE ELSE if ($this->anchor_class != '') { $this->anchor_class = 'class="'.$this->anchor_class.'" '; } // If our item count or per-page total is zero there is no need to continue. if ($this->total_rows == 0 OR $this->per_page == 0) { return ''; } // Calculate the total number of pages $num_pages = ceil($this->total_rows / $this->per_page); // Is there only one page? Hm... nothing more to do here then. if ($num_pages == 1) { return ''; } // Determine the current page number. $CI =& get_instance(); if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { if ($CI->input->get($this->query_string_segment) != 0) { $this->cur_page = $CI->input->get($this->query_string_segment); // Prep the current page - no funny business! $this->cur_page = (int) $this->cur_page; } } else { 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; } } $this->num_links = (int)$this->num_links; if ($this->num_links < 1) { show_error('Your number of links must be a positive number.'); } if ( ! is_numeric($this->cur_page)) { $this->cur_page = 1; } // Is the page number beyond the result range? // If so we show the last page if ($this->cur_page > $this->total_rows) { $this->cur_page = ($num_pages - 1); } // EDIT: DON'T NEED THIS THE WAY I'VE CHANGED IT // $uri_page_number = $this->cur_page; // $this->cur_page = floor(($this->cur_page/$this->per_page) + 1); // EDIT: START OF MODIFIED START AND END TO WORK HOW I WANT $totalLinks = ($this->num_links*2)+1; if($totalLinks > ($this->total_rows/$this->per_page)) { $totalLinks = ceil($this->total_rows/$this->per_page); } //first page if($this->cur_page == 1) { $start = 1; $end = $start + $totalLinks - 1; } //middle pages elseif($this->cur_page + $this->num_links <= $num_pages && $this->cur_page - $this->num_links > 0) { $start = $this->cur_page - $this->num_links; $end = $this->cur_page + $this->num_links; } //last couple of pages elseif(($this->cur_page + $totalLinks) > $num_pages) { $start = $num_pages - $totalLinks + 1; $end = $num_pages; //check to see if this is in the first half of links so it doesn't jump the paging if($this->cur_page <= $this->num_links) { $start = 1; $end = $start + $totalLinks - 1; } } //first couple of pages elseif(($this->cur_page - $totalLinks) < 1) { $start = 1; $end = $start + $totalLinks - 1; } // EDIT: END OF MODIFIED START AND END TO WORK HOW I WANT // EDIT: CODEIGNITERS BASE PAGING SETUP SEE ABOVE FOR MY CHANGES // $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; // $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; // Is pagination being used over GET or POST? If get, add a per_page query // string. If post, add a trailing slash to the base URL if needed if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) { $this->base_url = rtrim($this->base_url).'&'.$this->query_string_segment.'='; } else { $this->base_url = rtrim($this->base_url, '/') .'/'; } // And here we go... $output = ''; // Render the "First" link // EDIT: CHANGED TO ALWAYS SHOW FIRST LINK AT LEAST if ($this->first_link !== FALSE AND $this->cur_page != 1) { $first_url = ($this->first_url == '') ? $this->base_url."1" : $this->first_url; $output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; } else { $output .= $this->cur_tag_open.$this->first_link.$this->cur_tag_close; } // Render the "previous" link // EDIT: CHANGED TO ALWAYS SHOW PREVIOUS LINK AT LEAST if ($this->prev_link !== FALSE AND $this->cur_page != 1) { $i = $this->cur_page-1; if ($i == 0 && $this->first_url != '') { $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; } else { $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; } } else { $output .= $this->cur_tag_open.$this->prev_link.$this->cur_tag_close; } // EDIT: CHANGED THIS TO ALWAYS SHOW ALL LINKS WANTED EVEN IF ON FIRST PAGE // Render the pages if ($this->display_pages !== FALSE) { // Write the digit links for ($loop = $start; $loop <= $end; $loop++) { // EDIT: DON'T NEED THIS THE WAY I'VE CHANGED IT // $i = ($loop * $this->per_page) - $this->per_page; if ($loop >= 0) { if ($this->cur_page == $loop) { $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page } else { $n = ($loop == 0) ? '0' : $loop; 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; } } } } } // Render the "next" link // EDIT: CHANGED TO ALWAYS SHOW NEXT LINK AT LEAST if ($this->next_link !== FALSE AND $this->cur_page < $num_pages) { $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; } else { $output .= $this->cur_tag_open.$this->next_link.$this->cur_tag_close; } // Render the "Last" link // EDIT: CHANGED TO ALWAYS SHOW LAST LINK AT LEAST if ($this->last_link !== FALSE AND $this->cur_page != $num_pages) { $i = (($num_pages)); $output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.'</a>'.$this->last_tag_close; } else { $output .= $this->cur_tag_open.$this->last_link.$this->cur_tag_close; } // Kill double slashes. Note: Sometimes we can end up with a double slash // in the penultimate link so we'll kill all double slashes. $output = preg_replace("#([^:])//+#", "\\1/", $output); // Add the wrapper HTML if exists $output = $this->full_tag_open.$output.$this->full_tag_close; return $output; }
Единственная причина, по которой вы получаете 1 2 3 >
вместо « First < 1 2 3 4 5 > Last »
состоит в том, что вам просто не хватает строк в вашем результате для создания более 3 страниц.
«Первые» и «Последние» ссылки не отображаются по умолчанию, если они вам не нужны. Это не очень понятно из примера документации.
Вы не получите «Предыдущие» ссылки до тех пор, пока не продвинете страницу 1, пример на самом деле находится на стр. 3 («3» выделен жирным шрифтом).
Поскольку вы предоставляете свои собственные шаблоны в конфигурации вместо использования значений по умолчанию, ваши фактические результаты будут немного отличаться.
Если вы хотите сделать быстрый тест, чтобы увидеть больше ссылок, просто уменьшите per_page
до более низкого числа или total_rows
больше строк в total_rows
. Общее количество отображаемых ссылок также можно настроить с помощью num_links
.
Для тех людей, которые разрабатывают свое приложение CI с PostgreSql и не могут понять, почему ограничение на выборки + смещение работает «странно»:
C ontroller:
... $offset = ($page-1)*$config["per_page"]; $this->reporting_model->some_fetch_method($id, $config["per_page"], $offset); ...
M odel:
... $this->db->limit($limit_perpage, $offset); $this->db->where("id", $id); $this->db->get('some_table'); ...