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 insertion en bdd avec embedForm [1.x]


Sujet :

Symfony PHP

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 15
    Par défaut Problème insertion en bdd avec embedForm
    Bonjour,

    Voilà je suis en train de développer un système de messagerie privée avec Symfony et Doctrine, mais la réalisation est assez délicate... pour ne pas dire prise de tête !

    Mon problème concerne l'envoi d'un message :

    L'utilisateur renseigne les destinataires dans un champ unique (en utilisant jQuery Tokeninput). Ensuite, je récupère les id de chaque membre avec explode et j'insère les données dans 2 tables différentes (une pour le message + l'expéditeur et une autre pour les destinataires du message), pour ce faire j'ai utilisé embedForm.

    Le problème est résumé par la capture d'écran que j'ai faite. Il y a une requête en trop dans la transaction à cause du embedForm (ligne 25, la ligne 23 n'est pas nette non plus mais bon passons!)
    J'ai fini par pondre un truc qui "fonctionne" mais plus bancal que ça tu meurs !

    Voici le schéma :
    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
    31
    32
    33
    34
    35
    36
     
    sfGuardPrivateMessage:
      options:
        symfony:
          filter: false
        charset: utf8
        collate: utf8_general_ci
      actAs:
        Timestampable:
          updated:
            disabled: true
      columns:
        sender_id:     { type: integer, notnull: true }
        subject:       { type: string(100), notnull: true }
        message:       { type: clob, notnull: true }
        is_read:       { type: boolean, default: false, notnull: true }
        is_flagued:    { type: boolean, default: false, notnull: true }
        has_replied:   { type: boolean, default: false, notnull: true }
        is_reported:   { type: boolean, default: false, notnull: true }
        in_archive:    { type: boolean, default: false, notnull: true }
        in_trash:      { type: boolean, default: false, notnull: true }
      relations:
        sfGuardUser:   { local: sender_id,  foreign: id,  type: one }
     
    sfGuardPrivateMessageReceiver:
      options:
        symfony:
          filter: false
        charset: utf8
        collate: utf8_general_ci
      columns:
        message_id:             { type: integer, notnull: true }
        receiver_id:            { type: integer, notnull: true }
      relations:
        sfGuardPrivateMessage:  { local: message_id, foreign: id, type: many }
        sfGuardUser:            { local: receiver_id, foreign: id, type: one }
    L'action :

    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
     
      /**
       * Envoi d'un MP
       */
      public function executeNew(sfWebRequest $request)
      {       
        $this->form = new sfGuardPrivateMessageForm(null, array('height' => '350px'));
     
        if ($request->isMethod('post'))
        {
          $this->form->bind($request->getParameter($this->form->getName()));
     
          if ($this->form->isValid())
          {
            $this->form->save();
     
            $this->getUser()->setFlash('notice', 'Message Envoyé !', false);
          }
        }
      }
    Les formulaires :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    class sfGuardPrivateMessageForm extends PluginsfGuardPrivateMessageForm
    {
      public function configure()
      {       
        unset($this['id']);
     
        $this->useFields(array('subject', 'message'));
     
        $this->widgetSchema->setNameFormat('pm[%s]');
     
        $this->widgetSchema['message'] = new sfWidgetFormCKEditor(
          array('jsoptions' => array('toolbar' => 'MemberToolbar', 'enterMode' => 'CKEDITOR.ENTER_BR', 'height' => $this->getOption('height')))
        );
     
        $this->embedForm('receiver', new sfGuardPrivateMessageReceiverForm($this->getObject()->getSfGuardPrivateMessageReceiver()));
     
     
        /* 
         * Error messages 
         */
        $this->validatorSchema['subject']->setMessages(array(
          'required'    => 'Le sujet est obligatoire'
        ));
        $this->validatorSchema['message']->setMessages(array(
          'required'    => 'Votre message est vide...'
        ));
     
        /* 
         * Labels for input fields 
         */
        $this->widgetSchema->setLabels(array(
          'subject'       => 'Sujet :',
          'message'       => 'Message :'
        ));
      }
     
     
      public function saveEmbeddedForms($con = null, $forms = null)
      {
        if (null === $forms)
        {
          $values = $this->getValues();
     
          $ids = explode(";", $values['receiver']['receiver_id']);
     
          foreach ($ids as $key => $id)
          {
            /* Hack pour ne pas insérer 2 fois le premier id */
            if ($key > 0)
            {
              $receiver = new sfGuardPrivateMessageReceiver();
              $receiver->setMessageId($this->getObject()->getId());
              $receiver->setReceiverId($id);
              $receiver->save();
            }
          }
        }
     
        return parent::saveEmbeddedForms($con, $forms);
      }
    }
    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
     
    class sfGuardPrivateMessageReceiverForm extends PluginsfGuardPrivateMessageReceiverForm
    {
      public function configure()
      {
        unset($this['message_id'], $this['id']);
     
        $this->widgetSchema['receiver_id'] = new sfWidgetFormInputText();
     
     
        /* 
         * Error messages 
         */
        $this->validatorSchema['receiver_id']->setMessages(array(
          'required'     => 'Le message n\'a pas de destinataire'
        ));
     
     
        /* 
         * Labels for input fields 
         */
        $this->widgetSchema->setLabels(array(
          'receiver_id'  => 'Destinataire(s) :',
        ));
      }
    }
    La vue :
    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
    31
    32
     
            <form action="<?php echo url_for('sfGuardPrivateMessage/new') ?>" method="post">
     
              <fieldset> 
     
                <p>
                  <?php foreach ($form['receiver'] as $reveiver): ?>
                    <?php echo $reveiver->renderLabel() ?>
                    <?php echo $reveiver->render() ?>
                  <?php endforeach; ?>
                </p>
     
                 <p class="subject">
                    <?php echo $form['subject']->renderLabel(); ?>
                    <?php echo $form['subject']->render(); ?>
                 </p>
     
              </fieldset>
     
              <fieldset>
                <p>
                  <?php echo $form['message']->render(); ?>
                </p>
              </fieldset>
     
              <?php echo $form->renderHiddenFields() ?>
     
              <p class="center">
                <input type="submit" class="submit-button" value="Enregistrer" />
              </p>
     
            </form>
    L'idéal serait que la table sfGuardPrivateMessageReceiver contienne uniquement message_id et receiver_id en clé primaire et supprimer l'id auto-incrémenté. Enfin déjà si quelqu'un aurait l'extrême gentillesse de m'aider à trouver une solution plus propre que ça, ce serait un grand pas en avant pour moi !
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème insertion en bdd
    Par pierrooot dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/01/2010, 15h19
  2. [PDO] Problème Insert nombre flotant avec virgule
    Par shadeoner dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/06/2009, 12h53
  3. Réponses: 9
    Dernier message: 11/06/2007, 16h58
  4. Problème insertion dans bdd access. Via VB express 2005
    Par Frosaf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/06/2007, 18h19
  5. Problème Insert dans bdd Access
    Par waterman dans le forum Windows Forms
    Réponses: 10
    Dernier message: 10/04/2007, 17h15

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