2011-11-11 2 views
0

Je suis en train de load, edit et save un record avec CakePHP 2.0 mais je reçois un generic error au cours de la méthode save qui ne me permettent pas de comprendre où est le problème.Enregistrement des données avec CakePHP ne fonctionnera pas

si j'essaye avec debug($this->User->invalidFields()); je reçois un empty array, mais j'obtiens false de $this->User->save() condition.

est ici l'action du contrôleur où je reçois l'erreur:

public function activate ($code = false) { 
    if (!empty ($code)) { 

     // if I printr $user I get the right user 
     $user = $this->User->find('first', array('activation_key' => $code)); 

     if (!empty($user)) { 
      $this->User->set(array (
       'activation_key' => null, 
       'active' => 1 
      )); 

      if ($this->User->save()) { 
       $this->render('activation_successful'); 
      } else { 
       // I get this error 
       $this->set('status', 'Save error message'); 
       $this->set('user_data', $user); 
       $this->render('activation_fail'); 
      } 
      debug($this->User->invalidFields()); 

     } else { 
      $this->set('status', 'Account not found for this key'); 
      $this->render('activation_fail'); 
     } 
    } else { 
     $this->set('status', 'Empty key'); 
     $this->render('activation_fail'); 
    } 
} 

Lorsque je tente l'action test.com/users/activate/hashedkey je reçois la page du modèle activation_fail avec le message Save error message.

Si je printr le $user var je reçois le bon utilisateur de la méthode du gâteau find.

Où est-ce que je me trompe?

+0

Est-il possible que la validation échoue? – NullUserException

+0

pouvez-vous me suggérer une autre façon de déboguer des fichiers invalides au lieu de 'debug ($ this-> User-> invalidFields());'? – vitto

Répondre

5

Je pense que le problème peut provenir de la façon dont vous interrogez l'enregistrement utilisateur. Lorsque vous faites ceci:

$user = $this->User->find('first', array('activation_key' => $code)); 

La $user variable est remplie avec l'enregistrement de l'utilisateur comme un tableau. Vous vérifiez pour vous assurer que ce n'est pas vide, puis continuez; mais le problème est que $this->User n'a pas été rempli. Je pense que si vous avez essayé debug($this->User->id) il serait vide. Le read() method fonctionne comme vous le pensez.

Vous pouvez essayer d'utiliser l'ID de ce tableau $user pour définir l'ID du modèle premier, comme ceci:

if (!empty($user)) { 
    $this->User->id = $user['User']['id']; // ensure the Model has the ID to use 
    $this->User->set(array (
     'activation_key' => null, 
     'active' => 1 
    )); 
    if ($this->User->save()) { 
    ... 

Edit: Eh bien une autre approche possible est d'utiliser le tableau $user au lieu de modifier le courant modèle. Vous avez dit que vous revenez d'un utilisateur valide si vous debug($user), donc si c'est vrai que vous pouvez faire quelque chose comme ceci:

if (!empty($user)) { 
    $user['User']['activation_key'] = null; 
    $user['User']['active'] = 1; 
    if ($this->User->save($user)) { 
    ... 

Cette méthode fonctionne de la même manière que la réception des données de formulaire à partir $this->request->data, et est décrit sur la Saving Your Data partie du livre.

Je suis curieux de savoir s'il y a une autre partie de votre configuration qui vous gêne. Est-ce que d'autres parties de votre application peuvent écrire correctement dans la base de données? Vous devez également vérifier que vous ne rencontrez pas d'erreurs de validation, comme leur exemple:

<?php 
if ($this->Recipe->save($this->request->data)) { 
    // handle the success. 
} 
debug($this->Recipe->validationErrors); 
+0

Merci pour l'information, comme vous l'avez dit '$ this-> User-> id' était vide, j'ai essayé de le réparer comme vous l'avez écrit mais le problème reste le même, aussi avec' $ this-> User-> save ($ this-> User-> data) 'sans succès. Que peut-il être à la place du '$ this-> User' était vide? – vitto

+0

Ajouté quelques idées ci-dessus, vitto – brism

+0

Merci encore. La deuxième partie de votre réponse a résolu mon problème, j'avais besoin d'ajouter des données à '$ user', puis de l'enregistrer. J'ai aussi besoin de changer '$ this-> User-> find ('first', array ('activation_key' => $ code))' '... trouver ('first', array ('conditions' => tableau ('Utilisateur.activation_key '=> $ code))); ' – vitto