2012-01-28 11 views
5

chức năng điều khiển của tôiPagination không đúng số trang hiển thị CodeIgniter

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

tuyến đường của tôi:

$route['test'] = "user_activity/test"; 
$route['test/(:any)'] = "user_activity/test/$1"; 

mô hình:

function get($limit,$start_from) 
{ 
$sql = "SELECT * FROM user_follow LIMIT $start_from, $limit"; 

    $query = $this->db->query($sql); 
    return $query->result_array(); 
} 

Vấn đề là tôi có pagination 1,2, 3,4,5 .... và trong mỗi trang tôi hiển thị 3 mục. Tôi muốn làm điều đó trong url nó hiển thị số trang của tôi 1,2,3,4,5

Khi tôi nhấp vào trang thứ hai url hiển thị 3 Khi tôi nhấp vào trang thứ ba url chương 6 và vân vân 3

là có thể, tôi dành hàng giờ để tìm kiếm lời khuyên trên internet nhưng không có gì khi tôi hiểu [code] $ config ['use_page_numbers'] = TRUE; [/ code] làm những gì tôi cần nhưng trong trường hợp của tôi nó vẫn không hoạt động.

Có thể bạn có thể tư vấn cho bất kỳ thư viện nào?

Trả lời

7

Thực hiện các thay đổi sau trong lớp Phân trang (/system/libraries/Pagination.php) để nó sử dụng số trang thay vì bù trừ.

OLD (dòng 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; 
} 

MỚI:

Add ‘khác’ tùy chọn để if-tuyên bố để đảm bảo mặc định là; 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; 
} 

OLD (dòng 175):

$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

MỚI:

Đơn giản chỉ cần nhận xét ra dòng này để trang hiện tuân theo điều khiển/URI.

//$this->cur_page = floor(($this->cur_page/$this->per_page) + 1); 

OLD (dòng 206):

$i = $uri_page_number - $this->per_page; 

MỚI:

Trang trước nên luôn luôn được trang hiện trừ bằng 1.

$i = $uri_page_number - 1; 

OLD (Dòng 230):

if ($this->cur_page == $loop) 

MỚI:

URI thiếu pagination nên được xem xét trang 1.

if ($this->cur_page == $loop || ($this->cur_page == 1 && $this->cur_page == $loop)) 

OLD (dòng 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; 
} 

MỚI:

URL trang nên sử dụng số trang và không offsets.

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 (dòng 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; 

MỚI:

Trang tiếp theo nên luôn luôn là tổng của trang hiện tại và 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; 

OLD (dòng 262):

$i = (($num_pages * $this->per_page) - $this->per_page); 

MỚI:

Trang cuối nên là tổng số trang.

$i = $num_pages; 

Thay thế tất cả các dòng cũ bằng dòng mới. Đảm bảo bạn sao lưu tệp trước khi thay đổi.

Hope this helps :)

EDIT:

Bạn cần cập nhật thử nghiệm chức năng điều khiển của bạn như:

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

Ở đây tôi đã thêm một $ bắt đầu biến mới đó là $per_page * ($start_from-1) . Bây giờ vượt qua $ start này làm đối số cho mô hình.

Điều này làm nhân số mục trên mỗi trang với (số trang hiện tại -1). Điều này có nghĩa là nếu các mục của bạn trên mỗi trang là 10 và bạn đang ở trang thứ hai là $start = 10 *(2-1), cung cấp 10. Vì vậy, kết quả của bạn sẽ bắt đầu từ 10,20 và như vậy một

Hope this helps :)

+0

này sẽ đi cho CodeIgniter 2.0.3? Dù sao thì cũng cám ơn bạn ! – Viktors

+0

Sẽ có một số thay đổi nhỏ trong số dòng. Bất kỳ cách nào cho nó một thử. Mỏ là một phiên bản cũ. Xin vui lòng cho tôi biết nếu nó hoạt động :) – Sabari

+0

Điều này làm việc cho bạn? – Sabari

11

tôi quản lý để làm điều này mà không sửa đổi các lớp. Cách tốt nhất là tạo một bản sao của lớp phân trang, thực hiện các thay đổi của bạn và sử dụng nó. Bằng cách này, nếu bạn cập nhật CI, bạn sẽ không bị mất sửa đổi. Đây là giải pháp của tôi mà không sửa đổi lớp.

Trước tiên tôi muốn nói rằng chỉ sử dụng tùy chọn cấu hình $config['use_page_numbers'] = TRUE cũng sẽ thực hiện thủ thuật nhưng không hoàn toàn. Những thứ tôi phát hiện không chỉ sử dụng tùy chọn này là:
nếu bạn cố chỉnh sửa trang thanh url theo cách thủ công, nó xử lý chúng như bù đắp không giống trang và cũng có thể nếu bạn cố gắng quay lại từ trang 2 đến trang 1 bằng cách sử dụng liên kết "prev" nó cũng xử lý số trang giống như một bù đắp.

Mã:

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

Bằng cách này
trang = false (tôi/url) hoặc (tôi/url/trang) - về cơ bản nếu phân khúc uri thứ 4 là sai,
page = 0 (/ url của tôi/trang/0),

page = 1 (tôi/url/trang/1)

tất cả sẽ hiển thị trang đầu tiên và sau đó là các liên kết khác sẽ làm việc tốt. Tôi cũng xác nhận trang ví dụ - nếu ai đó muốn nhập (my/url/page/2323) điều này sẽ ném một lỗi và trong mô hình bạn nên kiểm tra xem kết quả là sai và nếu nó là bộ điều khiển sẽ hiển thị một lỗi trang hay gì đó. Hi vọng điêu nay co ich.

+0

này giải quyết vấn đề của tôi tnx – Ramje

0

Bạn có thể tránh lỗi php nếu ai đó tự nhập số trang từ URL:

ví dụ của tôi/url/trang/786 kết quả của bạn có thể không có bất cứ điều gì để hiển thị cho truy vấn 786, theo mặc định nó sẽ cho bạn thấy php error..to tránh điều này bạn có thể sử dụng:

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.."; 
    } 
} 

hy vọng điều này giúp ... cho truy vấn tweet tôi tại twitter @sufiyantech