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 相关文章推荐
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
PHP数组实例总结与说明
Aug 23 PHP
php中长文章分页显示实现代码
Sep 29 PHP
php后门URL的防范
Nov 12 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
PHP使用flock实现文件加锁的方法
Jul 01 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
CI配置多数据库访问的方法
Mar 28 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 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 编程的 5个良好习惯
2009/02/20 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
js实现跳一跳小游戏
2020/07/31 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
python socket 超时设置 errno 10054
2014/07/01 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python发送邮件脚本
2018/05/22 Python
Django进阶之CSRF的解决
2018/08/01 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
Django 外键的使用方法详解
2019/07/19 Python
python中关于数据类型的学习笔记
2020/07/19 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
应届生保险求职信
2013/11/11 职场文书
文明礼仪标语
2014/06/13 职场文书
党员证明模板
2015/06/19 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python