2010-12-07 15 views
1

J'ai un champ que je modifie avant la validation, en supprimant les espaces et en mettant toutes les lettres en majuscules, comme ceci.cakephp comment puis-je avoir des données modifiées par beforeValidate rester modifié si la validation échoue

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

Si la validation échoue, le formulaire est affiché avec les données d'origine, et non celles modifiées. Pourquoi ça?

Je voudrais que le formulaire ait les données modifiées à la place. Dois-je faire cela dans le contrôleur?

Répondre

2

Le comportement que vous voyez se produit parce que, dans beforeValidate, vous modifiez les valeurs dans le membre Model::data, alors que ce qui sera rendu dans votre formulaire est membre Controller::data et Model::data n'est envoyé au contrôleur.

Ce que vous devrez faire est d'effectuer votre massage de données à partir du contrôleur. Par exemple, vous pouvez refactoriser les opérations effectuées dans beforeValidate en une méthode publique massageData, que vous appelez auparavant dans le contrôleur avant la phase de sauvegarde/validation.

Dans votre modèle:

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 
} 

Dans votre contrôleur:

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.