手机版

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

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

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

Yii CGridView关联表中搜索排序的实现方法有点复杂。今天看了一个外国人写的游戏。让我整理一下,和朋友们分享一下。相信对大家学习Yii框架会有帮助。

首先,检查你的博客演示中的protectedmodelsComment.php,并确保评论模型有一个搜索方法。如果没有,用gii生成一个,但是我下载的博客演示里没有。

然后,是时候写代码了。让我们从CommentController开始。我们向其中添加一个actionList:并复制代码如下:公共函数actionlist(){ $ model=new comment(' search ');$ model-UNSettattributes();if(isset($ _ GET[' Comment '])$ model-attributes=$ _ GET[' Comment '];$this-render('list ',array('model'=$model,);}

它看起来不太好,就像你用gii生成的原始代码一样。现在让我创建一个视图,在/protected/view/comment/目录中创建一个list.php,然后粘贴下面的代码,复制代码如下:PHP $ this-bread crumb=数组(' Comments ',);h1管理评论/h1?PHP $ this-widget(' zii . widgets . grid . cgridview ',array(' data provider '=$ model-search(),' filter'=$model,' columns'=array('content ',' post.title ',' status ',' author ',)));

注释列表

这是一个基本的CGridView,只显示评论‘内容’、‘状态’、‘作者’,以及文章标题。让我们假设如果我们想在这个列表中添加一列文章标题,我们只需要添加post.title .复制代码如下:' columns'=array ('content ',' post . title ',' status ',' author ',)。

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

问题:

如果你仔细看这个页面,你会发现你不能搜索文章标题,也不能按文章标题排序,因为CGridView找到了一个“.”在给定的列名中,这是post.title点。如果有点,就不会生成搜索框。

解决方案:

如果我们想解决这个问题,我们必须努力工作。首先,我们必须给Commen模型添加一个getter和一个setter。例如,编写:复制代码如下:private $ _ postTitle=null公共函数GetPostTitle(){ if($ this-_ PostTitle===null $ this-post!==null){ $ this-_ PostTitle=$ this-PostTitle;}返回$ this-_ PostTitle;}公共函数setpostitle($ value){ $ this-_ Postitle=$ value;}

然后将该属性添加到规则函数中。复制代码如下:公共函数规则(){//注意:您应该只为//将接收用户输入的那些属性定义规则。返回数组(array('content,author,email ',' required ')、数组(' author,email,url ',' length ',' max'=128)、数组(' email ',' email ')、数组(' url ',' url ')数组(' content,postTitle,status,author ',' safe ',' on'='search '),);}

这还不够。最需要改变的是我们的搜索功能。首先,我们需要添加一个criteria:复制代码如下: $ criteria=new CDbCriteria$ criteria-with=' post ';//确保查询post table $ 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 :复制代码如下: $ sort=new CSort();$ sort-attributes=array(' default order '=' t . create _ time desc ',' content '=array(' ASC '=' t . content ',' desc'='t.content desc ',),' status '=array(' ASC '=' t . status desc ',),' author'=array('asc'='t.author ',' desc'='t.author desc ',),' postitle '=array(' ASC '=' post . title ',' desc'='post '

您可能已经注意到我使用的是完整的“tablename”语法。“columnname”。我这样做的原因是为了避免mysql抛出“column is ambigious error”。

为了保证这一切的正常运行,我们必须将CSort实例和CDbCriteria实例传递给CActiveDataProvider :代码如下: Return New cativedata provider(' comment ',array ('criteria'=$ criteria,' sort '=$ sort));

返回新的CActiveDataProvider('Comment ',array('criteria'=$criteria,' sort '=$ sort));

我们现在需要做的是修改我们的视图,使其显示要在CGridView中显示的属性:复制代码如下:' columns'=array ('content ',' post title ',' status ',' author ',)。

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

希望本文对基于Yii框架的PHP编程有所帮助。

版权声明:Yii中CGridView关联表搜索排序方法详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。