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 VS ASP
Oct 09 PHP
在IIS上安装PHP4.0正式版
Oct 09 PHP
php strcmp使用说明
Apr 22 PHP
php生成图形(Libchart)实例
Nov 06 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
php图像验证码生成代码
Jun 08 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 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 json_encode中文乱码问题的解决办法
2013/09/09 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
jQuery 常见学习网站与参考书
2009/11/09 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
vue 中几种传值方法(3种)
2019/11/12 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
Python多线程实例教程
2014/09/06 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
GAP欧盟网上商店:GAP EU
2016/09/13 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
小学教师事迹材料
2014/01/13 职场文书
英文演讲稿
2014/05/15 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
项目经理岗位职责范本
2015/04/01 职场文书