Bonjour à tous!
J'ai un soucis qui consiste au fait que le profile professionel de mon utilisateur s'enregistre plusieurs fois au lieu de s'éditer et de se modifier:
Mes Models:

<?php
// User model named by User.php
App::uses('AppModel', 'Model');
class User extends AppModel{
    public $name = 'User';
    public $hasOne = array(
        'Professional' => array(
            'className' => 'Professional',
            'foreignKey' => 'user_id',
                        'dependent' => true
        )
    );
    public $validate = array(
        'username' => array(
            'alpha' => array(
                'rule' => '/^[a-zA-Zéèàêù._-\s\']{1,}$/i',
                'message' => 'Votre nom d\'utilisateur n\'est pas valide'
            ),
            'uniq' => array(
                'rule' => 'isUnique',
                'message' => "Ce pseudo est déjà utilisé"
            )
        )
    );
}
<?php
// Professional model named by Professional.php
class Professional extends AppModel {
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        )
    );
}

Mon controller UsersController

public function account_essai2(){
    if($this->request->is('post') && !empty($this->request->data)){
        $this->request->data'User']'id'] = $this->Auth->user('id');
        if($this->User->validates()){
        $user = $this->User->save($this->request->data, array('User.firstname', 'User.lastname', 'User.telephone', 'User.civilities', 'User.mail', 'User.adresse_1', 'User.adresse_2', 'User.zip_code', 'User.city', 'User.region', 'User.department', 'User.lat', 'User.lng' ));

        if (!empty($user)) {
            $this->request->data'Professional']'user_id'] = $this->User->id;
            $this->request->data'Professional']'id'] = $id;
            if(isset($profile)){
            $this->request->data'Professional']'id'] = $professional'Professional']'id'];
            }
            $this->request->data'Professional']'user_id'] = $this->Auth->user('id');
            if($this->Professional->save($this->request->data)){
                return $this->redirect(array('controller' => 'Users', 'action' => 'account_essai2'));
            }
        }else if($id){
            $this->request->data = $professional;
        }   
        $user = $this->User->read();
        $this->Auth->login($user'User']);
        $this->Session->setFlash("Vos informations ont bien été modifiées","flash", array('class' => 'success'));
    }
    }else{
      $this->User->id = $this->Auth->user('id');
      $this->request->data = $this->User->read();
    }
}

Et ma vue account_essai2:

Les inputs user puis:
<?= $this->Form->input('Professional.id', array('type' => 'hidden')); ?>
<?= $this->Form->input('Professional.name'); ?>
<?= $this->Form->input('Professional.manager'); ?>
<?= $this->Form->input('Professional.registration'); ?>

Tout ça s'enregistre sur une nouvelle ligne dans ma base de données au lieu de se modifier et cela n'est pas renvoyé sur mon account_essai2.ctp. Où est l'erreur.

Merci d'avance de me donner un coup de main.

4 réponses


Il doit y avoir une merde dans la récupération de l'id. Tu utilises $this->request->data'Professional']'id'] = $id; et if($id) mais je ne vois pas où tu l'as initialisé
Il te manque peut-être ceci :

function mafonction($id=null){

Si tu utilises $this->User->id = $this->Auth->user('id'); , l'admin ne pourra pas editer un compte user ? :/

Beaucoup d'incohérence. Je te conseillerais de revisionner un tuto où tu as les fonction edit de user.

Bonne continuation.

mimosa21
Auteur

Bonjour coloo et tout le monde!
Le code n'est pas clair ça c'est sûre. Trouver un tuto propre sur edit de user, on trouve.
Trouver quelque chose qui permette de créer le profile de l'user (s'il n'existe pas) ou de modifier (s'il existe)et pas d'en recréer un à chaque fois que tu modifie (sur un seul et même formulaire), c'est comme chercher une aiguille non pas dans une botte de foin mais dans un hangar de bottes de foin!

Encore passé la matinée à chercher et toujours des lignes supplémentaires dans ma table Professional au lieu de modifier le profile existant.

function account_essai2 de départ (code plus propre mais même résultat):

public function account_essai2(){
   if($this->request->is('post') && !empty($this->request->data)){
     $this->request->data'User']'id'] = $this->Auth->user('id');
     if($this->User->validates()){
    $user = $this->User->save($this->request->data, array('User.firstname', 'User.lastname', 'User.telephone', 'User.civilities', 
            'User.mail', 'User.adresse_1', 'User.adresse_2', 'User.zip_code', 'User.city', 'User.region', 'User.department', 'User.lat',
            'User.lng'
        ));

    if (!empty($user)) {
            if($this->request->data'Professional']'user_id'] = $this->User->id){
        $this->User->Professional->save($this->request->data);
        }
    }
    $user = $this->User->read();
    $this->Auth->login($user'User']);
    $this->Session->setFlash("Vos informations ont bien été modifiées","flash", array('class' => 'success'));
      }
    }else{
       $this->User->id = $this->Auth->user('id');
       $this->request->data = $this->User->read();
    }
}

Le tuto blog a une partie qui traite de ça. La section premium qui traite du réseau social des animaux doit aussi avoir une partie sur l'edit add d'un profil.
La section ou tu peut ajouter un article et l'editer peut aussi te convenir vu que c'est un probleme qui te créé une ligne quand tu edite un pro.

formation cakephp
développement d'un site chapitre 1

Bonne continuation.

Bonsoir.
Il y a plusieurs choses que je ne comprends pas dans ta fonction.
La première, c'est que tu définis l'ID du request data avant la vérification de la validation des données du formulaire.
La seconde, c'est pourquoi tu mets une variable sur un sauvegarde en base de données, normalement on en met une à la réception de données afin d'en stocker les valeurs, ce qui n'est pas le cas sur une sauvegarde.
La troisième, c'est pourquoi tu fais une vérification sur l'égalité entre l' user_id retournée par le formulaire et l'ID d'authentification de l'utilisateur, normalement elles devraient correspondre, ou alors tu définis simplement comme tu l'a fait plus haut.
Mais ce que je comprend le moins, c'est pourquoi tu fais une connexion de l'utilisateur dans cette fonction, en général l'édition des informations de profil/utilisateurs ne se font qu'une fois connecté.