2012-02-13 25 views
6

Ive cố gắng để làm một pagination với CodeIgniter, nó phải là đơn giản như vậy theo hướng dẫn của CodeIgniter, ngay cả trong ví dụ này là như thế nàycách định cấu hình trình mã hóa pagination?

«Đầu tiên < 1 2 3 4 5> Last»

$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'); 

theo quan điểm tôi chỉ gọi nó là pagination-> create_links(); ?> (Hoặc tôi gửi nó thông qua việc xem khi tôi gọi nó từ bộ điều khiển, tôi vẫn chỉ có được điều này

1 2 3>

và không có cách nào để làm cho nó trông giống như exmaple, nghe có vẻ nên giả nhưng, bất cứ ai có thể giúp tôi với điều này? hoặc có một vấn đề tương tự như cám ơn?

EDIT 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); 

tôi đã làm điều này theo một số lời khuyên Ive Nhận các, như bạn đã nói khi có nhiều dữ liệu hoạt động tốt, tôi vẫn muốn hiển thị nút đầu tiên và tiếp theo mọi lúc, tôi đặt total_rows sau truy vấn của mình (mà tôi gọi với số lượng hàng phù hợp) và tôi đã thử trước và kết quả là như nhau, tôi cũng cần phải hiển thị chỉ có 4 con số và tôi ustying numb_links ... vẫn không làm việc (Tôi không biết tại sao Ci tài liệu nói nên làm việc ..) bất kỳ ý tưởng?

Cảm ơn!

+0

AFAIK, đó chỉ là một ví dụ về những gì pagination trông như thế nào. Không phải là phân trang thực tế có thể được tạo ra bằng cách sử dụng lớp CodeIgniter Pagination. Có thể bạn sẽ cần phải mở rộng lớp pagination và tự tinh chỉnh phương thức 'create_links()'. –

+0

Cảm ơn, bất kỳ ý tưởng nào về cách tự tạo chúng bằng cách nào? (Tôi ghét người viết mã cho những ví dụ đó và họ thậm chí không đưa ra manh mối về cách làm cho nó ...) – jpganz18

+0

Bạn đang sử dụng phiên bản CodeIgniter nào? –

Trả lời

9

Để tạo ra những gì ví dụ hiển thị thực sự khá dễ dàng. Bạn chỉ cần mở rộng Thư viện của trang để phù hợp với điều này. Tôi đã có thể làm điều này. Cho dù có bao nhiêu trang bạn hiển thị nó vẫn hiển thị đầu tiên, cuối cùng, mũi tên quay lại và mũi tên tiến.

Nếu bạn muốn hiển thị 5 trang bất cứ lúc nào với nội dung trả trước và sau, bạn cần có nhiều kết quả để điền vào trang đó. Sau đó, bạn đặt num_links thành những gì bạn muốn trước và sau nếu trên trang thứ 3. Vì vậy, nó sẽ là 2. Thay đổi của tôi nếu bạn đang ở trên trang đầu tiên làm cho nó hiển thị 4 trang sau khi áp dụng. Xem hình dưới đây. Trắng là trang hiện tại. Màu xanh lá cây là các trang có sẵn.

enter image description here enter image description here

Hy vọng rằng tôi đã giải thích tất cả mọi thứ một cách chính xác và làm việc này cho bạn. Cho tôi biết.

khiển

$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'] = "&lt;&lt; First"; 
    $this->pagingConfig['last_link'] = "Last &gt;&gt;"; 
    $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(); 

THƯ VIỆN Sự đánh số trang EXTENDED CALL

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).'&amp;'.$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; 
} 
+0

Tôi đã viết hướng dẫn về Cdeigniter Pagination. Xin vui lòng có một cái nhìn và đưa ra gợi ý của bạn https://www.cloudways.com/blog/pagination-in-codeigniter/ –

5

Lý do duy nhất bạn nhận được 1 2 3 > thay vì « First < 1 2 3 4 5 > Last » là bạn chỉ đơn giản là không có đủ hàng trong kết quả của mình để tạo nhiều hơn 3 trang.

  • Liên kết "Đầu tiên" và "Cuối cùng" không xuất hiện theo mặc định nếu bạn không cần chúng. Nó không phải là rất rõ ràng từ ví dụ của documentation.

  • Bạn sẽ không nhận được liên kết "Trước" cho đến khi bạn chuyển trang trước 1, ví dụ thực sự ở trang 3 (chữ "3" được in đậm).

  • Vì bạn đang cung cấp các mẫu của riêng mình trong cấu hình thay vì sử dụng mặc định, kết quả thực tế của bạn sẽ hơi khác.

Nếu bạn muốn làm một thử nghiệm nhanh để xem chi tiết liên kết, chỉ cần giảm của bạn per_page một số thấp hơn hoặc bao gồm nhiều hàng trong total_rows của bạn. Tổng số liên kết được hiển thị cũng có thể được định cấu hình với num_links.

+0

Cảm ơn !! Tôi đã giảm liên kết xuống 5 (hiện tại tôi chỉ có 18 hàng dữ liệu) nhưng nếu tôi đặt total_rows là thông số cao tôi nhận được, như bạn đã nói, các liên kết dành cho Đầu tiên và Cuối cùng, vấn đề nếu tôi nhấp vào cuối cùng, hãy truy cập trang đó (số trang 1000) và nó không có dữ liệu, bất kỳ cách nào khác để mô phỏng điều đó? – jpganz18

+1

Bạn chỉ cần thêm dữ liệu. Đặt 'total_rows' thành một số tùy ý chỉ hữu ích cho một bài kiểm tra nhanh để xem các liên kết, đó không phải là điều bạn thực sự muốn làm. –

+0

Cảm ơn, tôi đã thiết lập total_rows trên 1000, nhưng khi tôi nhấp vào liên kết "cuối cùng" gửi tôi đến trang 1000 ... mà không có dữ liệu ... bất kỳ ý tưởng làm thế nào để giải quyết nó? – jpganz18

0

Đối với những người phát triển ứng dụng CI của họ với PostgreSQL và không thể hiểu tại sao pagination hạn + bù đắp công trình "kỳ lạ ":

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'); 
... 
Các vấn đề liên quan