在我們的部落格應用程式中,文章可以顯示在文章列表中,也可以單獨顯示。前者以 index
操作實作,後者則以 view
操作實作。在本節中,我們將自訂這兩個操作以滿足我們的初始需求。
view
操作 ¶view
操作是由 PostController
中的 actionView()
方法實作。其顯示是由 view
視圖與視圖檔案 /wwwroot/blog/protected/views/post/view.php
所產生。
以下是在 PostController
中實作 view
操作的相關程式碼
public function actionView()
{
$post=$this->loadModel();
$this->render('view',array(
'model'=>$post,
));
}
private $_model;
public function loadModel()
{
if($this->_model===null)
{
if(isset($_GET['id']))
{
if(Yii::app()->user->isGuest)
$condition='status='.Post::STATUS_PUBLISHED
.' OR status='.Post::STATUS_ARCHIVED;
else
$condition='';
$this->_model=Post::model()->findByPk($_GET['id'], $condition);
}
if($this->_model===null)
throw new CHttpException(404,'The requested page does not exist.');
}
return $this->_model;
}
我們的變更主要在於 loadModel()
方法。在這個方法中,我們會根據 id
GET 參數查詢 Post
資料表。如果找不到文章,或文章未發布或已封存(當使用者是訪客時),我們會拋出 404 HTTP 錯誤。否則,文章物件會傳回給 actionView()
,而 actionView()
又會將文章物件傳遞給視圖腳本以進行進一步顯示。
提示: Yii 會捕捉 HTTP 例外(CHttpException 的實例),並以預定義的範本或自訂的錯誤視圖顯示它們。由
yiic
產生的骨架應用程式已經在/wwwroot/blog/protected/views/site/error.php
中包含一個自訂的錯誤視圖。如果我們想要進一步自訂錯誤顯示,可以修改這個檔案。
view
腳本中的變更主要是調整文章顯示的格式和樣式。我們在此不深入探討細節。有興趣的讀者可以參考 /wwwroot/blog/protected/views/post/view.php
。
index
操作 ¶與 view
操作一樣,我們在兩個地方自訂 index
操作:PostController
中的 actionIndex()
方法和視圖檔案 /wwwroot/blog/protected/views/post/index.php
。我們主要需要新增支援以顯示與指定標籤相關聯的文章列表。
以下是修改後的 PostController
中的 actionIndex()
方法
public function actionIndex()
{
$criteria=new CDbCriteria(array(
'condition'=>'status='.Post::STATUS_PUBLISHED,
'order'=>'update_time DESC',
'with'=>'commentCount',
));
if(isset($_GET['tag']))
$criteria->addSearchCondition('tags',$_GET['tag']);
$dataProvider=new CActiveDataProvider('Post', array(
'pagination'=>array(
'pageSize'=>5,
),
'criteria'=>$criteria,
));
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
在上面,我們先建立一個查詢條件以檢索文章列表。該條件表示只應傳回已發布的文章,並且應根據其更新時間以降序排序。因為在列表中顯示文章時,我們想要顯示文章收到了多少留言,所以在條件中我們也指定要帶回 commentCount
,如果您還記得,這是 Post::relations()
中宣告的關聯。
如果使用者想要查看具有特定標籤的文章,我們將在條件中新增搜尋條件以尋找指定的標籤。
使用查詢條件,我們建立一個資料提供者,其主要用於三個目的。首先,當可能傳回過多結果時,它會對資料進行分頁。在這裡,我們透過將頁面大小設定為 5 來客製化分頁。其次,它會根據使用者請求進行排序。最後,它將分頁和排序後的資料饋送到小工具或視圖程式碼以進行呈現。
在完成 actionIndex()
之後,我們如下修改 index
視圖。我們的變更主要是當使用者指定顯示具有標籤的文章時,新增 h1
標題。
if(!empty($_GET['tag'])): <h1>Posts Tagged with <i> echo CHtml::encode($_GET['tag']); </i></h1> endif; $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}\n{pager}", ));
請注意,在上面,我們使用 CListView 來顯示文章列表。這個小工具需要一個局部視圖來顯示每篇文章的詳細資訊。在這裡,我們指定局部視圖為 _view
,這表示檔案 /wwwroot/blog/protected/views/post/_view.php
。在這個視圖腳本中,我們可以透過名為 $data
的區域變數存取正在顯示的文章實例。
發現錯字或您認為此頁面需要改進嗎?
在 github 上編輯 !
參數
在「自訂 index 操作」章節中,參考了應用程式參數 postsPerPage。
為了使其運作,需要建立以下檔案
/wwwroot/yii/demos/blog/protected/config/params.php
可以在部落格示範範例程式碼中找到此檔案的副本。
然後需要更新主要的網頁應用程式設定檔,以便它從 params.php 載入其參數
/wwwroot/yii/demos/blog/protected/config/main.php
將此變更為
'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', ),
變更為此
'params'=>require(dirname(__FILE__).'/params.php'),
actionList 和分頁
若要將分頁新增至 actionList(),您需要設定 pageSize
$pages=new CPagination($postCount); $pages->pageSize = self::PAGE_SIZE; $pages->applyLimit($criteria);
不要只是從示範範例複製 view.php
雖然他們說 views/Post/view.php 中的變更主要與格式和樣式有關,但您不能只是將 view.php 複製到您的安裝:它們參考了您尚未建置的 _comment。
對於 _comments 視圖,請查看 這裡...
註冊 或 登入 以發表評論。