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(),后者又将文章对象传递给视图脚本以进行进一步显示。

提示: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 上编辑它 !