一个详细的解决方案的搜索和排序方法的cgridview相关表一
在一cgridview搜索和排序方法有点复杂。今天我看了一个外国人写的游戏。现在我想和你们分享我的朋友们。我相信它会帮助你在学习Yii框架。
首先,检查你的博客protectedmodelscomment.php演示,确保点评模式有一个搜索的方法,如果没有,使用后创建一个博客,我下载的演示是不。
然后,时间写代码的时候,我们开始commentcontroller,我们添加一个ActionList:它。
复制代码如下:公共职能ActionList()
{
为模型=新的评论(搜查);
元模型-> unsetattributes();
如果(isset($ _get { 'comment ' }))
元模型->属性= $ _get { 'comment};
美元->渲染('list,阵列(
模型= $模型,
));
}
它看起来并不好,就像你在CRUD代码生成在GII。现在让我来创建视图,创建list.php下 /保护/意见/评论/目录并粘贴下面的代码
复制代码代码如下:面包=阵列(
评论,
);
>
管理评论
('zii部件。部件。网格。cgridview,阵列(
dataProvider ' = >模式>搜索(美元),
过滤器= $模型,
(列= >阵列
内容,
职称,
状态,
作者
),
));
>
评论列表
这是一个基本的cgridview仅显示评论的内容、状态和作者,而文章的标题,我们假设我们想添加一列第这个列表的标题,我们只需要添加post.title。
复制代码代码如下:列= >阵列(
内容,
职称,
状态,
作者,
),
现在,如果您可以访问下面的页面,您会发现文章的标题确实出现了。
问题:
如果你仔细看这个页面,你会发现你无法搜索文章的标题,你将不能够通过文章的标题排序,这是因为cgridview发现在一个给定的列的名称,是post.title点。如果有时间的话,它会不生成搜索框。
解uff1a
我们要去努力解决的问题。首先,我们要添加一个getter和setter的常见模式,例如。
复制代码如下:私人_posttitle美元= null;
公共功能getposttitle()
{
如果(美元-> _posttitle零美元->后= = =!= NULL)
{
这_posttitle =美元->美元->后->标题;
}
返回_posttitle美元->;
}
公共功能setposttitle(价值)
{
美元-> _posttitle =价值;
}
接下来,将该属性添加到规则函数中:
复制代码如下:公共函数规则()
{
注意:您应该只为那些属性定义规则
接收用户输入。
返回的数组(
阵列(内容、作者、电子邮件、'required),
阵列('author,电子邮件,网址,'length ','max= > 128),
阵列('email','email'),
阵列('url ','url)
阵列(内容,posttitle,现状,作者'安全',在' = >搜查),
);
}
这还不够。需要改变的是我们的搜索功能:
复制代码代码如下:$标准=新cdbcriteria;
标准$>
$标准->比较('t.content,美元->内容,真的);
$标准->比较('t.status,美元->状态);
$标准->比较('t.author,美元->作者,真的);
$标准->比较('post。标题,美元-> posttitle,真的);
然后我们添加排序:
复制代码如下:排序=新CSort();
$ > >属性=数组(
defaultorder= >的t.create_time desc,
内容=数组(
ASC= > 't.content,
降序= >的t.content desc,
),
状态=数组(
ASC= > 't.status,
降序= >的t.status desc,
),
作者=数组(
ASC= > 't.author,
降序= >的t.author desc,
),
posttitle= >阵列(
ASC= > 'post称号,
降序= >的post.title desc,
),
);
你可能会注意到,我使用的是完整的。'columnname'grammar。我这样做的原因是为了避免MySQL扔列是模棱两可的错误。
确保所有的运行,我们必须通过csort实例和cdbcriteria实例CActiveDataProvider:
复制代码如下:返回cactivedataprovider('comment,阵列)。
标准= $标准,
排序
));
返回新的cactivedataprovider('comment,阵列(
标准= $标准,
排序
));
我们现在要做的就是修改我们的视图,它显示你想要在CGridView显示属性:
复制代码代码如下:列= >阵列(
内容,
posttitle,
状态,
作者,
),
刷新,应该可以,效果如下图所示:
希望本文有助于基于Yii框架的PHP程序设计人。