ZheX Blog Idea来源于生活的经验

13六/090

教程翻译:用 Yii Framework 编写博客 – 9

在我们的博客程序中, 一篇文章有可能在列表中显示,或单独显示。 前者是调用 list 操作, 后者是调用 show 操作。 在这章中, 我们将定义这来个方法来满足我们的要求。

定制 show 操作

我们通过 PostController 中的 actionShow() 方法来实现 show 操作。 通过 show 视图文件 /wwwroot/blog/protected/views/post/show.php 来完成显示工作。

下面的代码实现了 PostController 中的 show 操作:

public function actionShow()
{
    $this->render('show',array(
        'post'=>$this->loadPost(),
    ));
}
 
private $_post;
 
protected function loadPost($id=null)
{
    if($this->_post===null)
    {
        if($id!==null || isset($_GET['id']))
            $this->_post=Post::model()->findbyPk($id!==null ? $id : $_GET['id']);
        if($this->_post===null || Yii::app()->user->isGuest &&
            $this->_post->status!=Post::STATUS_PUBLISHED)
            throw new CHttpException(404,'The requested post does not exist.');
    }
    return $this->_post;
}

我们的修改主要依靠 loadPost() 方法。 在这个方法中, 我们肯据 GET 的参数来查询 Post 数据表。如果这个 post 没有被找到或者没有被发布 (当用户是 guest 的情况下),我们将会 throw 一个 HTTP 500 的错误。否则 一个 post 的对象将会被返回给 actionShow() 然后传递这个 post 对象给视图用于未来的现实工作。

提示: Yii 获取 HTTP 异常 (CHttpException 实例)并通过一些预定义的模板显示这些错误。 我们可以为每个应用自定义这些模板文件, 我们将在这章的最后来讲述。

show 视图是用来控制 post 的现实样式的,我们将不在这里具体说明。

定制 list 操作

和 show 操作一样, 我们通过两处修改来定制 list 操作:PostController 里的 actionList() 方法和 视图文件 /wwwroot/blog/protected/views/post/list.php。我们主要需要添加为特定 tag 显示文章列表的关联支持。

下面是 PostController 中 actionList() 方法的修改:

public function actionList()
{
    $criteria=new CDbCriteria;
    $criteria->condition='status='.Post::STATUS_PUBLISHED;
    $criteria->order='createTime DESC';
 
    $withOption=array('author');
    if(!empty($_GET['tag']))
    {
        $withOption['tagFilter']['params'][':tag']=$_GET['tag'];
        $postCount=Post::model()->with($withOption)->count($criteria);
    }
    else
        $postCount=Post::model()->count($criteria);
 
    $pages=new CPagination($postCount);
    $pages->applyLimit($criteria);
 
    $posts=Post::model()->with($withOption)->findAll($criteria);
 
    $this->render('list',array(
        'posts'=>$posts,
        'pages'=>$pages,
    ));
}

在上面的代码中, 我们首先建立了一个查询需要的 criteria 来控制只有 published 的 post 才被显示, 并且按照文章的创建时间作降序排列。然后我们计算满足 criteria 条件的 post 的总数量。 这个数字是用来帮助 pagination 组件正确的计算我们需要显示多少个 post 页面。 最后,我们从数据库获取 post 数据,然后传送到  list 视图显示。

注意这里有一个 tag 的 GET 参数, 我们将使用这个 GET 参数值对 tagFilter 进行查询。我们需要用一条 SQL JOIN 语句把 tagFilter 包含进来,查询给定 tag 的 相关 post。如果没有这么做, Yii 将把这个查询分割成两个 SQL 语句 (效率问题)并返回错误的结果。

我们传递了两个变量到视图: $posts 和 $pages。 $posts 用来显示文章的列表, $pages 用来显示分页的信息 (比如,一共多少页, 当前页是哪个)。 视图文件中包含了一个分页的 widget 来自动的显示分页信息。

关联文章:

  1. 教程翻译:用 Yii Framework 编写博客 – 10
  2. 教程翻译:用 Yii Framework 编写博客 – 8
  3. 教程翻译:用 Yii Framework 编写博客 – 7
  4. 教程翻译:用 Yii Framework 编写博客 – 11
  5. 教程翻译:用 Yii Framework 编写博客 – 5

评论 (0) 引用 (0)

还没有评论.


发表评论


还没有引用.