Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

YiiFrameworkBlog开发向导:管理文章

Posted on 2010-02-24 21:46  analyzer  阅读(437)  评论(0)    收藏  举报

文章管理主要涉及到把文章列表在管理页面显示,和删除操作。分别由admin操作和delete操作实现。由yiic生成的代码并不需要太大的修改。下面我们主要解释这两个操作是怎么实现的。

在table中显示文章列表

admin操作在表格中显示所有的文章的列表(包括发布的和没有发布的)。表格有许多列,并提供分页。下面是PostController中的actionAdmin()方法

 
  1. public function actionAdmin()
  2. {
  3.     $criteria=new CDbCriteria;
  4.  
  5.     $pages=new CPagination(Post::model()->count());
  6.     $pages->applyLimit($criteria);
  7.  
  8.     $sort=new CSort('Post');
  9.     $sort->defaultOrder='status ASC, createTime DESC';
  10.     $sort->applyOrder($criteria);
  11.  
  12.     $posts=Post::model()->findAll($criteria);
  13.  
  14.     $this->render('admin',array(
  15.         'posts'=>$posts,
  16.         'pages'=>$pages,
  17.         'sort'=>$sort,
  18.     ));
  19. }

 

上面的代码和actonList()很像,主要的不同在于我们使用了CSort对象来描述排序信息(按照那个字段如何进行排序)。在管理界面中,表单的头部使用CSort生成适当的链接,点击之后会在当前页面对内容按照该列重新进行排序。

下面是管理界面的视图文件

 
  1. <h2>Manage Posts</h2>
  2.  
  3. <table class="dataGrid">
  4.   <tr>
  5.     <th><?php echo $sort->link('status'); ?></th>
  6.     <th><?php echo $sort->link('title'); ?></th>
  7.     <th><?php echo $sort->link('createTime'); ?></th>
  8.     <th><?php echo $sort->link('updateTime'); ?></th>
  9.   </tr>
  10. <?php foreach($posts as $n=>$post): ?>
  11.   <tr class="<?php echo $n%2?'even':'odd';?>">
  12.     <td><?php echo CHtml::encode($post->statusText); ?></td>
  13.     <td><?php echo CHtml::link(CHtml::encode($post->title),
  14.         array('show','id'=>$post->id)); ?></td>
  15.     <td><?php echo date('F j, Y',$post->createTime); ?></td>
  16.     <td><?php echo date('F j, Y',$post->updateTime); ?></td>
  17.   </tr>
  18. <?php endforeach; ?>
  19. </table>
  20.  
  21. <br/>
  22. <?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>

 

代码很直观。我们在表单中迭代输出文章的列表。在头部单元中,我们用CSort对象为排序产生可用的链接。最后我们使用CLinkPager widget,用于在需要的时候显示分页信息。

 当显示内容的时候我们调用CHtml::encode()进行html编码,可防止跨站点的页面代码攻击

删除文章

当文章在页面显示的时候,我们为当前的系统用户显示一个删除文章的连接,点击该链接会将文章删除。因为删除操作会更新服务器端的数据,我们用POST请求来触发删除错做。因为我们用下面的代码来生成删除按钮

 
  1. <?php echo CHtml::linkButton('Delete',array(
  2.    'submit'=>array('post/delete','id'=>$post->id),
  3.    'confirm'=>"Are you sure to delete this post?",
  4. )); ?>

 

CHtml::linkButton() 会生成一个带有链接的按钮,点击该链接会以post方法提交嵌入的HTML表单,在这里表单会被提交到按照array('post/delete','id'=>$post->id)生成的地址。在我们的blog应用中生成的地址应该是 /blog/index.php?r=post/delete&id=1,会调用PostController的delete方法。我们还提供了一个确认对话框。给用户提供机会来重新考虑是否进行删除操作。

下面删除操作的代码比较简单就不做过多解释了

 
  1. public function actionDelete()
  2. {
  3.     if(Yii::app()->request->isPostRequest)
  4.     {
  5.         // we only allow deletion via POST request
  6.         $this->loadPost()->delete();
  7.         $this->redirect(array('list'));
  8.     }
  9.     else
  10.         throw new CHttpException(500,'Invalid request...');
  11. }