对于已经存在的文章,我们必须能够编辑它们并能够标记它们是公开文章还是草稿文章。
找到并打开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来编辑博客文章了。