1.11. 编辑文章

对于已经存在的文章,我们必须能够编辑它们并能够标记它们是公开文章还是草稿文章。

1.11.1 “Edit”Action方法

找到并打开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();
    }
[Note]控制器、动作和过程

我们已经了解了控制器类和动作方法。但是,如果在表单中点击不同的按扭,那么这个动作方法会处理不同的过程。按下提交按钮,就相当于向动作请求了一个过程;按钮的值默认是通过$_POST['process']传递的。

请释一下在这个方法里面发生了什么?

  • 首先,我们试着通过ID查找被请求的文章;如果它不存在,刚报错。

  • 其次,我们通过检测_isProcess()来判断用户是否按了“save”按钮。如果确实如此,那么我们就从$_POST['blog']获取数据并加载到我们的记录中,然后保存它。

  • 最后,我们从记录中获得一系列表单提示并把它们保留在$this->form中。如果保存失败,那么表单提示会给我们一个回馈,告诉我们哪里出错了。

1.11.2 "Edit"视图文件

为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)并且自动产生表单供用户使用。

[Note]表单代码在哪里?

Solar视图的辅助类form()把表单提示信息储存在$this->form中,并且自动为你生成表单。这些提示信息来自于记录对象;比方说,<select>下拉弹出"draft" 和 "public"选项是因为我们在模型类的_setup()方法中添加了validateInList 过滤器。

但是,默认请况下,表单提示信息中没有按钮。为了修正这个问题,我们在辅助类form()上使用addProcess()方法。这样一来,Action方法就能够知道当前请求的是哪一个过程。

在form()辅助类中还有很多其他的方法。你能够使用它半自动地建立表单,或者你可以使用其他表单元素辅助类/方法手动建立表单。更多的信息,你可以参考Solar_View_Helper_Form类的文档。

你现在可以浏览http://localhost/index.php/blog/edit/2来编辑博客文章了。