0 追蹤者

顯示文章

在我們的部落格應用程式中,文章可以顯示在文章列表中,也可以單獨顯示。前者以 index 操作實作,後者則以 view 操作實作。在本節中,我們將自訂這兩個操作以滿足我們的初始需求。

1. 自訂 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

2. 自訂 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 標題。

<?php if(!empty($_GET['tag'])): ?>
<h1>Posts Tagged with <i><?php echo CHtml::encode($_GET['tag']); ?></i></h1>
<?php endif; ?>
 
<?php $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 上編輯 !