Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Ca n'arrive qu'à moi ça

Posted by turowbye on 06/22/2007 13:52

Je ne comprend plus rien. Est-ce la faute à mon ordi? Ma faute? ...

Tout le code concernant une mise à jour avec jForms et jDao ne fait plus la mise à jour. Pour insérer un record c'est OK, mais pas l'update.

  • J'ai fait des tests avec la version courante de Jelix et de nombreux SVN. Rien n'y fait.
  • J'ai utiliser plusieurs version de mon code. Rien n'y fait.

Si j'utilse le jDb, il n'y a aucun problème.

J'ai vidé la cache, effacé mes cookies, redémmarrez l'ordi ...

Je ne sais plus quoi penser et quoi faire.


Windows 2000 - Apache 2.2.4 - PHP 5.2.2

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #1 Posted by bballizlife on 06/23/2007 11:23

Est-ce que tu as pensé à utiliser de la poudre verte ? ;)

Sinon là comme ça, cela ne va pas être facile de t'aider. On aurait besoin de plus d'informations.

Tu as essayé de débugguer et voir à quel endroit il y a un problème ?


N'importe comment c'est dans la doc

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #2 Posted by doms on 06/24/2007 02:50

Tiens, j'ai le même problème !

J'ai utilisé le tutoriel Tutoriel : Comment créer un CRUD de turowbye et le update ne marche pas !

J'ai passé plusieurs heures à étudier le code car je débute en Jelix mais cela n'a servi a rien ! Et puis je suis passé à autre chose en me disant que peut être des petits gremlins forts sympathiques allaient me corriger cela durant la nuit !

Voici le code du DAO :

 		<?xml version="1.0" encoding="UTF-8"?>
		<dao xmlns="http://jelix.org/ns/dao/1.0">
		  <datasources>
		    <primarytable name="actualite" realname="actualite" primarykey="actu_id" />
		  </datasources>
		  <record>
		    <property name="actu_id"              fieldname="actu_id" datatype="autoincrement"/>
		    <property name="actu_date_depot"      fieldname="actu_date_depot" datatype="date"/>
		    <property name="actu_titre"           fieldname="actu_titre" datatype="string"/>
		    <property name="actu_texte"           fieldname="actu_texte" datatype="string"/>
		    <property name="actu_url"             fieldname="actu_url" datatype="string"/>
		    <property name="actu_date_expiration" fieldname="actu_date_expiration" datatype="date"/>
		    <property name="actu_id_langue"       fieldname="actu_id_langue" datatype="int"/>
		  </record>
		</dao>

Et voici la fonction d'update :

    function update(){
      
      
        $id = $this->param('actu_id');
      
        // Prépare la réponse
        $rep = $this->getResponse('html'); 
         
        // Si le jForms n'existe pas on le crée
        $form = jForms::get('proto~actualites', $id);
        if ($form == null){
            $form = jForms::create('proto~actualites', $id);  
        }
            
        // On récupère les données de la db
        try {
            $rep->title = 'Mise à jour d\'une actualité';
            $form->initFromDao('proto~actualites');
        }catch(Exception $e){
            //quand initFromDao ne trouve pas l'enregistrement, il y a une exception
            $rep->title = 'Clé primaire inexistante';
            $rep->body->assign('contenu', "L'enregistrement que vous recherchez (".$id.") n'existe pas.");
            
            return $rep;
        }
 
        // Intégration de tinyMce
        $this->IntegrationTinyMce ( $rep );
         
        // Un nouveau template qui contiendra les données
        $tpl = new jTpl();
        $tpl->assign('form', $form->getContainer());
         
        // Insertion du template dans le template de l'action
        $rep->body->assign('contenu', $tpl->fetch('edit'));
        
        return $rep;
  }  

La fonction de sauvegarde maintenant :

    function save(){
     
        $id = $this->param('actu_id');
     
        // Prépare la réponse
        $rep = $this->getResponse('html'); 
        
        // On récupère les données de la session courante
        $form = jForms::fill('proto~actualites', $id);
         
        if(!$form){
            // pas de formulaire !
            $rep->title = 'Erreur de session';
            $rep->body->assign('contenu', "Les données session recherchées avec id (".$id.") n'existent pas.");
            return $rep;
        }
         
        //normalement, on devrait utiliser $form->check() pour vérifier le contenu du formulaire
        //mais cette méthode n'est pas complètement implanté. Donc on vérifie à la main
        //if($form->getData('actu_titre') != '' && $form->getData('actu_texte') != ''){
            // Temporaire : à fixer
            $date_courante = '2007-06-20';
            $form->setData('actu_date_depot',$date_courante);
            $form->saveToDao('proto~actualites');
        //}
        /*
        else
        {
            // la vérification a échouée, 
            // Retourne les données vers le client pour correction
            $rep = $this->getResponse("redirect");
            $rep->params['id'] = $id;
         
            if($id){
                $rep->action = "default_update";
            }
            else
            {
                $rep->action = "default_create";
            }
            return $rep;
        }
        */
        
        // La sauvegarde des données à réussi, 
        // on va maintenant effacer le formulaire en session
        jForms::destroy('proto~actualites', $id );
         
        // on retourne à la liste
        $rep = $this->getResponse("redirect");
        $rep->action = 'proto~default_browse';
        
        return $rep;
    }

Et enfin,le formulaire :

 <form action="{jurl 'proto~default_save'}" method="POST">
 <fieldset>
   <legend>Création d'une Actualité</legend>
   
   <table>
         <tr>
            <td><label for="actu_titre">Titre : </label></td>
            <td><input type="text" name="actu_titre" id="actu_titre" value="{$form->datas['actu_titre']|escxml}" /></td>
        </tr>
 
        <tr>
            <td><label for="actu_texte">Texte : </label></td>
            <td><textarea name="actu_texte" id="actu_texte" cols="50" rows="15">{$form->datas['actu_texte']}</textarea></td>
        </tr>
 
 
        <tr>
            <td><label for="actu_url">URL : </label></td>
            <td><input type="text" name="actu_url" id="actu_url" value="{$form->datas['actu_url']}" /></td>
        </tr>
 
        <tr>
            <td><label for="actu_date_expiration">Date d'expiration : </label></td>
            <td><input type="text" name="actu_date_expiration" id="actu_date_expiration" value="{$form->datas['actu_date_expiration']|escxml}" /></td>
        </tr>
 
  
     
   </table>
 
       
 </fieldset>
 <input type="hidden" name="actu_id" value="{$form->formId}" />
 <p><input type = "submit" value="ok" /></p>
 </form>

Pour info il s'agit d'une maquette qui me permet d'évaluer Jelix. Aussi ne soyez pas trop regardant sur la manière d'utiliser Jelix !

Au passage, vous noterez l'intégration de l'éditeur tinyMce. J'ai écris une note sur le forum et bientôt une page pour le manuel.

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #3 Posted by bballizlife on 06/25/2007 10:23

@doms : est-ce que tu peux me montrer le contenu de ton fichier actualites.form.xml stp ?

Sache qu'il faut que ton fichier forms et ta dao correspondante doivent contenir les mêmes éléments pour que jForms puisse réaliser le mapping des éléments du formulaires sur les champs de la dao.


N'importe comment c'est dans la doc

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #4 Posted by doms on 06/25/2007 13:31

Le voici !

 <?xml version="1.0" encoding="utf-8"?>
 <forms xmlns="http://jelix.org/ns/forms/1.0">
    <input ref="actu_titre" >
        <label>Titre</label>
    </input>	
    <input ref="actu_texte" >
        <label>Texte</label>
    </input>
    <input ref="actu_url" >
        <label>URL</label>
    </input>
    <input ref="actu_date_expiration" >
        <label>Date d'expiration</label>
    </input>   
    <input ref="actu_id_langue" >
        <label>Langue</label>
    </input>    
 </forms>

Merci !

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #5 Posted by bballizlife on 06/25/2007 14:28

Ton fichier jforms me semble bon pourtant. Là je ne sais pas trop pourquoi cela ne fonctionne pas...

Ceci dit je rappel une nouvelle fois que jForms est expérimental et n'est pas finalisé. Laurent y travail dessus dans une branche à part et ce n'est pas terminé. Il se peut donc que saveToDao() qui se trouve dans le trunk soit bugguée.

Ceci dit d'autres personnes sont arrivés à l'utiliser donc tu devrais pouvoir y arriver aussi. Reste à trouver quelle est l'erreur mais là je ne vois pas de raison simple de prime abord.


N'importe comment c'est dans la doc

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #6 Posted by laurentj on 06/25/2007 20:01

Commentaires

      // Si le jForms n'existe pas on le crée
       $form = jForms::get('proto~actualites', $id);
       if ($form == null){
           $form = jForms::create('proto~actualites', $id);  
       }
           
       // On récupère les données de la db
       try {
           $rep->title = 'Mise à jour d\'une actualité';
           $form->initFromDao('proto~actualites');
       }catch(Exception $e){
           //quand initFromDao ne trouve pas l'enregistrement, il y a une exception
           $rep->title = 'Clé primaire inexistante';
           $rep->body->assign('contenu', "L'enregistrement que vous recherchez (".$id.") n'existe pas.");
           
           return $rep;
       }

C'est un peu incohérent ce code : que le formulaire existe ou pas, tu recharge les données. Du coup, quand on reaffiche la page (sans avoir sauvé), on perd tout ce qu'on a saisie. Cela devrait être plutôt :

     // Si le jForms n'existe pas on le crée
       $form = jForms::get('proto~actualites', $id);
       if ($form == null){
           $form = jForms::create('proto~actualites', $id);  
        
           // On récupère les données de la db
          try {
             $rep->title = 'Mise à jour d\'une actualité';
              $form->initFromDao('proto~actualites');
          }catch(Exception $e){
             //quand initFromDao ne trouve pas l'enregistrement, il y a une exception
             $rep->title = 'Clé primaire inexistante';
             $rep->body->assign('contenu', "L'enregistrement que vous recherchez (".$id.") n'existe pas.");
             
             return $rep;
          }
      }

On ne fait donc un initFromDao que dans le cas où le formulaire n'existe pas.

À part ça, je ne vois pas pourquoi tu aurais ce problème, si ce n'est la valeur de ton actu_id : si il est à ou ne vaut rien, il y a un insert au lieu d'un update.

Tu as verifié si ça faisait des insert au lieu d'update ? Est ce que ton input hidden actu_id contient bien le bon id dans ton formulaire html ?

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #7 Posted by doms on 06/28/2007 10:51

Merci pour ces réponses.

J'ai effectué la correction donnée par Laurent et pourtant cela ne fonctionne toujours pas.

J'ai le comportement erroné suivant.

Je crée un nouvel enregistrement : appelons le 33. Je modifie un enregistrement précédent : appelons-le 12.

Résultat. L'enregistrement 33 est remplacé par le 12 modifié ! Ensuite, plus possible de faire une modification sur quelque enregistrement que ce soit !

J'ai vérifié que dans le input hidden actu_id contient bien le bon id dans le formulaire html...

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #8 Posted by turowbye on 06/30/2007 15:46

Bonjour à tous.

J'ai fait un très grand nettoyage de mon ordi... Usage de la poudre verte...

Bon assez les folies.

Effectivement il y a un problème avec le tutorial traitant du jForms et jDao.

  • On peut créer un nouvel enregistrement X
  • On peut immédiatement modifier enregistrement X
  • On ne peut pas modifier pour une deuxième fois l'enregistrement X

J'ai pus faire une trace jusque dans le saveToDao(). Cette fonction est bien exécutée et fait un

 $dao->update($daorec);

pour la modification de l'enregistrement X.

Mais mon expérience avec le code objet et Jelix étant limité, je ne peut aller plus loin.. Je me perd dans le code.


Windows 2000 - Apache 2.2.4 - PHP 5.2.2

  [Opened] Re: Ca n'arrive qu'à moi ça

Reply #9 Posted by laurentj on 06/30/2007 18:44

pour la notice, il suffit juste de remplacer, à la ligne indiquée, 'isPk' par 'isPK' (je corrigerais dans le trunk).

Je vais m'occuper des tests sur jforms.

 
Page
  1. Ca n'arrive qu'à moi ça