2010-12-07 62 views
1

我有一個字段,我修改之前驗證,通過刪除空格和大寫的所有字母,像這樣。cakephp如何驗證失敗,我怎麼能修改beforeValidate修改的數據

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

如果驗證失敗,表單將顯示原始數據,而不是修改後的數據。爲什麼?

我希望表單具有修改後的數據。我必須在控制器中這樣做嗎?

回答

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。