Yii中CGridView关联表搜索排序方法实例详解


Posted in PHP onDecember 03, 2014

本文实例讲述了Yii中CGridView关联表搜索排序方法。分享给大家供大家参考。具体实现方法如下:

在Yii CGridView 关联表搜索排序实现方法有点复杂,今天看了一老外写的了篇游戏,下面我整理一下与各位朋友分享一下,相信会对大家Yii框架的学习有所帮助。

首先,检查你的blog demo里的protectedmodelsComment.php,确保Comment模型有一个search的方法,如果没有,就用gii生成一个,我下载到的blog demo里倒是没有。

然后,写代码的时间到了,我们从 CommentController 开始,我们给它加一个 actionList:

public function actionList()

{

    $model=new Comment('search');

    $model->unsetAttributes();

    if(isset($_GET['Comment']))

        $model->attributes=$_GET['Comment'];

  

    $this->render('list',array(

        'model'=>$model,

    ));

}

着看起来没什么了不起的,跟你用gii生成的crud代码里的一样。现在让我来创建view,在 /protected/views/comment/ 目录下创建list.php然后粘贴以下代码

<?php $this->breadcrumbs=array(

    'Comments',

);

?>

 

<h1>Manage Comments</h1>

 

<?php $this->widget('zii.widgets.grid.CGridView', array(

    'dataProvider'=>$model->search(),

    'filter'=>$model,

    'columns' => array(

                'content',

                'post.title',

                'status',

                'author' 

        ),

));

?>

Comment List

这是一个基本的 CGridView 只显示评论的‘content', ‘status' and ‘author', 和文章的标题。我们假设想要往这张list里添加一列文章的标题,我们只需要添加post.title 就行了:

'columns'=>array(

    'content',

    'post.title',

    'status',

    'author',

),

现在如果你访问以下这个页面,发现文章的标题的确显示出来了

Yii中CGridView关联表搜索排序方法实例详解

问题:

如果你仔细瞅瞅这个页面你会发现你无法搜索文章标题,你也没办法按文章标题排序,这是因为 CGridView 在给定的 column name 里面发现了一个‘.',也就是 post.title 的点。如果有点号的话,它就不会生成搜索框。

解决方案:

要想解决这个问题,我们得费点力气。首先我们得给Commen模型添加一个 getter 和一个 setter ,比如说这么写:

private $_postTitle = null;

public function getPostTitle()

{

    if ($this->_postTitle === null && $this->post !== null)

    {

        $this->_postTitle = $this->post->title;

    }

    return $this->_postTitle;

}

public function setPostTitle($value)

{

    $this->_postTitle = $value;

}

接下来将这个属性添加到 rules 函数里:

public function rules()

{

    // NOTE: you should only define rules for those attributes that

    // will receive user inputs.

    return array(

        array('content, author, email', 'required'),

        array('author, email, url', 'length', 'max'=>128),

        array('email','email'),

        array('url','url')

  

        array('content, postTitle, status, author', 'safe', 'on'=>'search'),

    );

}

这还不够,最需要改动的是我们的 search 函数。首先我们要添一个 criteria:

$criteria=new CDbCriteria;

$criteria->with = "post"; // 确保查询 post 表

  

$criteria->compare('t.content',$this->content,true);

$criteria->compare('t.status',$this->status);

$criteria->compare('t.author',$this->author,true);

$criteria->compare('post.title', $this->postTitle,true);

然后我们添加排序:

$sort = new CSort();

$sort->attributes = array(

    'defaultOrder'=>'t.create_time DESC',

    'content'=>array(

        'asc'=>'t.content',

        'desc'=>'t.content desc',

    ),

    'status'=>array(

        'asc'=>'t.status',

        'desc'=>'t.status desc',

    ),

    'author'=>array(

        'asc'=>'t.author',

        'desc'=>'t.author desc',

    ),

    'postTitle'=>array(

        'asc'=>'post.title',

        'desc'=>'post.title desc',

    ),

);

你也许注意到了我在使用完整的 ‘tablename'.'columnname'语法,我这么做的原因是为了避免 mysql 抛出‘column is ambigious error'。

为了保证这一切正常运行,我们必须传递 CSort 实例和 CDbCriteria 实例给 CActiveDataProvider :

return new CActiveDataProvider('Comment', array(

    'criteria'=>$criteria,

    'sort'=>$sort

));
return new CActiveDataProvider('Comment', array(

    'criteria'=>$criteria,

    'sort'=>$sort

));

现在我们要做的就是修改我们的 view 以便它在 CGridView 显示想要显示的属性:

'columns'=>array(

    'content',

    'postTitle',

    'status',

    'author',

),

刷新一下,应该可以了,效果如下图所示:

Yii中CGridView关联表搜索排序方法实例详解

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

PHP 相关文章推荐
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 PHP
php 无限分类的树类代码
Dec 03 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
教大家制作简单的php日历
Nov 17 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 #PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 #PHP
Yii实现多按钮保存与提交的方法
Dec 03 #PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 #PHP
Yii框架登录流程分析
Dec 03 #PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 #PHP
PHP多线程类及用法实例
Dec 03 #PHP
You might like
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
基于python实现学生信息管理系统
2019/11/22 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
如何使用python写截屏小工具
2020/09/29 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
公司感谢信范文
2015/01/22 职场文书
滴水洞导游词
2015/02/10 职场文书
学校捐书倡议书
2015/04/27 职场文书
三八妇女节致辞
2015/07/31 职场文书
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript