《PHP實例:Yii中CGridView關(guān)聯(lián)表搜索排序方法實例詳解》要點:
本文介紹了PHP實例:Yii中CGridView關(guān)聯(lián)表搜索排序方法實例詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP學(xué)習(xí)本文實例講述了Yii中CGridView關(guān)聯(lián)表搜索排序辦法.分享給大家供大家參考.具體實現(xiàn)辦法如下:
PHP學(xué)習(xí)在Yii CGridView 關(guān)聯(lián)表搜索排序?qū)崿F(xiàn)辦法有點復(fù)雜,今天看了一老外寫的了篇游戲,下面我整理一下與各位朋友分享一下,相信會對大家Yii框架的學(xué)習(xí)有所幫助.
PHP學(xué)習(xí)首先,檢查你的blog demo里的protectedmodelsComment.php,確保Comment模型有一個search的辦法,如果沒有,就用gii生成一個,我下載到的blog demo里倒是沒有.
PHP學(xué)習(xí)然后,寫代碼的時間到了,我們從 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,
??? ));
}
PHP學(xué)習(xí)著看起來沒什么了不起的,跟你用gii生成的crud代碼里的一樣.現(xiàn)在讓我來創(chuàng)建view,在 /protected/views/comment/ 目錄下創(chuàng)建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'
??????? ),
));
?>
PHP學(xué)習(xí)Comment List
PHP學(xué)習(xí)這是一個基本的 CGridView 只顯示評論的‘content', ‘status' and ‘a(chǎn)uthor', 和文章的標題.我們假設(shè)想要往這張list里添加一列文章的標題,我們只需要添加post.title 就行了:
代碼如下:
'columns'=>array(
??? 'content',
??? 'post.title',
??? 'status',
??? 'author',
),
PHP學(xué)習(xí)現(xiàn)在如果你拜訪以下這個頁面,發(fā)現(xiàn)文章的標題的確顯示出來了
PHP學(xué)習(xí)![PHP實例:Yii中CGridView關(guān)聯(lián)表搜索排序方法實例詳解]()
PHP學(xué)習(xí)問題:
PHP學(xué)習(xí)如果你仔細瞅瞅這個頁面你會發(fā)現(xiàn)你無法搜索文章標題,你也沒方法按文章標題排序,這是因為 CGridView 在給定的 column name 里面發(fā)現(xiàn)了一個‘.',也就是 post.title 的點.如果有點號的話,它就不會生成搜索框.
PHP學(xué)習(xí)辦理方案:
PHP學(xué)習(xí)要想辦理這個問題,我們得費點力氣.首先我們得給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;
}
PHP學(xué)習(xí)接下來將這個屬性添加到 rules 函數(shù)里:
代碼如下:
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'),
??? );
}
PHP學(xué)習(xí)這還不夠,最需要改動的是我們的 search 函數(shù).首先我們要添一個 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);
PHP學(xué)習(xí)然后我們添加排序:
代碼如下:
$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',
??? ),
);
PHP學(xué)習(xí)你也許注意到了我在使用完整的 ‘tablename'.'columnname'語法,我這么做的原因是為了避免 mysql 拋出‘column is ambigious error'.
PHP學(xué)習(xí)為了保證這一切正常運行,我們必須傳遞 CSort 實例和 CDbCriteria 實例給 CActiveDataProvider :
代碼如下:
return new CActiveDataProvider('Comment', array(
??? 'criteria'=>$criteria,
??? 'sort'=>$sort
));
PHP學(xué)習(xí)return new CActiveDataProvider('Comment', array(
??? 'criteria'=>$criteria,
??? 'sort'=>$sort
));
PHP學(xué)習(xí)現(xiàn)在我們要做的就是修改我們的 view 以便它在 CGridView 顯示想要顯示的屬性:
代碼如下:
'columns'=>array(
??? 'content',
??? 'postTitle',
??? 'status',
??? 'author',
),
PHP學(xué)習(xí)刷新一下,應(yīng)該可以了,效果如下圖所示:
PHP學(xué)習(xí)![PHP實例:Yii中CGridView關(guān)聯(lián)表搜索排序方法實例詳解]()
PHP學(xué)習(xí)希望本文所述對大家基于Yii框架的PHP程序設(shè)計有所贊助.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP實例:Yii中CGridView關(guān)聯(lián)表搜索排序方法實例詳解》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13491.html