Bonjour !

Comment faire pour debugger la fonction save() ?
Je suis très nouveau sur cakephp et j'ai du mal à comprendre quelque chose : quand, en test, en local, je rajoute un champs dans un formulaire, ce champs est bien mis à jour.
Mais quand je fais la même chose en prod, le champs n'est pas du tout mis à jour.

Juste avant le save de ma table, je force le champs à une valeur, mais dans la base en résultat, j'ai toujours rien ?

Avez-vous une idée ?
je suis épuisé de chercher...
Merci de votre aide.
;))

13 réponses


glochen G Uyirr
Auteur
Réponse acceptée

je voulais le faire mais je n'ai pas trouvé comment...

Bonsoir.
Si tu nous montrait le code concerné, ça pourrait nous aider.
Tu ne crois pas ?

EDIT : Il est inutile de créer deux fois le même sujet, fusionnes les en un seul s'il te plaît.

absolument d'accord.
Merci.

J'ai rajouté un champs ListBox dans un formulaire.

voici le code de la vue : Configure::load('variables/experiences');
$options=Configure::read('experiences.recrut');
echo $this->Form->input('Offre.experience', array('type'=>'select','options'=>$options, 'label'=>'Expérience : ', 'div'=>'divform select')); voici le fichier des variables stockées en /config/variables :

$config['experiences']['all']=array(
"1"=>"Aucune",
"2"=>"1 mois",
"3"=>"2 mois",
"4"=>" + de 6 mois",
"5"=>" + de 2 ans");

$config['experiences']=array(
"1"=>"Aucune",
"2"=>"1 mois",
"3"=>"2 mois",
"4"=>" + de 6 mois",
"5"=>" + de 2 ans");

$config['experiences']['recrut']=array(
"1"=>"Aucune",
"2"=>"1 mois",
"3"=>"2 mois",
"4"=>" + de 6 mois",
"5"=>" + de 2 ans"
);

PROBLEME :

avant mon save() de l'objet Offre, la valeur de [Offre][experience] a bien changé si je change la valeur dans le listbox.

MAIS SA VALEUR N'EST PAS MISE A JOUR EN BASE....

Ce PROBLEME N'ARRIVE PAS EN LOCAL MAIS EN PROD (serveur distant).

PROBLEME DE CACHE ?

Merci d'avance pour votre aide.....

Ce serait bien si tu utilisais la balise code, ce serais plus lisible pour nous et plus compréhensible, avec un minimum d'indentation au passage, par exemple :

voici le code de la vue :

Configure::load('variables/experiences');
$options = Configure::read('experiences.recrut');

echo $this->Form->input('Offre.experience', array('type' => 'select', 'options' => $options, 'label' => 'Expérience : ', 'div' => 'divform select'));

voici le fichier des variables stockées en /config/variables :

$config['experiences']['all'] = array(
    "1" => "Aucune",
    "2" => "1 mois",
    "3" => "2 mois",
    "4" => " + de 6 mois",
    "5" => " + de 2 ans"
);

$config['experiences'] = array(
    "1" => "Aucune",
    "2" => "1 mois",
    "3" => "2 mois",
    "4" => " + de 6 mois",
    "5" => " + de 2 ans"
);

$config['experiences']['recrut'] = array(
    "1" => "Aucune",
    "2" => "1 mois",
    "3" => "2 mois",
    "4" => " + de 6 mois",
    "5" => " + de 2 ans"
);

Nous gagnons en visibilité tu ne trouves pas ?
Et ça prend quelques secondes.

absolument d'accord...
j'ai posté trop vite.

Dis moi, à part pour cette requête, est-ce que tu arrives bien à faire d'autres enregistrements/sauvegardes en base de données ?
Sinon, si tu veux être sur si la requête s'effectue bien ou pas, tu peux faire une vérification avec une condition sur la requête en retournant un message Flash dans le cas où le save échoue.
À mon avis, en ayant mis ton application en ligne, ton debug est peut-être désactivé et donc aucun retour d'erreur.
Mais ça peut aussi être autre chose, il nous faudrait plus de précisions pour t'être d'une plus grande aide.
Car c'est bien d'avoir donné le code de ta vue, mais le code de ta fonction pourrait nous être utile quand même.

merci pour ton aide
oui, en prod, le debug est désactivé
mon probleme général est : je rajoute une colonne à une table (table offre) : colonne "experience"
j'implémente ma fonction : cette donnée n'est jamais mise à jour.
je force meme la donnée à '33' par exemple, et rien ne se passe...
Je fais la meme chose en test : pas de probleme.
Quoiqu'il arrive, la colonne n'est jamais mise à jour mais les autres elles sont bien mises à jour, sans probleme

voici le code de la fonction

function recruteur_edit($uuid=null) {

        $this->Compte->check(array(1,2,3,6,7,12), 'recruteur');

        $bride=false;

        //si pas de variable de session depot.offre on redirige vers etape 1 du process
        if(!$this->Session->check('depot.offre') && !$uuid) {
            $this->redirect(array('controller'=>'offres','action' => 'deposer', 'recruteur'=>true));
        }

        $this->helpers[] = 'Ck';

        //ajout de css spécifique à la page 
        $this->set('les_css', $this->les_css);

        //ajout de javascript spécifique à la page

        array_push($this->les_js,'textareaCounter');
        array_push($this->les_js,'ckeditor/ckeditor');
        array_push($this->les_js,'ckfinder/ckfinder');
        array_push($this->les_js,'offres/recruteur_add');
        if(isset($this->Compte->infos_user['group_id']) && ($this->Compte->infos_user['group_id']==1 || $this->Compte->infos_user['group_id']==2 || $this->Compte->infos_user['group_id']==12)) array_push($this->les_js,'offres/edit_add');
        $this->set('les_js', $this->les_js);

        // les metas
        $this->set('meta_description',"");
        $this->set('meta_keywords',"");

        //key pour le cache
        $this->set('keycache',$this->params['controller'].'_'.$this->params['action'].'_'.implode('_',$this->params['pass']));

        //fil d'ariane
        $prepare_breadcrumb=array(
            array('title'=>'Accueil', 'controller'=>'', 'action'=>'', 'params'=>array(), 'attributes'=>array('title'=>"Accueil")),
            array('title'=>'Mon espace recruteur', 'controller'=>'societes', 'action'=>'mon_espace', 'prefix'=>array('recruteur'=>true), 'params'=>array(), 'attributes'=>array('title'=>"Mon espace recruteur")),  
        );

        if($uuid) {
            $this->set('pageTitle','Modifier une offre');
            $prepare_breadcrumb[]=array('title'=>'Modifier une offre', 'controller'=>'offres', 'action'=>'edit', 'prefix'=>array('recruteur'=>true), 'params'=>array($uuid), 'attributes'=>array('title'=>"Modifier une offre"));
            $modif=true;
            //on récupère l'offre à modifier
            $this->Offre->recursive=-1;
            $ancien=$this->Offre->findByUuid($uuid);
            // si c'est un pack limité on bride
            if($ancien['Offre']['valide']==1 && $this->Compte->infos_societe['nb_max_offres']!=0) {
                $bride='pack_limite';
            }
            // si c'est un stage et qu'on a pas de pack actif on bride 
            if(($ancien['Offre']['valide']==1 && $ancien['Offre']['type']==4 || $ancien['Offre']['type']==5) && ($this->Compte->infos_societe['nb_max_offres']!=0 || $this->Compte->infos_societe['nb_max_offres']==false) ) {
                $bride='stage';
            }

        } else {
            $this->set('pageTitle','Déposer une offre sur '.SITE_NAME);
            $prepare_breadcrumb[]=array('title'=>'Déposer une offre', 'controller'=>'offres', 'action'=>'edit', 'prefix'=>array('recruteur'=>true), 'params'=>array(), 'attributes'=>array('title'=>"Déposer une offre"));
            $modif=false;
        }

        $breadcrumb=$this->Url->breadcrumb($prepare_breadcrumb);
        $this->set('breadcrumb',$breadcrumb);

        // connaitre la position que les offres doivent avoir
        $this->loadModel('Societe');
        $this->Societe->recursive=-1;
        $ret_societe=$this->Societe->find('first', array('fields'=>'client_appli','offres_position, offres_no_shuffle','conditions'=>array('Societe.id'=>$this->Compte->infos_societe['id']) ));
        if(!empty($ret_societe)) { 
            $position_societe=$ret_societe['Societe']['offres_position'];
            $no_shuffle_societe=$ret_societe['Societe']['offres_no_shuffle'];   
        } else {
            $position_societe='0';
            $no_shuffle_societe='0';
        }

        //est-ce que le client a un compte appli mobile
        $is_appli_mobile=Timer::isPost($ret_societe['Societe']['client_appli']);
        $this->set(compact('is_appli_mobile'));

        $this->set(compact('modif'));

        $is_admin=false;
        if(isset($this->Compte->infos_user['group_id']) && ($this->Compte->infos_user['group_id']==1 || $this->Compte->infos_user['group_id']==2 || $this->Compte->infos_user['group_id']==12)) {
            $is_admin=true;

            if($modif) {

                $this->loadModel('Metier');
                $quel_metier=$this->Metier->findById($ancien['Offre']['metier_id']);

                $kmetier['id']=$quel_metier['Metier']['id'];
                $kmetier['name']=$quel_metier['Metier']['name'];
                $is_couplage=false;
                if($ancien['Offre']['is_couplage_presse']==1) $is_couplage=true;

                $this->set(compact('kmetier', 'is_couplage'));

            }

        }

        $this->set(compact('is_admin'));

        $erreur=false;

        if (!empty($this->data)) {

            if(isset($this->data['Offre']['pays_id']) && $this->data['Offre']['pays_id']!=77) {
                if(empty($this->data['Offre']['ville2'])) {
                    $this->data['Offre']['ville']=$this->data['Offre']['ville2'];
                } else {
                    $this->data['Offre']['ville']='vide';
                }
            }

            if (!$this->Offre->saveAll($this->data['Offre'], array('validate' => 'only'))) {
                $erreur=true;
            }

            if(isset($this->data['Offre']['pays_id']) && $this->data['Offre']['pays_id']==77) {
                if(empty($this->data['Offre']['ville'])) {
                    $erreur=true;
                    $this->Offre->validationErrors['ville']='Vous devez saisir une ville.';
                }
            }

            if(!isset($this->data['Offre']['position']) && !$uuid) {
                $this->data['Offre']['position']=$position_societe;
                $this->data['Offre']['no_shuffle']=$no_shuffle_societe;
            }

            // cas des modifs bridés
            /*if(!isset($this->data['Offre']['name'])) {
                //die(pr($this->Offre->validationErrors));
            }*/

            if($erreur===false) {

                //on compte le nb d'offre non valide qu'à la société si >limite, on bloque
                $nb_invalide=$this->Offre->find('count', array('conditions'=>array('Offre.valide'=>'0','Offre.societe_id'=>$this->Compte->infos_societe['id'])));
                $limite_invalide=1000;
                $is_s=($nb_invalide>1)?'s':'';

                if($nb_invalide>$limite_invalide) {
                    $this->Flash->create('Vous avez déjà créé <b>'.$nb_invalide.'</b> offre'.$is_s.' non validée'.$is_s.'. Vous ne pouvez pas en créer d\'autres.','merreur',1);
                    $this->redirect($this->Session->read('Temp.referer'));
                }

                //on retrouve les infos sur le métier
                if(isset($this->data['Offre']['metier_id'])) unset($this->data['Offre']['metier_id']);
                //if(isset($this->data['Offre']['famille_metier_id'])) $this->data['Offre']['famille_metier_id']='';

                $metier_id='';
                $rome_groupe_id='';
                //$famille_id='';

                $metier=$this->MetierQuiz->findMetier($this->data['Offre']['name']);
                if(!empty($metier) && @$metier['score']>7.1) {
                    $metier_id=$this->data['Offre']['metier_id']=$metier['metier_id'];
                    $rome_groupe_id=$this->data['Offre']['rome_groupe_id']=$metier['rome_groupe_id'];
                    //$famille_id=$this->data['Offre']['famille_metier_id']=$metier['famille_metier_id'];
                    //die(pr($metier));
                } else {
                    $metier_id=0;
                    $rome_groupe_id=0;
                    //$famille_id=0;
                }

                //critere geo
                if(isset($this->data['Offre']['pays_id']) && $this->data['Offre']['pays_id']==77) { //france

                    $temp_ville=$this->data['Offre']['ville'];
                    $this->Offre->Commune->contain('Departement');
                    $infos_geo=$this->Offre->Commune->findById($temp_ville);

                    $pays_id='77';
                    $commune_id=$infos_geo['Commune']['id'];
                    $region_id=$infos_geo['Commune']['region_id'];
                    $cp=$infos_geo['Commune']['cp'];
                    $departement_id=$infos_geo['Commune']['departement_id'];
                    $ville=$infos_geo['Commune']['ncom'];

                    $ville_complet=$ville.' ('.$infos_geo['Departement']['cdpt'].' - '.$departement_id.')';

                } else if (isset($this->data['Offre']['pays_id']))  {
                    $ville_complet='';
                    $pays_id=$this->data['Offre']['pays_id'];
                    $commune_id='';
                    $region_id='';
                    $departement_id='';
                    $cp='';
                    $ville=$this->data['Offre']['ville2'];
                }

                // si c'est pas bridé
                if(!$bride) {
                    $this->data['Offre']['pays_id']=$pays_id;
                    $this->data['Offre']['commune_id']=$commune_id;
                    $this->data['Offre']['region_id']=$region_id;
                    $this->data['Offre']['departement_id']=$departement_id;
                    $this->data['Offre']['cp']=$cp;
                    $this->data['Offre']['ville']=$ville;
                    $this->data['Offre']['ville_complet']=$ville_complet;
                    $this->data['Offre']['metier_id']=$metier_id;
                    $this->data['Offre']['rome_groupe_id']=$rome_groupe_id;
                    // $this->data['Offre']['famille_metier_id']=$famille_id;
                }

                // si c'est une création
                if(!$modif) {
                    if ($this->Session->check('depot.offre.classeur')) $this->data['Offre']['soc_classeur_id']=$this->Session->read('depot.offre.classeur');
                    $this->data['Offre']['created']=date('Y-m-d H:i:s');
                    $this->data['Offre']['valide']='0';
                    $this->data['Offre']['visible']='1';
                }

                //dans tous les cas de figure
                $this->data['Offre']['user_id']=$this->Compte->infos_user['id'];
                $this->data['Offre']['societe_id']=$this->Compte->infos_societe['id'];
                $this->data['Offre']['modified']=date('Y-m-d H:i:s');

                //les autres departements
                if(isset($this->data['Offre']['pays_id']) && !empty($this->data['Offre']['autres_dep'])) {
                    $this->data['Offre']['autres_departements']=implode(',', $this->data['Offre']['autres_dep']);
                    unset($this->data['Offre']['autres_dep']);
                }

                //die(pr($this->data));
                if($modif) { // cas de l'enregistrement d'une modif

                        $this->Offre->id=$ancien['Offre']['id'];
                        $name=$ancien['Offre']['name'];
                        $this->Offre->set( $ancien['Offre'] );

                        if ($_SERVER['REMOTE_ADDR'] == '82.226.210.224') 

                                 {
                        $this->data['Offre']['experience']='33';
                        }

                        if ($this->Offre->save($this->data['Offre'])) {
                            $redirige='';
                            // savoir ou être redirigé
                            if($ancien['Offre']['valide']==0) {
                                $redirige='non_validee';
                            } else if(empty($ancien['Offre']['soc_classeur_id'])) {
                                $redirige='non_classee';
                            } else {
                                $redirige=$ancien['Offre']['soc_classeur_id'];
                            }

                            //>> debug denis 01092015
                            if ($_SERVER['REMOTE_ADDR'] == '82.226.210.224') 

                                 {
                                //Configure::write('debug', 2);
                                // $dbo = $this->getDatasource();
                                // $logs = $dbo->_queriesLog;

                                // echo end($logs);
                                 $this->Mail->technic("leondie75@gmail.com", "log sql", $this->data['Offre']['experience']); 
                                // $this->Offre->saveField('experience', '542');
                                //debug($this->Offre->showSql()); // in controller
                                }
                            //<< 

                            $this->Flash->create('L\'offre <b>'.$name.'</b> a bien été modifiée.','msucces',1);

                            $this->redirect(array('controller' => 'offres', 'action' => 'index', $redirige));

                        } else {

                            $this->Flash->create('Un problème a été détecté lors de la sauvegarde.','merreur',1);
                            $this->redirect(array('controller' => 'societes', 'action' => 'mon_espace'));

                        }

                } else { // cas de la création d'une nouvelle offre

                        //die(pr($this->data));
                                //MODIF SYNTEN 2015-02-16
                $this->data['Offre']['ordre_appli']=10000;
                                //FIN MODIF SYNTEN 2015-02-16
                        $this->Offre->create();
                        $this->data['Offre']['id']='';
                        $this->data['Offre']['uuid']=String::uuid();
                        $name=$this->data['Offre']['name'];
                        //die(pr($this->data));
                        if ($this->Offre->save($this->data)) {
                            $this->Flash->create('L\'offre <b>'.$name.'</b> a bien été ajoutée.','msucces',1);
                            $this->redirect(array('controller' => 'offres', 'action' => 'mettre_en_ligne', $this->data['Offre']['uuid'] ));
                        } else {
                            $this->Flash->create('Un problème a été détecté lors de la sauvegarde.','merreur',1);
                            $this->redirect(array('controller' => 'societes', 'action' => 'mon_espace'));
                        }

                }

            }
        }

        // les données n'ont pas été envoyé
        if(empty($this->data)) {
            //on regarde si on créé une offre ou si on se sert d'un modele
            if($this->Session->read('depot.offre.modele')!='' && !$uuid) {
                //on récupère les infos sur le modele 
                $this->Offre->recursive=-1;
                $this->data=$offre=$this->Offre->findById($this->Session->read('depot.offre.modele'));

                if(!empty($offre['Offre']['reference'])) {
                    $this->data['Offre']['reference']=$this->data['Offre']['reference'].' (Copie)';
                }

                //il faut d'abord retrouver le code postal de la ville          
                $id_temp=$this->data['Offre']['commune_id'];
                $o_temp=$this->Offre->Commune->findById($id_temp);
                $cp_temp=$o_temp['Commune']['cp'];
                if(!empty($cp_temp)) $this->data['Offre']['cp']=$cp_temp;
                if(!empty($id_temp)) $this->set('default_ville', $id_temp);
                $les_villes=$this->Offre->Commune->find('all',array('conditions'=>array('Commune.cp'=>$cp_temp)));
                $this->set(compact('les_villes'));

            }

            // cas de figure ou c'est une modif
            if($uuid) {
                //on récupère les infos sur le modele 
                $this->Offre->recursive=-1;
                $this->data=$offre=$this->Offre->findByUuid($uuid);

                //il faut d'abord retrouver le code postal de la ville          
                $id_temp=$this->data['Offre']['commune_id'];
                $o_temp=$this->Offre->Commune->findById($id_temp);
                $cp_temp=$o_temp['Commune']['cp'];
                if(!empty($cp_temp)) $this->data['Offre']['cp']=$cp_temp;
                if(!empty($id_temp)) $this->set('default_ville', $id_temp);
                $les_villes=$this->Offre->Commune->find('all',array('conditions'=>array('Commune.cp'=>$cp_temp)));
                $this->set(compact('les_villes'));

                //est-ce qu'il y a d'autres_departements
                if(!empty($offre['Offre']['autres_departements'])) {
                    $deps=explode(',',$offre['Offre']['autres_departements']);
                    $this->data['Offre']['autres_dep']=array();
                    foreach($deps as $dep) {
                        $this->data['Offre']['autres_dep'][]=$dep;
                    }
                } 

            }

        } 

        if($erreur) {
            $this->Flash->create('Merci de remplir correctement tous les champs obligatoires.','merreur',1);
            if($modif) {
                $this->Offre->recursive=-1;
                $this->data=$offre=$this->Offre->findByUuid($uuid);

            }
        }

        //$famille_metiers=$this->Offre->FamilleMetier->find('list');

        $this->Offre->Departement->recursive=-1;                    
        $dep= $this->Offre->Departement->find('list', array('fields'=>array('id', 'name') ));

        $url=$this->here;

        Configure::load('variables/famille_metiers');
        $famille=Configure::read('exhaustif');

        //$this->set(compact('position_societe','no_shuffle_societe','famille_metiers', 'dep','url', 'bride'));
        $this->set(compact('position_societe','no_shuffle_societe','dep','url', 'bride', 'famille'));

}

C'est pas $this->request->dataau lieux de $this->data au fait? Ca fait longtemps que je n'ai plus fait de Cake2.
Par contre toi aussi t'as mille mettre de codes, je vois.. lol

oui, je croule sous les lignes de code...
et je crois que je vais me démerder tout seul car cakephp n'est pas beaucoup utilisé donc difficile à comprendre.
mon problème existe en prod mais pas en test.
Je rajoute un champs dans une table, je l'implémente dans mon fichier ctp
En prod, le champs n'est pas mis à jour, en test : pas de problème...

Hello,

As-tu vidé le cache de tes entités? Le champs n'est peut être tout simplement pas mappé avec ta table.
Pour ajouter le champs à ta base de donnée as-tu utilisé le systeme de mise a jour que fourni le framework?

AH merci Arnaud,
je pense vraiment que c'est ce genre de piste à suivre car le systeme de cache ne marche pas en local (probleme de permission je crois)
non, je n'ai pas utilisé le systeme de mise à jour fourni par le framework
donc je vais chercher dans ce sens

"champs"
pas mappé avec la table...
je ne comprends pas?
tu peux préciser stp ?
Merci !

VIENS LA QUE JE T'EMBRASSE ARNAUD !!!!

tu veux quoi pour Noël ?
(mais bon, j'suis au smic alors faudra pas trop demander)
============****
J'ai vidé le cache de la table en question dans le répertoire /app/tmp/cache/models
et c bon....

Bonne journée.

Hello,
Content de savoir que tu as résolu ton problème.
Pense à marquer le sujet en résolu ^^

a+