Yii框架分页实现方法详解


Posted in PHP onMay 20, 2017

本文实例讲述了Yii框架分页实现方法。分享给大家供大家参考,具体如下:

下家公司用的框架是yii,这几天看了下相关教程,今儿把分页教程写下,最后把tp的分页也给整合进了yii,因为个人觉得yii分页没有tp用的顺手。

首页,在models目录里创建个Auth.php的模型文件,里面写入

class Auth extends CActiveRecord {
  public static function model($className = __CLASS__) {
    return parent::model($className);
  }
  public function tableName() {
    return '{{auth}}';
  }
}

接着在controllers目录里创建IndexController.php的控制文件,里面写入

class IndexController extends Controller {
  public function actionList() {
    $criteria = new CDbCriteria();
    $criteria->order = 'a_id desc';
    $count = Auth::model()->count($criteria);
    $page = new CPagination($count);
    $page->pageSize = 10;
    $page->applyLimit($criteria);
    $auth = Auth::model()->findAll($criteria);
    $this->renderPartial('auth', array('page' => $page, 'list' => $auth));
  }
  public function actionList1() {
    $p = isset($_GET['page']) ? $_GET['page'] : 0;
    $criteria = new CDbCriteria();
    $criteria->select = "a_id,a_nickname";
    $criteria->condition='';
    $criteria->limit = 10;
    $criteria->offset = $p == 0 ? 0 : (($p-1)*10);
    $criteria->order = 'a_id desc';
    $auth = Auth::model()->findAll($criteria);
    $count = Auth::model()->count($criteria);
    $page = new CPagination($count);
    $page->pageSize = 10;
    $page->applyLimit($criteria);
    $this->renderPartial('auth', array('page' => $page, 'list' => $auth));
  }
}

其中actionList和actionList1是$criteria的两种写法

最后在views目录里添加index目录,并在index目录内添加auth.php文件,里面写入

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<div class="blogList">
<ul>
  <?php foreach($list as $key=>$value){ ?>
  <li>
    <a><?php echo $value['a_nickname'];?></a>
  </li>
  <?php } ?>
</ul>
</div>
<div id="page">
<?php
  $this->widget('CLinkPager',array(
    'firstPageLabel'=>'首页',
    'lastPageLabel'=>'末页',
    'prevPageLabel'=>'上一页',
    'nextPageLabel'=>'下一页',
    'pages'=>$page,
    'maxButtonCount'=>13,
    )
  );
?>
</div>

上面是yii自带的写法,这里引入tp的分页类,做个简单的改动,步骤如下

首先,把tp的AjaxPage.class.php和Page.class.php移动到yii的项目目录下的 protected/components下面,并且把文件名称分布改为AjaxPage.php和Page.php,分别进入两个文件,把里面的C方法去掉,也就是这一句

$this->varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p' ;

改为

$this->varPage = 'p' ;

改完之后,这个两个文件是不需要引入的,因为yii在启动时会自动加载的。具体的可见protected/config.php/main.php的配置中的

// autoloading model and component classes
  'import'=>array(
    'application.models.*',
    'application.components.*',
  ),

其次,在protected/config.php/目录里新建一个common.php文件,这个文件就放些项目的公共函数,熟悉tp的朋友应该知道tp也有公共函数文件,很好用,这里借鉴下,yii应该也有吧,目前还没发现。在该文件写入

// 根据页码获取列表
function getListByPage($model, $select = '*', $condition = '', $limit = 10, $order = '', $p = '', $ajax = 0) {
  // 初始化参数
  $_GET['p'] = isset($_GET['p']) ? intval($_GET['p']) : 1;
  $limit = intval($limit) > 0 ? intval($limit) : 10;
  if ($p) {
    $_GET['p'] = intval($p) ? intval($p) : 1;
  }
  $criteria = new CDbCriteria();
  $count = $model->count($criteria);
  if ($ajax) {
    $Page = new AjaxPage($count, $limit);
  } else {
    $Page = new Page($count, $limit);
  }
  $result['page'] = trim($Page->show());
  $criteria->select = $select;
  $criteria->condition = $condition;
  $criteria->limit = $Page->listRows;
  $criteria->offset = $Page->firstRow;
  $criteria->order = $order;
  $list = $model->findAll($criteria);
  $result['list'] = $list;
  return $result;
}

这个文件可就要引入了,不然加载不了,可以在项目的入口文件index.php里自行引入,代码如下

require_once(dirname($config) . '/common.php');

最后在indexController.php中用到分页的地方调用该方法

public function actionPage() {
    $model = Auth::model();
    $info = getListByPage($model);
    $this->renderPartial('page', array('info' => $info));
}

封装了此方法,以后调用分页时,只需传几个参数,简单又快捷。在page.php页面上调用

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<div class="blogList">
<ul>
  <?php foreach($info['list'] as $key=>$value){ ?>
  <li>
    <a><?php echo $value['a_nickname'];?></a>
  </li>
  <?php } ?>
</ul>
</div>
<div id="page">
<?php
  echo $info['page'];
?>
</div>

同时利用findAll也可以实现分页的查询效果,代码如下

function getListByPage($model, $select = '*', $condition = '', $limit = 10, $order = '', $p = '', $ajax = 0) {
  if (!$model) {
    return array();;
  }
  // 初始化参数
  $_GET['p'] = isset($_GET['p']) ? intval($_GET['p']) : 1;
  $limit = intval($limit) > 0 ? intval($limit) : 10;
  if ($p) {
    $_GET['p'] = intval($p) ? intval($p) : 1;
  }
  $count = $model->count();
  if ($ajax) {
    $Page = new AjaxPage($count, $limit);
  } else {
    $Page = new Page($count, $limit);
  }
  $result['page'] = trim($Page->show());
  $result['list'] = $model->findAll(array(
    'select'    => $select,
    'condition'   => $condition,
    'order'     => $order,
    'limit'     => $Page->listRows,
    'offset'     => $Page->firstRow,
  ));
  return $result;
}

总结:

经历过ci、tp两个框架后,再看yii进度快很多。掌握某个框架,个人认为无非就是掌握mvc的使用规则,在model层调用数据库方法得到数据,controller层调用model层数据并进行逻辑处理,再传给view层,同时了解框架的模板操作,表单操作,分页操作,文件上传操作,cookie和session操作,url调用,这些掌握了,在经过项目的磨合,就差不多了,理解了常用操作之后,再去看看源码,对比并总结框架间的区别和共性,从而升华自己的技术,以后常用开发就不在话下,拿可观的薪水也是如此。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
杏林同学录(五)
Oct 09 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
PHP中如何定义和使用常量
Feb 28 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
PHP 数组基本操作方法详解
Jun 17 PHP
php 浮点数比较方法详解
May 05 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
PHP crc32()函数讲解
Feb 14 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 #PHP
yii2项目实战之restful api授权验证详解
May 20 #PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 #PHP
PHP那些琐碎的知识点(整理)
May 20 #PHP
PHP使用xpath解析XML的方法详解
May 20 #PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 #PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 #PHP
You might like
PHP实现分页的一个示例
2006/10/09 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
python实现控制台打印的方法
2019/01/12 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
新教师培训方案
2014/06/08 职场文书
世博会口号
2014/06/20 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
干部作风建设心得体会
2014/10/22 职场文书
80后婚前协议书范本
2014/10/24 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
学生安全责任协议书
2016/03/22 职场文书
《三国志》赏析
2019/08/27 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
5行Python代码实现一键批量扣图
2021/06/29 Python
什么是Python装饰器?如何定义和使用?
2022/04/11 Python