2010-09-16 17 views
1

J'ai une relation un-à-un entre un compte et une table d'utilisateur, j'essaye de faire tout le pré-traitement dans le beforeSave du compte modèle, mais il semble que je ne peux que changer les valeurs de $this->data['Account'][...] et non $this->data['User'][...], pourquoi est-ce le cas?Pourquoi je ne peux pas changer les données d'un autre modèle dans CakePHP

function beforeSave() { 
    // Check if this is a create or update action 
    if (empty($this->data['Account']['uid'])) { 
    $this->data['Account']['uid'] = uniqid(); 
    $this->data['Account']['date_registration'] = date('Y-m-d'); 
    $this->data['Account']['state'] = 1; 

    // this won't work 
    $this->data['User']['password'] = Security::hash($this->data['User']['password'], null, true); 
    } 
    return true; 
} 

Une autre question est quelle est la meilleure façon de vérifier si l'utilisateur est mise à jour ou la création du modèle en cas beforeSave, vérifiez empty($this->data['Account']['id']))?

Merci.

Répondre

1

Il est avéré qu'il est impossible dans CakePHP 1.3: http://cakephp.lighthouseapp.com/projects/42648/tickets/671-cant-modify-related-models-data-in-beforesave-when-using-saveall

je me suis déplacé le code au contrôleur de l'utilisateur, mais cette fois le problème est que je ne peux pas accéder directement à $ this-> Account-> nom, Bien que je puisse accéder à $ this-> Account-> id, pourquoi est-ce? J'ai dû faire le workareound ci-dessous:

function beforeSave() { 

    if (empty($this->date['User']['id'])){ 
     $this->data['User']['password'] = Security::hash($this->data['User']['password'], null, true); 

     // Username is inherited from the account name 
     // TODO: the field needs to be removed, depending whether the Auth component will play nicely 
     $account_name = $this->Account->read('name',$this->Account->id); 
     $this->data['User']['username'] = $account_name['Account']['name']; 
    } 
    return true; 
} 
+0

'$ Model :: id' est une propriété spécifiquement définie. Toutes les autres * données * sont uniquement accessibles via '$ Model :: data', comme' $ this-> Account-> data ['Account'] ['name'] '. – deceze

+0

Super utile. J'essayais d'écrire un comportement qui modifierait les données du modèle enfant dans les rappels. Impossible d'obtenir les données à enregistrer dans la base de données même si elle figurait définitivement dans le tableau $ data. Merci d'avoir partagé! – Eric