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 相关文章推荐
一个php作的文本留言本的例子(一)
Oct 09 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
PHP 截取字符串专题集合
Aug 19 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
PHP面试题之文件目录操作
Oct 15 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
PHP7原生MySQL数据库操作实现代码
Jul 03 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最常用的正则表达式
2017/02/13 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
佳能英国官方网站:Canon UK
2017/08/08 全球购物
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
大学生求职信
2014/06/17 职场文书
立志成才演讲稿
2014/09/04 职场文书
2014年就业工作总结
2014/11/26 职场文书
中学社团活动总结
2015/05/07 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python