我有一个我在验证前修改的字段,删除空格并大写所有字母,就像这样。
function beforeValidate(){
$this->data['Oligo']['sequence'] = str_replace(' ', '', $this->data['Oligo']['sequence']);
$this->data['Oligo']['sequence'] = strtoupper($this->data['Oligo']['sequence']);
}
如果验证失败,表单将显示原始数据,而不是修改后的数据。为什么?
我希望表单能够修改数据。我是否必须在控制器中执行此操作?
答案 0 :(得分:2)
您看到的行为是因为,在beforeValidate
中,您正在修改Model::data
成员中的值,而在您的表单中呈现的内容位于Controller::data
成员中,并且Model::data
永远不会被发送回控制器。
您需要做的是从控制器执行数据按摩。例如,您可以将beforeValidate
中执行的操作重构为公共方法massageData
,您可以在保存/验证阶段之前在控制器中调用它。
在你的模特中:
class Oligo extends AppModel
{
// stuff
function massageData($data){
$data['Oligo']['sequence'] = str_replace(' ', '', $data['Oligo']['sequence']);
$data['Oligo']['sequence'] = strtoupper($data['Oligo']['sequence']);
return $data;
}
// other stuff
}
在您的控制器中:
class OligosController extends AppController
{
// stuff
function add()
{
if ($this->data) {
$this->data = $this->Oligo->massageData($this->data);
if ($this->Oligo->save($this->data)) {
// post-save logic
} else {
// error handling
}
}
// view context preparation
}
// other stuff
}
HTH。