CodeIgniter中的分页:完整指南

使用任何全栈式Web应用程序框架的好处是您不必担心诸如输入处理,表单验证之类的常见任务,因为该框架已经为这些功能提供了包装。 因此,它使您可以专注于应用程序的业务逻辑,而不必一遍又一遍地重新发明轮子。

今天,我们将探索CodeIgniter框架中的一个重要库-分页库。

让我重点介绍我们将在本文中介绍的主题:

  • 基本分页演示
  • 探索自定义选项
  • 分页配置

基本分页演示

在本节中,我们将通过一个示例演示CodeIgniter中分页的使用。 这是了解事物如何运作的最佳方法。

在我们的示例中,我们将构建一个非常简单的用户列表,在其中,我们将从用户MySQL表中获取记录。 为了成功运行此示例,请确保在用户表中具有uiduname字段。

设置好之后,我们就可以开始滚动了。

继续创建具有以下内容的控制器文件controllers/Paging.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Paging extends CI_Controller {
    public function __construct()
	{
		parent::__construct();

		// load Pagination library
		$this->load->library('pagination');
		
		// load URL helper
		$this->load->helper('url');
	}
	
	public function index() 
	{
		// load db and model
		$this->load->database();
		$this->load->model('Users');

		// init params
		$params = array();
		$limit_per_page = 1;
		$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
		$total_records = $this->Users->get_total();

		if ($total_records > 0) 
		{
			// get current page records
			$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index);
			
			$config['base_url'] = base_url() . 'paging/index';
			$config['total_rows'] = $total_records;
			$config['per_page'] = $limit_per_page;
			$config["uri_segment"] = 3;
			
			$this->pagination->initialize($config);
			
			// build paging links
			$params["links"] = $this->pagination->create_links();
		}
		
		$this->load->view('user_listing', $params);
	}
	
	public function custom()
	{
		// load db and model
		$this->load->database();
		$this->load->model('Users');
	
		// init params
		$params = array();
		$limit_per_page = 2;
		$page = ($this->uri->segment(3)) ? ($this->uri->segment(3) - 1) : 0;
		$total_records = $this->Users->get_total();
	
		if ($total_records > 0)
		{
			// get current page records
			$params["results"] = $this->Users->get_current_page_records($limit_per_page, $page*$limit_per_page);
				
			$config['base_url'] = base_url() . 'paging/custom';
			$config['total_rows'] = $total_records;
			$config['per_page'] = $limit_per_page;
			$config["uri_segment"] = 3;
			
			// custom paging configuration
			$config['num_links'] = 2;
			$config['use_page_numbers'] = TRUE;
			$config['reuse_query_string'] = TRUE;
			
			$config['full_tag_open'] = '<div class="pagination">';
			$config['full_tag_close'] = '</div>';
			
			$config['first_link'] = 'First Page';
			$config['first_tag_open'] = '<span class="firstlink">';
			$config['first_tag_close'] = '</span>';
			
			$config['last_link'] = 'Last Page';
			$config['last_tag_open'] = '<span class="lastlink">';
			$config['last_tag_close'] = '</span>';
			
			$config['next_link'] = 'Next Page';
			$config['next_tag_open'] = '<span class="nextlink">';
			$config['next_tag_close'] = '</span>';

			$config['prev_link'] = 'Prev Page';
			$config['prev_tag_open'] = '<span class="prevlink">';
			$config['prev_tag_close'] = '</span>';

			$config['cur_tag_open'] = '<span class="curlink">';
			$config['cur_tag_close'] = '</span>';

			$config['num_tag_open'] = '<span class="numlink">';
			$config['num_tag_close'] = '</span>';
			
			$this->pagination->initialize($config);
				
			// build paging links
			$params["links"] = $this->pagination->create_links();
		}
	
		$this->load->view('user_listing', $params);
	}
}

接下来,我们需要一个模型文件models/Users.php ,该文件从users表中获取记录。

<?php
// models/Users.php
defined('BASEPATH') OR exit('No direct script access allowed');

class Users extends CI_Model 
{
    function __construct() 
	{
	  parent::__construct();
	}

	public function get_current_page_records($limit, $start) 
	{
		$this->db->limit($limit, $start);
		$query = $this->db->get("users");

		if ($query->num_rows() > 0) 
		{
			foreach ($query->result() as $row) 
			{
				$data[] = $row;
			}
			
			return $data;
		}

		return false;
	}
	
	public function get_total() 
	{
		return $this->db->count_all("users");
	}
}

最后,让我们在views/user_listing.php中创建一个显示用户列表的视图文件。

<!-- views/user_listing.php -->
<html>
    <head>
		<title>Paging Example-User Listing</title>
	</head>
	
	<body>
		<div class="container">
			<h1 id='form_head'>User Listing</h1>

			<?php if (isset($results)) { ?>
				<table border="1" cellpadding="0" cellspacing="0">
					<tr>
						<th>ID</th>
						<th>NAME</th>
					</tr>
					
					<?php foreach ($results as $data) { ?>
						<tr>
							<td><?php echo $data->uid ?></td>
							<td><?php echo $data->uname ?></td>
						</tr>
					<?php } ?>
				</table>
			<?php } else { ?>
				<div>No user(s) found.</div>
			<?php } ?>

			<?php if (isset($links)) { ?>
				<?php echo $links ?>
			<?php } ?>
		</div>
	</body>
</html>

现在,继续访问我们的自定义页面, 网址http:// your-code-igniter-site / paging / index ,您应该看到用户列表以及分页! 就是这样,我们已经做到了! 不用担心,我不会很快离开您,因为我们现在将开始剖析代码的每个部分。

我们将从模型文件models/Users.php开始,因为这将从我们的控制器方法中调用。 为了构建分页链接,我们的模型实现了两种重要的方法get_current_page_recordsget_total

让我们看一下get_total方法。 它用于计算用户表中的记录数。

public function get_total()
{
    return $this->db->count_all("users");
}

接下来,有一个get_current_page_records方法。

public function get_current_page_records($limit, $start)
{
    $this->db->limit($limit, $start);
    $query = $this->db->get("users");
 
    if ($query->num_rows() > 0)
    {
        foreach ($query->result() as $row)
        {
            $data[] = $row;
        }
        
        return $data;
    }
 
    return false;
}

get_current_page_records方法中应注意两个重要的参数。 第一个参数$limit用于指定在查询运行期间将返回的记录数。 第二个参数$start充当记录的起始索引。

因此,如您所见,给定$start$limit的值,我们可以按页获取记录。 那是分页的本质,同时我们已经实现了本文最重要的方法!

因此,这就是我们的模型-简单而优雅!

继续前进,让我们将注意力转移到控制器文件上。 继续并获取构造方法的代码。

public function __construct()
{
    parent::__construct();
 
    // load Pagination library
    $this->load->library('pagination');
    
    // load URL helper
    $this->load->helper('url');
}

为了在CodeIgniter中使用分页,您需要做的第一件事就是加载分页库。 我们可以使用$this->load->library('pagination')

我们还加载了URL帮助程序,以便我们可以使用该帮助程序提供的全局帮助程序功能。

现在,我们准备遍历控制器的核心- index方法。

public function index() 
{
		// load db and model
		$this->load->database();
		$this->load->model('Users');

		// init params
		$params = array();
		$limit_per_page = 1;
		$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
		$total_records = $this->Users->get_total();

		if ($total_records > 0) 
		{
			// get current page records
			$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index);
			
			$config['base_url'] = base_url() . 'paging/index';
			$config['total_rows'] = $total_records;
			$config['per_page'] = $limit_per_page;
			$config["uri_segment"] = 3;
			
			$this->pagination->initialize($config);
			
			// build paging links
			$params["links"] = $this->pagination->create_links();
		}
		
		$this->load->view('user_listing', $params);
	}

首先,我们确保正确加载数据库。 接下来,我们加载Users模型,以便我们可以使用模型方法。

$this->load->database();
$this->load->model('Users');

接下来,我们初始化几个重要的变量。

// init params
$params = array();
$limit_per_page = 1;
$start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
$total_records = $this->Users->get_total();

变量$limit_per_page定义每页的限制。 当然,您可以根据需要设置它。 出于示例目的,目前将其设置为1。

$start_index变量保存MySQL记录的起始索引。 CodeIgniter构建分页链接时,默认情况下会将页面的起始索引附加为URL中的第三段。 您可以更改此默认行为,但这是我们将在本文的最后一部分保留的内容,在此我们将讨论自定义选项。

最后,我们调用Users模型的get_total方法来获取users表的总记录,并将其分配给$total_records变量。

接下来,我们使用get_current_page_records方法获取当前页面的记录。

// get current page records
$params["results"] = $this->Users->get_current_page_records($limit_per_page, $start_index);

在实际开始建立分页链接之前,我们需要使用分页库的initialize方法初始化最小分页配置。

$config['base_url'] = base_url() . 'paging/index';
$config['total_rows'] = $total_records;
$config['per_page'] = $limit_per_page;
$config["uri_segment"] = 3;

$this->pagination->initialize($config);

这是构建分页链接的最小参数集。

  • base_url :建立分页链接时将使用的URL
  • total_rows :记录总数
  • per_page :每页记录数

最后,我们使用create_links方法构建分页链接。

// build paging links
$params["links"] = $this->pagination->create_links();

剩下的只是调用我们的视图user_listing并呈现输出的形式! 运行URL http:// your-code-igniter-site / paging / index以查看用户列表以及分页链接。

因此,这是一个非常简单但有用的分页示例,可以扩展以适合您的要求。

在下一节中,我们将探讨如何在外观和功能方面自定义默认分页。

探索自定义选项

在本节中,我们将探讨您希望自定义默认分页链接时可以使用的可用选项。

URI段

尽管CodeIgniter分页库会自动从URL中检测与分页相关的参数,但是如果您使用其他URL模式,则可以定义一个自定义值。

$config["uri_segment"] = 4;

数字链接数

num_links选项允许您定义在分页链接中活动页码之前和之后将显示的数字链接的数量。

$config['num_links'] = 2;

页号作为URI段

当您访问分页URI段时,默认情况下它是一个起始索引。 例如,如果每页有十条记录,则第三页的页面URI段为20。 相反,如果要在分页链接中显示实际的页码,可以将use_page_numbers设置为TRUE

$config['use_page_numbers'] = TRUE;

当然,您需要确保根据从URL检索的页码计算正确的起始索引。

保留查询字符串

通常,您最终会想保留与分页无关的查询字符串参数。 您可以使用reuse_query_string选项启用该功能。

$config['reuse_query_string'] = TRUE;

这些是可以用来更改默认分页功能的一些选项。 接下来,我们将介绍几个其他选项,这些选项使您可以更改分页链接的显示方式。

包装标签

如果要将分页代码与任何其他HTML标记包装在一起,则可以使用full_tag_openfull_tag_close选项来实现。

$config['full_tag_open'] = '<div class="pagination">';
$config['full_tag_close'] = '</div>';

如果您希望将自定义样式应用于分页链接,它可能会非常有用。

第一,最后,下一个和上一个

如果要更改将显示在第一个,最后一个,下一个和上一个链接中的文本,也可以执行此操作。

$config['first_link'] = 'First Page';
$config['last_link'] = 'Last Page';
$config['next_link'] = 'Next Page';
$config['prev_link'] = 'Prev Page';

另外,如果您想用任何HTML标签包装这些单独的链接,则可以采用与包装整个页面代码相同的方式进行。

$config['first_tag_open'] = '<span class="firstlink">';
$config['first_tag_close'] = '</span>';
 
$config['last_tag_open'] = '<span class="lastlink">';
$config['last_tag_close'] = '</span>';
 
$config['next_tag_open'] = '<span class="nextlink">';
$config['next_tag_close'] = '</span>';
 
$config['prev_tag_open'] = '<span class="prevlink">';
$config['prev_tag_close'] = '</span>';

活动链接和数字链接

有时,您想为活动链接设置不同的样式。 您可以通过如下所示应用包装标签来做到这一点。

$config['cur_tag_open'] = '<span class="curlink">';
$config['cur_tag_close'] = '</span>';

同样,如果您想用一些东西包装数字链接:

$config['num_tag_open'] = '<span class="numlink">';
$config['num_tag_close'] = '</span>';

这样就结束了定制的故事。 实际上,您可以继续查看我们的控制器文件中已经包含的http:// your-code-igniter-site / paging / custom中的自定义示例!

分页配置

现在,您已经知道使用任何模型清单设置体面分页所需的配置。 在大多数情况下,您希望在整个站点中保持相同。 您要做什么才能做到这一点? 您可能很想复制配置代码并将其粘贴到需要分页配置的每个操作中。

实际上,有一种更好的方法可以处理这种情况。 您可以在application/config/pagination.php创建页面调度配置文件,并使用$config变量定义设置。

<?php
$config['per_page'] = 10;
$config["uri_segment"] = 3;
 
$config['full_tag_open'] = '<div class="pagination">';
$config['full_tag_close'] = '</div>';
    
$config['first_link'] = 'First Page';
$config['first_tag_open'] = '<span class="firstlink">';
$config['first_tag_close'] = '</span>';
    
$config['last_link'] = 'Last Page';
$config['last_tag_open'] = '<span class="lastlink">';
$config['last_tag_close'] = '</span>';
    
$config['next_link'] = 'Next Page';
$config['next_tag_open'] = '<span class="nextlink">';
$config['next_tag_close'] = '</span>';
 
$config['prev_link'] = 'Prev Page';
$config['prev_tag_open'] = '<span class="prevlink">';
$config['prev_tag_close'] = '</span>';
 
$config['cur_tag_open'] = '<span class="curlink">';
$config['cur_tag_close'] = '</span>';
 
$config['num_tag_open'] = '<span class="numlink">';
$config['num_tag_close'] = '</span>';

基于此,修改后的index操作方法应如下所示:

public function index()
{
    // load db and model
    $this->load->database();
    $this->load->model('Users');
 
    // init params
    $params = array();
    $start_index = ($this->uri->segment(3)) ? $this->uri->segment(3) : 0;
    $total_records = $this->Users->get_total();
    
    // load config file
    $this->config->load('pagination', TRUE);
    $settings = $this->config->item('pagination');
    $settings['total_rows'] = $this->Users->get_total();
    $settings['base_url'] = base_url() . 'paging/config';
 
    if ($total_records > 0)
    {
        // get current page records
        $params["results"] = $this->Users->get_current_page_records($settings['per_page'], $start_index);
        
        // use the settings to initialize the library
        $this->pagination->initialize($settings);
        
        // build paging links
        $params["links"] = $this->pagination->create_links();
    }
    
    $this->load->view('user_listing', $params);
}

当然, total_rowsbase_url变量会因动作而total_rows ,因此您需要在每个动作中显式设置它们。

为此,首先需要加载分页配置。

$this->config->load('pagination', TRUE);
$settings = $this->config->item('pagination');

接下来,您可以覆盖特定于操作的设置。

$settings['total_rows'] = $this->Users->get_total();
$settings['base_url'] = base_url() . 'paging/config';

这样就完成了!

这就是分页配置的故事,这也结束了本文!

结论

今天,我们浏览了CodeIgniter中的分页库。

在本文的第一部分,我通过提供一个非常简单但有用的示例演示了如何使用分页库。

之后,我们讨论了设置分页时可以使用的自定义选项。

最后,我们在上一节中讨论了分页配置。

CodeIgniter是功能强大的PHP平台。 无论您是刚入门还是要使用下一个版本,请不要忘记查看我们为您提供的服务

我很想通过以下供稿以查询和评论的形式了解您的反馈!

翻译自: https://code.tutsplus.com/tutorials/pagination-in-codeigniter-the-complete-guide--cms-29030

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值