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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
php实现的MySQL通用查询程序
Mar 11 PHP
php简单静态页生成过程
Mar 27 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
如何用PHP实现分布算法之一致性哈希算法
May 26 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实现ping
2006/10/09 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
js精度溢出解决方案
2012/12/02 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
python optparse模块使用实例
2015/04/09 Python
Python中私有属性的定义方式
2020/03/05 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
Python如何急速下载第三方库详解
2020/11/02 Python
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
2015年幼儿园中班工作总结
2015/04/25 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis