IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Problème d'enregistrement de relation d'un formulaire imbriqué


Sujet :

Symfony PHP

  1. #1
    Membre actif Avatar de LesLemmings
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 302
    Points : 243
    Points
    243
    Par défaut Problème d'enregistrement de relation d'un formulaire imbriqué
    Bonjour,

    J'ai des soucis avec mes imbrications de formulaire lors de l'enregistrement.
    J'explique j'ai un formulaire principal 'personnel' qui imbrique le formulaire 'sfGuardUser' (utilisation du plugin de sfDoctrineGuardPlugin). Le formulaire imbriqué 'sfGuardUser’' possède les champs simples du : username, super_admin, etc. et les champs de relation : permission des utilisateurs.
    Lorsque j'enregistre mon formulaire il enregistre bien les données 'personnel' et les données simples de sfGuardUser (username,super_admin) mais pas les relations ...

    Une personne aurait-il une idée… ?
    Merci

    YML de latable Personnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Personnel:
      actAs:
        Timestampable:         ~
      columns:
        login:                 { type: string(6), primary: true   }
        id_sf_guard_user:      { type: integer(4) }
        user_derniere_modif:   { type: string(6)  }
        nom:                   { type: string(20), notnull: true  }
        prenom:                { type: string(20), notnull: true  }
      relations:
        SfGuardUser:                { class: sfGuardUser, local: id_sf_guard_user, foreign: id, foreignType: one, onUpdate: CASCADE, onDelete: CASCADE }

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Pout ton schéma, la norme (non obligatoire) est d'appeler le champ id de la relation pour sfGuard user_id.

    Dans la relation, le foreignType one devrait être soutenu par un type one, je suppose que la relation est 1-1.

    Le champ user_derniere_modif ne ferait-il pas doublon avec le updated_at généré par le "timestampable" ?

    Le schéma ne suffit pas pour comprendre le problème de liaison qui semblerait être plutôt dans le form ou le contrôleur, essaye de mettre le code du form et celui du action execute...
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  3. #3
    Membre actif Avatar de LesLemmings
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 302
    Points : 243
    Points
    243
    Par défaut
    Je te remerci (une nouvelle fois) de ta réponse.

    Pour ton schéma, la norme (non obligatoire) est d'appeler le champ id de la relation pour sfGuard user_id.
    Il est vrai que j'aurais pu suivre la norme mais actuellement je migre l'ensemble d'une application vers symfony et pour les champs de la base de données je me suis basée sur la forme des champs de le BDD à migrer.
    Dans la relation, le foreignType one devrait être soutenu par un type one, je suppose que la relation est 1-1.
    j'ai pas tout compris se que tu voulais dire mais oui je veux que la relation 'SfGuardUser' soit 1-1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le champ user_derniere_modif ne ferait-il pas doublon avec le updated_at généré par le "timestampable" ?
    Le champ 'user_derniere_modif' est un champ existant de mon ancienne BDD il n'est pas équivalant à 'updated_at'. 'user_derniere_modif' est le nom du dernier utilisateur qui a modifié les informations et non la date (comme l'est 'updated_at').

    Sinon voici ce que tu m'as demandé (du code) il est vrai que je n'avais pas mis grand chose.

    Schema ylm de sfGuardUser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    sfGuardUser:
      actAs: [Timestampable]
      columns:
        id:                       { type: integer(4), primary: true, autoincrement: true }
        username:           { type: string(128), notnull: true, unique: true }
        algorithm:            { type: string(128), default: sha1, notnull: true }
        salt: string(128)
        password: string(128)
        is_active:             { type: boolean, default: 1 }
        is_super_admin:   { type: boolean, default: false }
        last_login:            { type: timestamp }
        premiere_connexion: { type: boolean, default: 1 }
      indexes:
        is_active_idx:
          fields: [is_active]
      relations:
        groups:             { class: sfGuardGroup, local: user_id, foreign: group_id, refClass: sfGuardUserGroup, foreignAlias: Users }
        permissions:        { class: sfGuardPermission, local: user_id, foreign: permission_id, refClass: sfGuardUserPermission, foreignAlias: Users }
    La form 'personnel'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public function configure()
      {
          /* Imbrication de la form sfGuardUser dans la form personnel */
         parent::configure();
         $userForm = new sfGuardUserForm($this->object->SfGuardUser);
         unset($userForm['id'], $userForm['id_sf_guard_user']);
     
        $userForm->widgetUsernameLectureseul();
        $this->embedForm('connexion_intranet', $userForm);
     
         /* Champs qui ne sont pas affiché dans le formulaire */ 				
        unset(
          $this['id_sf_guard_user'],
          $this['annule'],
          $this['created_at'],
          $this['updated_at']
          );
     
        /* nom des labels des champs qui sont affichées dans le formulaire */
        $this->widgetSchema->setLabels(array(
    	'login'              =>    'Identifiant',
    	//[...]
          'connexion_internet' =>    'Connexion intranet'	    
        ));
    La form sfGuardUser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     public function configure()
     {
     
          if(!$this->isNew())
          {
              // Désativation de champs pour ne pas être modifiés
    	  $this->widgetSchema['username'] = new  sfWidgetFormInputText(array(),   array('readOnly'=> 'readOnly'));
          }
         $this->widgetSchema['id'] = new  sfWidgetFormInputHidden();
     
        /* Ordre d'affichage des champs dans le formulaire */
       $this->useFields(array(
          'username',
          'groups_list',
          'permissions_list',
          'is_super_admin',   
          'id' 
      ));
     
      /* nom des labels des champs qui seront afficher dans le formulaire */
      $this->widgetSchema->setLabels(array(
     	'username'           =>    'Identifiant',
        	'groups_list'        =>    'Groupes',
        	'permissions_list'   =>    'Droits individuel',
    	'is_super_admin'     =>    'Administrateur',
    	'id'                 =>    'id',
        ));
     
      }
    Action executeEdit de personnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      public function executeEdit(sfWebRequest $request)
      {
        $personnel = Doctrine::getTable('Personnel')->find(array($request->getParameter('login')));  
     
        $this->forward404Unless($personnel, sprintf('Object personnel does not exist (%s).', $request->getParameter('login')));
        $this->form = new PersonnelForm($personnel);
      }

    Action executeUpdate de personnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function executeUpdate(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
        $this->forward404Unless($personnel = Doctrine::getTable('Personnel')->find(array($request->getParameter('login'))), sprintf('Object personnel does not exist (%s).', $request->getParameter('login')));
     
        $this->form = new PersonnelForm($personnel);
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('edit');
      }
    Action processForm de personnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));      
     
        if ($form->isValid())
        {
            //--- Enregistrement des données du personnel dans la base de données ---
            $personnel = $form->save();        
     
            //--- Gestion des messages flash permettant d'informer l'utilsateur ---
            //[...]
            //[...]
            //[...]
    	//[...]
     
          	// Redirection à la page liste des équipes en fonction de l'urlFormRetour qui a fait appel à la création d'un personnel
          	$this->redirect($this->getUser()->getAttribute('urlFormRetour'));     	
     
          }
    Bon ok là je suis un peu trop généreuse sur le code...

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    A vue de nez (ce qui signifie que je n'ai pas repris le code dans une application de test), le code semble bon.

    Par contre, en relisant attentivement, je ne suis pas sur de comprendre ce qui n'est pas enregistré.

    Juste un truc, il n'est pas nécessaire d'utiliser "parent::configure()" dans ton code, cette méthode n'est utilisé que dans le dernier niveau du modèle, la pré-configuration se fait dans la méthode setup().
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

Discussions similaires

  1. [AC-2007] Problème d'enregistrement d'information sur un formulaire
    Par Yanley dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2012, 22h39
  2. [AC-2000] Probléme pour enregistrer les modification d'un formulaire
    Par Flow56 dans le forum IHM
    Réponses: 1
    Dernier message: 07/09/2010, 08h17
  3. Réponses: 2
    Dernier message: 11/06/2007, 23h23
  4. [MySQL] problème d'enregistrement dans une db via un formulaire
    Par momoh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/04/2007, 09h56
  5. Réponses: 1
    Dernier message: 25/09/2005, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo