Bonjour à tous, j'ai un gros problème sur lequel je bute depuis une journée j'essaye simplement de faire une sauvegarde basique de mes champs.

Je récupére les données

public function edit($id= null){
    $this->User->save($this->request->data);

Et je reçois cette fatal error

Fatal error: Call to a member function getColumnType() on a non-object in /Applications/MAMP/htdocs/cake/lib/Cake/Model/Model.php on line 1357

Je ne comprends pas de quoi cela peut venir...
Je suis allé faire un debug dans le fichier model et en fait l'endroit qui fait planter recherche en fait une colonne qui s'appelle 'users', alors qu'avant il recherche bien le bon nom des colonnes...

Merci d'avance...

9 réponses


Salut,

Peux tu afficher ce qu'il y a dans $this->request->data , le debug, ton model, ainsi que la structure de ta table users STP?

MathiasG
Auteur

Bonjour, merci de ton aide alors le debug du data :

array(
    'User' => array(
        'mail' => 'test@gmail.com',
        'nom' => 'Test',
        'prenom' => 'Test',
        'adresse' => '84 rue Test',
        'cp' => '75000',
        'ville' => 'Paris',
        'fixe' => '0323565656',
        'portable' => '0680808080'
    )
)

Model User :

<?php
class User extends AppModel {
    public $validate = array(
        'mail' => array(
            'email' => array(
                'rule' => 'email',
                'on' => 'update',
                'message' => 'Cet e-mail ne semble pas valide'
            )
        ),
        'username' => array(
            'unique' => array(
                'rule' => 'isUnique',
                'on' => 'create',
                'message' => 'Cet identifiant est déjà utilisé'
            ),
            'taille' => array(
                'rule' => array('between', 5, 15),
                'required' => true,
                'allowEmpty' => false,
                'on' => 'create',
                'message' => 'Vous devez spécifier un nom d\'utilisateur compris entre 5 et 15 caractéres'
            )
        ),
        'password' => array(
            'rule' => array('between', 5, 15),
            'allowEmpty' => false,
            'message' => 'Vous devez spécifier un mot de passe compris entre 5 et 15 caractéres'
        ),
        'cp' => array(
            'nombre' => array(
                'rule' => 'numeric',
                'on' => 'update',
                'message' => 'Le code postal ne semble pas valide'
            ),
            'min' => array(
                'rule' => array('minLength', '5'),
                'on' => 'update',
                'message' => 'Le code postal ne semble pas valide'
            ),
            'max' => array(
                'rule' => array('maxLength', '5'),
                'on' => 'update',
                'message' => 'Le code postal ne semble pas valide'
            ),
        ), 
        'fixe' => array(
            'numero' => array(
                'rule' => array('custom', '#^0[1-59][0-9]{8}$#'),
                'on' => 'update',
                'message' => 'Le numéro de téléphone semble invalide'
            ),
            'nombre' => array(
                'rule' => array('between', 10, 14),
                'on' => 'update', 
                'message' => 'Le numero de téléphone semble invalide'
            ),
        ),
        'portable' => array(
            'numero' => array(
                'rule' => array('custom', '#^06[0-9]{8}$#'),
                'on' => 'update',
                'message' => 'Le numéro de téléphone semble invalide'
            ),
            'nombre' => array(
                'rule' => array('between', 10, 14), 
                'on' => 'update',
                'message' => 'Le numero de téléphone semble invalide'
            ),
        ),
        'nom' => array(
            'rule' => 'alphanumeric',
            'on' => 'update',
            'message' => 'Votre nom ne semble pas correct'
        ),
        'prenom' => array(
            'rule' => 'alphanumeric',
            'on' => 'update',
            'message' => 'Votre prénom ne semble pas correct'
        )
    );
    public $hasMany = array(
        'Groupe' => array(
            'className' => 'Groupe',
            'foreignKey' => 'user_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
        'Responsable' => array(
            'className' => 'Responsable',
            'foreignKey' => 'user_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
    public function beforeSave($options = array()) {
        if(!empty($this->data'User']'nom'])){$this->data'User']'nom'] = ucwords(strtolower($this->data'User']'nom']));}
        if(!empty($this->data'User']'prenom'])){$this->data'User']'prenom'] = ucwords(strtolower($this->data'User']'prenom']));}
        if(!empty($this->data'User']'ville'])){$this->data'User']'ville'] = ucwords(strtolower($this->data'User']'ville']));}
        if(!empty($this->data'User']'password'])){$this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);}
        return true;
    }   
    public function beforeValidate($options = array()) {
        if(!empty($this->data'User']'fixe'])){
            $this->data'User']'fixe'] = str_replace("/", "", str_replace(".", "", str_replace("-", "", $this->data'User']'fixe'])));
        }if(!empty($this->data'User']'portable'])){
            $this->data'User']'portable'] = str_replace("/", "", str_replace(".", "", str_replace("-", "", $this->data'User']'portable'])));
        }
        return true;
    }
}

Et enfin structure de table :

CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(250) NOT NULL,
  `password` varchar(250) NOT NULL,
  `role` varchar(250) DEFAULT NULL,
  `active` int(1) NOT NULL,
  `mail` varchar(250) DEFAULT NULL,
  `nom` varchar(250) DEFAULT NULL,
  `prenom` varchar(250) DEFAULT NULL,
  `adresse` varchar(250) DEFAULT NULL,
  `cp` int(5) unsigned zerofill DEFAULT NULL,
  `ville` varchar(250) DEFAULT NULL,
  `fixe` int(10) unsigned zerofill DEFAULT NULL,
  `portable` int(10) unsigned zerofill DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

Je viens de reproduire ton système sur ma machine mais en supprimant les liaisons sur le Groupe et Responsable. Je n'ai aucune erreur, tout marche très bien.
Est-ce que tu essayes aussi de sauvegarder les liaisons? Si oui, il serai intéressant de voir ton formulaire et ton controlleur. Aussi, quelle version de Cake tu utilises?

Bonjour j'ai la même erreur que lui sur un model sans laisons... j'utilise la derniere version de cake. Quelqu'un a t il une idée ?

J'ai rien trouvé d’intéressant sur google. j'ai mon id qui est bien int, primary et auto increment.

après plusieurs heures de recherche j'ai trouvé : https://groups.google.com/forum/#!topic/cake-php/dZyT8EpibFs
On y apprend que certains nom de Model posent un problemes comme le nom Data au moment de l'édition uniquement.
mais finalement ca ne marche toujours pas ...

As tu bien fixé l'id avant de lancer le save dans la fonction edit ?

$this->User->id = $id;
$this->User->save($this->request->data);

oui ca bien été fait.
Je pense que le bug vient de cake. je m'explique:
Lorsqu'on créé un controller et un model dans un plugin, pour des raisons qui me sont inconnues l'"EDITION" uniquement ne fonctionne pas. Le model de la librairie de cake repère qu'il s'agit un plugin et fait des problèmes. ceci m'est arrivé sur la dernière version stable de cakephp de 11/2013 je ne sais pas si ce bug est présent ailleurs.
Du coup j'ai trouvé une 'solution' alternative pour ne plus avoir ce bug.
Je créé un beforeSave() dans le model et je mentionne :
$this->plugin = null;
et plus de problème.
Un bug bien étrange qui je sais pas si il apparaît dans les autres versions de cake et qui m'aura fait perdre une journée.

merci pour vos soutiens.