教程翻译:用 Yii Framework 编写博客 – 10
管理 post 主要是在管理界面显示post 列表和删除 post。他们主要由 admin 操作和 delete 操作来分别完成。我们不需要对 yiic 生成的代码做太多修改。下面我们主要介绍如何完成这两个操作。
用 Tabular 方式显示文章列表
admin 操作在 tabular 中显示所有文章(包括发布的和为发布的)。这个页面同时支持分页和排序功能。下面是 PostController 的 actionAdmin() 方法:
public function actionAdmin() { $criteria=new CDbCriteria; $pages=new CPagination(Post::model()->count()); $pages->applyLimit($criteria); $sort=new CSort('Post'); $sort->defaultOrder='status ASC, createTime DESC'; $sort->applyOrder($criteria); $posts=Post::model()->findAll($criteria); $this->render('admin',array( 'posts'=>$posts, 'pages'=>$pages, 'sort'=>$sort, )); }
上面的代码和 adminList() 非常相似。 主要区别是我们这里我们用 CSort 对象来完成排序 (比如, 对哪列进行怎么样的排序)。 在 admin 视图中, 我们用 CSort 对象来生成表格头元素的链接。 当点击这些链接时, 当前页会刷新并更具当前列排列数据。
下面是 admin 视图的代码:
<h2>Manage Posts</h2>
<table class="dataGrid">
<tr>
<th><?php echo $sort->link('status'); ?></th>
<th><?php echo $sort->link('title'); ?></th>
<th><?php echo $sort->link('createTime'); ?></th>
<th><?php echo $sort->link('updateTime'); ?></th>
</tr>
<?php foreach($posts as $n=>$post): ?>
<tr class="<?php echo $n%2?'even':'odd';?>">
<td><?php echo CHtml::encode($post->statusText); ?></td>
<td><?php echo CHtml::link(CHtml::encode($post->title),
array('show','id'=>$post->id)); ?></td>
<td><?php echo date('F j, Y',$post->createTime); ?></td>
<td><?php echo date('F j, Y',$post->updateTime); ?></td>
</tr>
<?php endforeach; ?>
</table>
<br/>
<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>这段代码非常直接。 我们遍历文章列表,然后显示在表格中。 在表格的头元素中, 我们用CSort 生成排序的链接。 在最后,我们用 CLinkPager widget 在需要的情况下显示分页按钮。
提示: 当我们显示文章,我们用 CHtml::encode() 来加密 HTML 实体。 这样做是为了防止跨站点脚本攻击。
删除 Post
当我们在 show 操作中显示 post 的时候, 如果当前用户是系统所有者, 我们会显示一个删除链接。通过点击这个按钮来完成 post 的删除。 由于 post 删除功能导致服务器端数据变更, 我们用 POST 请求来触发删除功能。我们用下面的代码来生成 delete 按钮:
<?php echo CHtml::linkButton('Delete',array( 'submit'=>array('post/delete','id'=>$post->id), 'confirm'=>"Are you sure to delete this post?", )); ?>
CHtml::linkButton() 方法生成了一个链接按钮类似普通按钮。当点击这个链接的时候会通过 POST 方法提交表单。 这里我们的表单将会提交到由 array('post/delete','id'=>$post->id) 生成的 URL。 在我们的 Blog 系统中,生成的 URL 将会是 /blog/index.php?r=post/delete&id=1, 相当于 PostController 中的 delete 动作。我们同时也在点击按钮的时候跳出一个确认对话框。这个会使我们的用户能考虑清楚是否执行他们的删除操作。
delete 操作中的代码已经很明确了,我们不需要在这里加以解释。
public function actionDelete() { if(Yii::app()->request->isPostRequest) { // we only allow deletion via POST request $this->loadPost()->delete(); $this->redirect(array('list')); } else throw new CHttpException(400,'Invalid request...'); }
关联文章: