分页不正确显示页码Codeigniter

时间:2012-01-28 14:52:07

标签: php codeigniter pagination codeigniter-2

我的控制器功能

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 show 3时 当我点击第三页url show 6等等+3

是否有可能,我花了几个小时在互联网上寻求建议,但我没理解[code] $ config ['use_page_numbers'] = TRUE; [/ code]做我需要的但是在我的情况下它仍然无法正常工作。

也许你可以建议任何图书馆?

3 个答案:

答案 0 :(得分:11)

我设法在不修改课程的情况下完成了这项工作。最好的方法是制作分页类的副本,进行更改并使用它。这样,如果更新CI,则不会丢失修改。这是我的解决方案而不修改类。

首先,我想说只使用配置选项$config['use_page_numbers'] = TRUE也可以做到这一点但不完全。我发现不使用此选项的工作如下:
    如果您尝试手动编辑网址栏,则将其视为偏移,而不是像页面一样,如果您尝试使用“上一页”链接从第2页返回到第1页,它也会将页码视为偏移量。< / p>

代码:

$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) - 基本上如果第4个uri段为假, page = 0(my / url / page / 0),

page = 1(my / url / page / 1)

将显示第一页,然后其他链接将正常工作。我也在验证页面,例如 - 如果有人想要输入(my / url / page / 2323),这将引发错误,在模型中你应该检查结果是否为假,如果是控制器应该显示错误页面什么的。希望这会有所帮助。

答案 1 :(得分:7)

在分页类(/system/libraries/Pagination.php)中进行以下更改,以便它使用页码而不是偏移量。

OLD(第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;
} 

在if语句中添加'else'选项以确保默认为; 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(第175行):

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

只需注释掉这一行,以便当前页面服从控制器/ URI。

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

OLD(第206行):

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

上一页应始终将当前页面减去1。

$i = $uri_page_number - 1; 

OLD(第230行):

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

缺少分页的URI应该被视为第1页。

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

OLD(第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;
}

网页网址应使用网页编号,而不是偏移量。

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;

下一页应始终是当前页面和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(第262行):

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

最后一页应该是总页数。

$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作为参数传递给model。

这样做可以将每页的项目数乘以(当前页码-1)。这意味着,如果您的每页商品为10,并且您在第二页$start = 10 *(2-1)给出10。所以你的结果将从10,20开始,所以

希望这会有所帮助:)

答案 2 :(得分:0)

如果有人从URL手动输入页码,您可以避免php错误:

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

希望这会有所帮助...... 查询推文给我发送电子邮件@sufiyantech