在操作表单和模型记录时,你可以使用控制器逻辑的一个标准的模式。我们可以在博客演示示例中看到这种模式:
<?php
/**
* @var Solar_Sql_Model_Catalog $_model A model catalog instance.
*/
public function actionEdit($id)
{
// 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();
}
下面我们来叙述这种模式:
-
确保我们有足够的信息去获取一条记录(例如:主键值)。
-
试着获取记录并确保能够找到它。
-
通过
_isProcess()
方法判断当前传入的请求是否是由于按下提交按钮产生的。接着在传入的请求数据中(译者注:通常是一个数组)查找process
键并检验它的值。(顺便提一下,这意味着你可以在一个动作方法中响应不同类型的按键事件:预览、保存、取消等。) -
从传入的请求中获取数据,把它加载到记录中并保存记录。注意,记录会自已做数据过滤(审查和验证)。如果你喜欢,你可以检查
save()
的返回值;如果保存成功,返回值为true
,否则返回值为false
。 -
最后,不管记录的状态如何,我们都请求它通过
newForm()
方法为您生成的一个新的表单对象。该表单对象将反映该记录的当前状态,包括记录属性的任何非法信息。 -
如你所见,控制器不操作/处理表单对象。它只处理记录对象,然后请记录基于本身的属性生成表单对象,并且在
$form
中保存表单对象。