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 相关文章推荐
第九节 绑定 [9]
Oct 09 PHP
php 数组的一个悲剧?
May 11 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
php实现建立多层级目录的方法
Jul 19 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
php微信开发之关键词回复功能
Jun 13 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 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
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php实现的短网址算法分享
2014/06/20 PHP
php简单图像创建入门实例
2015/06/10 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
php探针不显示内存解决方法
2019/09/17 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
python读写文件操作示例程序
2013/12/02 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
介绍一下mysql的日期和时间函数
2013/03/28 面试题
初中化学教学反思
2014/01/23 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
骨干教师申报材料
2014/12/17 职场文书
应聘教师求职信范文
2015/03/20 职场文书
python实现商品进销存管理系统
2022/05/30 Python
nginx静态资源的服务器配置方法
2022/07/07 Servers