在我们的博客应用程序中,文章可以显示在文章列表中,也可以单独显示。前者通过 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()
,后者又将文章对象传递给视图脚本以进行进一步显示。
提示: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
可以在博客演示示例代码中找到此文件的副本。
然后需要更新主 Web 应用程序配置文件,以便它从 params.php 加载其参数
/wwwroot/yii/demos/blog/protected/config/main.php
更改此内容
'params'=>array( // this is used in contact page 'adminEmail'=>'[email protected]', ),
为此
'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 视图,请查看 此处...
注册 注册 或 登录 以发表评论。