評論管理包含更新、刪除和核准評論。這些操作實作為 CommentController
類別中的動作。
Gii
產生的用於更新和刪除評論的程式碼基本上保持不變。
當評論剛建立時,它們處於待核准狀態,需要核准才能對訪客使用者可見。核准評論主要是變更評論的狀態欄位。
我們在 CommentController
中建立一個 actionApprove()
方法,如下所示:
public function actionApprove()
{
if(Yii::app()->request->isPostRequest)
{
$comment=$this->loadModel();
$comment->approve();
$this->redirect(array('index'));
}
else
throw new CHttpException(400,'Invalid request...');
}
在上述程式碼中,當透過 POST 請求調用 approve
動作時,我們呼叫在 Comment
模型中定義的 approve()
方法來變更狀態。然後,我們將使用者瀏覽器重新導向至顯示此評論所屬文章的頁面。
當然,我們也需要在 Comment
模型中建立 approve()
方法。它如下所示:
public function approve()
{
$this->status=Comment::STATUS_APPROVED;
$this->update(array('status'));
}
在這裡,我們只是將評論的狀態屬性設定為 approved
,如同 Comment
類別中的狀態常數所定義的那樣
class Comment extends CActiveRecord
{
...
const STATUS_PENDING=1;
const STATUS_APPROVED=2;
..
}
然後呼叫 update()
方法,將這個新設定的屬性儲存到資料庫。
我們也修改 CommentController
的 actionIndex()
方法,以顯示所有評論。我們希望看到待核准的評論首先顯示。
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Comment', array(
'criteria'=>array(
'with'=>'post',
'order'=>'t.status, t.create_time DESC',
),
));
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
請注意,在上述程式碼中,由於 tbl_post
和 tbl_comment
都具有 status
和 create_time
欄位,因此我們需要透過在它們前面加上表格別名來消除對應欄位參考的歧義。如 指南 中所述,關係查詢中主要表格的別名始終為 t
。因此,我們在上面的程式碼中將 t
作為字首加到 status
和 create_time
欄位,以表示我們希望從主要表格 tbl_comment
中取得這些值。
如同文章索引檢視,CommentController
的 index
檢視使用 CListView 來顯示評論列表,而評論列表又使用部分檢視 /wwwroot/blog/protected/views/comment/_view.php
來顯示每個個別評論的詳細資訊。我們在這裡不會深入探討細節。感興趣的讀者可以參考部落格示範中的相應檔案 /wwwroot/yii/demos/blog/protected/views/comment/_view.php
。
發現錯字或您認為此頁面需要改進?
在 github 上編輯 !
approve() 方法
approve() 方法應該是
public function approve() { $this->status = Comment::STATUS_APPROVED; $this->save(); }
CommentController
如果在此時您嘗試核准任何評論,您會收到錯誤 403。
要修正它
1 - 編輯 accessRules() 方法以允許來自已驗證使用者的更新
public function accessRules() { return array( array('allow', // allow authenticated users to access all actions 'users'=>array('@'), ), array('deny', // deny all users 'users'=>array('*'), ), ); }
2 - 最後,更正 actionApprove 方法如下
public function actionApprove($id) { if(Yii::app()->request->isPostRequest) { $comment=$this->loadModel($id); $comment->approve(); $this->redirect(array('index')); } else throw new CHttpException(400,'Invalid request...'); }
註冊 或 登入 以發表評論。