对于已经存在的文章,我们必须能够编辑它们并能够标记它们是公开文章还是草稿文章。
找到并打开Blog.php文件。(在此示例中,我们使用vim编辑器,你可以选择自己最喜欢的)
$ vim Blog.php
在类中添加以下代码:
<?php
    public function actionEdit($id = null)
    {
        // was an ID specified?
        if (! $id) {
            return $this->_error('ERR_NO_ID_SPECIFIED');
        }
    
        // fetch one blog article by ID
        $this->item = $this->_model->blogs->fetch($id);
    
        // did the blog article exist?
        if (! $this->item) {
            return $this->_error('ERR_NO_SUCH_ITEM');
        }
    
        // did the user click the save button?
        if ($this->_isProcess('save')) {
            // look for $_POST['blog'] in the request,
            // load into the record, and save it.
            $data = $this->_request->post('blog');
            $this->item->load($data);
            $this->item->save();
        }
    
        // get form hints from the record
        $this->form = $this->item->newForm();
        
        // turn off http caching
        $this->_response->setNoCache();
    }
                    ![]()  | 控制器、动作和过程 | 
|---|---|
| 
                        
                         我们已经了解了控制器类和动作方法。但是,如果在表单中点击不同的按扭,那么这个动作方法会处理不同的过程。按下提交按钮,就相当于向动作请求了一个过程;按钮的值默认是通过$_POST['process']传递的。  | 
请释一下在这个方法里面发生了什么?
- 
                                
首先,我们试着通过ID查找被请求的文章;如果它不存在,刚报错。
 - 
                                
其次,我们通过检测_isProcess()来判断用户是否按了“save”按钮。如果确实如此,那么我们就从$_POST['blog']获取数据并加载到我们的记录中,然后保存它。
 - 
                                
最后,我们从记录中获得一系列表单提示并把它们保留在$this->form中。如果保存失败,那么表单提示会给我们一个回馈,告诉我们哪里出错了。
 
为actionEdit()方法创建edit.php视图文件。
$ vim Blog/View/edit.php
在edit.php文件中,加入以下代码:
<?php $title = $this->getTextRaw('TITLE_EDIT'); $this->head()->setTitle($title); ?> <h2><?php echo $this->getText('HEADING_EDIT'); ?></h2> <?php echo $this->form() ->auto($this->form) ->addProcess('save') ->fetch(); ?>
简单地说,这张视图获得表单提示($this->form)并且自动产生表单供用户使用。
![]()  | 表单代码在哪里? | 
|---|---|
| 
                        
                         Solar视图的辅助类form()把表单提示信息储存在$this->form中,并且自动为你生成表单。这些提示信息来自于记录对象;比方说,<select>下拉弹出"draft" 和 "public"选项是因为我们在模型类的_setup()方法中添加了validateInList 过滤器。 但是,默认请况下,表单提示信息中没有按钮。为了修正这个问题,我们在辅助类form()上使用addProcess()方法。这样一来,Action方法就能够知道当前请求的是哪一个过程。 在form()辅助类中还有很多其他的方法。你能够使用它半自动地建立表单,或者你可以使用其他表单元素辅助类/方法手动建立表单。更多的信息,你可以参考Solar_View_Helper_Form类的文档。  | 
你现在可以浏览http://localhost/index.php/blog/edit/2来编辑博客文章了。
![[Note]](images/note.png)

