php 如何配置分页codeigniter?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9255850/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 06:26:14  来源:igfitidea点击:

how to configure pagination codeigniter?

phpcodeignitersearchpagination

提问by jpganz18

Ive trying to make a pagination with CodeIgniter, it should be so simple according the manual of Codeigniter, even in the example is like this

我试着用CodeIgniter做分页,按照Codeigniter的手册应该很简单,即使在例子中也是这样

? First < 1 2 3 4 5 > Last ?

? 第一个 <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');

in the view I only call it like this pagination->create_links(); ?> (or I send it through the view when I call it from the controller, still I only get this

在视图中我只这样称呼它 pagination->create_links(); ?> (或者当我从控制器调用它时通过视图发送它,我仍然只得到这个

1 2 3 >

1 2 3 >

and there is no way to make it look like the exmaple, may sound so dummy but , anyone could help me with this? or have a problem similar?

并且没有办法让它看起来像这个例子,可能听起来很傻但是,任何人都可以帮我解决这个问题吗?或者有类似的问题?

Thanks

谢谢

EDIT 1

编辑 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);

I did this according some advices Ive recieve, like you said when are many data it works good, still I'd LOVE to show first and next button all time, I set total_rows after my query (which I call with the right number of rows) , and I tried before too and the results are the same, I also need to show only 4 numbers and I am ustying numb_links ... still doesnt work (I dont know why Ci docs say should work..) any idea?

我根据我收到的一些建议做了这个,就像你说的,当有很多数据时它运行良好,但我仍然希望始终显示第一个和下一个按钮,我在查询后设置了 total_rows(我用正确的行数调用它) ) ,我之前也试过,结果是一样的,我也只需要显示 4 个数字,我正在使用 numb_links ......仍然不起作用(我不知道为什么 Ci 文档说应该工作..)有什么想法吗?

Thanks!

谢谢!

回答by Henesnarfel

To produce what the example shows is actually pretty easy. You just need to extend the Pagination's Library to accommodate this. I was able to do this. No matter how many pages you show it still shows first, last, back arrow, and forward arrow.

生成示例中显示的内容实际上非常简单。您只需要扩展分页库来适应这一点。我能够做到这一点。无论您显示多少页,它仍会显示第一个、最后一个、后退箭头和前进箭头。

If you are wanting to show 5 pages at all times with the foward and back stuff you need to have that many results to fill that page. Then you set num_linksto what you would want before and after if on the 3rd page. So it would be 2. My changes if you are on the 1st page make it display 4 pages after when applicable. See image below. White is current page. Green is pages available.

如果您想始终显示 5 页的前后内容,您需要有那么多结果来填充该页面。然后num_links,您可以在第 3 页的前后设置您想要的内容。所以它将是 2。如果您在第一页上,我的更改使其在适用时显示 4 页。见下图。白色是当前页面。绿色是可用页面。

enter image description hereenter image description here

在此处输入图片说明在此处输入图片说明

Hopefully I've explained everything correctly and this works for you. Let me know.

希望我已经正确解释了所有内容,这对您有用。让我知道。

Controller

控制器

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

EXTENDED PAGINATION LIBRARY 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;
}

回答by Wesley Murch

The only reason you get 1 2 3 >instead of ? First < 1 2 3 4 5 > Last ?is that you simply don't have enough rows in your result to generate more than 3 pages.

你得到1 2 3 >而不是的唯一原因? First < 1 2 3 4 5 > Last ?是你的结果中没有足够的行来生成超过 3 个页面。

  • The "First" and "Last" links don't appear by default if you don't need them. It's not very clear from the documentation's example.

  • You won't get "Previous" links until you advance past page 1, the example is actually on page 3 (the "3" is bold).

  • Since you're providing your own templates in the configuration instead of using the defaults, your actual results will be slightly different.

  • 如果您不需要“第一个”和“最后一个”链接,则默认情况下不会显示它们。从文档的示例中不是很清楚。

  • 在您前进到第 1 页之前,您不会获得“上一个”链接,该示例实际上在第 3 页(“3”为粗体)。

  • 由于您在配置中提供自己的模板而不是使用默认值,因此您的实际结果会略有不同。

If you want to do a quick test to see more links, just reduce your per_pageto a lower number or include more rows in your total_rows. The total number of links shown can also be configured with num_links.

如果您想进行快速测试以查看更多链接,只需将您per_page的数量减少到一个较低的数字或在您的total_rows. 显示的链接总数也可以用 配置num_links

回答by deeplay

For those people who developing their CI app with PostgreSql and can't understand why pagination limit+offset works "weird":

对于那些使用 PostgreSql 开发 CI 应用程序并且无法理解为什么分页限制+偏移量“奇怪”的人:

Controller:

Çontroller:

...
$offset = ($page-1)*$config["per_page"];
$this->reporting_model->some_fetch_method($id, $config["per_page"], $offset);
...

Model:

中号奥德尔:

...
$this->db->limit($limit_perpage, $offset);
$this->db->where("id",   $id);
$this->db->get('some_table');
...