cakephp如果验证失败,如何修改beforeValidate修改的数据

时间:2010-12-07 12:49:34

标签: cakephp validation

我有一个我在验证前修改的字段,删除空格并大写所有字母,就像这样。

    function beforeValidate(){
    $this->data['Oligo']['sequence'] = str_replace(' ', '', $this->data['Oligo']['sequence']);
    $this->data['Oligo']['sequence'] = strtoupper($this->data['Oligo']['sequence']);
}

如果验证失败,表单将显示原始数据,而不是修改后的数据。为什么?

我希望表单能够修改数据。我是否必须在控制器中执行此操作?

1 个答案:

答案 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。