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 :

[sf 1.4.x] Problème Formulaire un peu particulier [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut [sf 1.4.x] Problème Formulaire un peu particulier
    Bonjour à tous,

    Je suis en ce moment en train de développer ma première application symfony. Il s'agit d'une application de messagerie (boite de réception, d'envoi, nouveau message, corbeille, blablabla...)
    Je rencontre quelque problèmes concernant mon formulaire d'envoi de message.
    Avant toute chose posons les bases:
    voici mon schema.yml(allégé):
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    Destinataire:
      connection: doctrine
      tableName: destinataire
      columns:
        iddest:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: true
          autoincrement: true
        idmessage:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        iduser:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Message:
          local: idmessage
          foreign: idmsg
          type: one
        MvProf:
          local: iduser
          foreign: idprof
          type: one
    Message:
      connection: doctrine
      tableName: message
      columns:
        idmsg:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: true
          autoincrement: true
        idexp:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: false
          notnull: true
          autoincrement: false
        time:
          type: timestamp(25)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        objet:
          type: string(255)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        corps:
          type: string()
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        MvProf:
          local: idexp
          foreign: idprof
          type: one
        Destinataire:
          local: idmsg
          foreign: idmessage
          type: many
    MvProf:
      connection: doctrine
      tableName: mv_prof
      columns:
        idprof:
          type: integer(4)
          fixed: false
          unsigned: true
          primary: true
          autoincrement: true
        nom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        prenom:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        Destinataire:
          local: idprof
          foreign: iduser
          type: many
        Message:
          local: idprof
          foreign: idexp
          type: many
    Bon pour faire un peu plus simple, je vous l'ai fait en graphique (les couleurs sont la pr savoir sur quel attribut porte la relation):
    Nom : schema.png
Affichages : 111
Taille : 32,5 Ko

    Donc concrètement, le fonctionnement de la BD est simple :
    Mes utilisateurs sont dans la table MvProf
    Mes messages dans la table Message ()
    et ma table destinataires contient pour chaque message, autant d'enregistrement qu'il y a de destinataire.

    Prenons un exemple:
    Si l'utilisateur X envoi un message aux utilisateurs A,B,C et D alors au niveau de la BDD ça fait (ou du moins ça devrait faire):
    -création d'un enregistrement "Message"
    -création de quatre enregistrements Destinataires (reprenant l'id du message et l'id des 4 destinataires)
    et c'est la que ça se gate :

    Pour le choix des destinataires,je suis parti à la base sur une création "manuelle"de deux select multiple relié entre eux par un peu de JS pour que cela soit simple a prendre en main pour les utilisateurs finaux.
    Le premier select contient la liste complète des contacts et l'utilisateur déplace vers la seconde liste(vide au départ), les utilisateurs à qui il souhaite envoyer le message

    plutôt qu'un long discours, un petit screen
    Nom : form.jpg
Affichages : 116
Taille : 61,7 Ko
    svp ne faites pas attention au design
    Donc :
    mon "1. Destinataire" c'est mon formulaire 'créer manuellement' (je sens que je vais me faire )
    mon "2. Message" c'est bien mon formulaire généré par symfony dans lequel le form de destinataire est à la fois embed et hidden (donc il est la, mais on le voit pas )

    Ce que j'ai fait jusqu'à présent:
    - embed le formulaire de Destinataire dans le formulaire de Message
    - passer les champs relatifs aux destinataires a hidden (vu qu'ils ont déjà été choisi auparavant) dans mon select multiple.

    Ce que je voudrais faire et la ou je bloque vraiment c'est arriver a lui faire comprendre, d'une manière ou d'une autre que dans mon formulaire:
    ++++ 'idmessage' est l'id du message qui vient d'être crée.
    ++++ "iduser" est déjà rempli dans mon select multiple
    ++++ et lui faire créer autant d'enregistrement qu'il y a de destinataires


    Ca va faire qq jours que je bloque la dessus et plus j'avance plus je me dis que mon histoire de select multiple manuel ac du JS, ça embrouille tout, mais je ne vois pas comment, avec les outils symfony gérer mon problème d'enregistrement multiple (même si ces outils existent forcément).
    Voila, j'espère avoir été assez clair, peut être auriez vous quelque idées pour me tirer de ce mauvais pas?

    Merci d'avance de porter de l'intérêt à mon problème.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Qu'est ce que tu as utilisé pour faire ton select multiple en double liste ?

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Pourquoi s'embêter avec un formulaire embeded pour la double liste ?

    Tu crées des listes sans liaison avec la base dans ton form et cela devrait passer.

    Pour la sauvegarde, tu as deux solutions, soit dans le save du form (simple mais pas propre), soit dans l'objet base du modèle.

    Donc tu vas modifier ton save de ton form pour qu'il fasse appel à une méthode particulière de l'objet matableTable.class.php dans lequel tu as créé une méthode qui récupère toutes les données et un array pour les destinataires.

    Une petite foreach sur la liste des destinataires et tu vas créer tes enregistrements les uns après les autres.

    Je pense que cela devrait marcher.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Re-bonjour à tous,

    Dsl pour le temps de réaction, j'avais posté mon msg juste avant de partir en WE nature et famille (donc pas d'internet)

    Bon alors j'ai essayé de suivre la méthode de mimi, à savoir créer une liste dans mon formulaire sans liaison avec la base :
    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
     
    //lib/form/doctrine/MessageForm.class.php 
    class MessageForm extends BaseMessageForm
    {
      public function configure()
      {
            unset($this['time']);
            unset($this['corbeille']);
            unset($this['idmsg']);
            $this->widgetSchema['idexp'] = new sfWidgetFormInputHidden();
     
            $this->widgetSchema->setLabels(array(
                            'objet'    => 'Titre',
                            'corps'    => 'Contenu'));
     
            //ma liste
            $this->widgetSchema['destinataire']= new sfWidgetFormChoice(array(
                            'choices'       => array(),
                            'multiple'      => true,
                            'expanded'      => false));
     
     
            $this->setValidators(array(
                    'objet'         => new sfValidatorString(array('required'=>true)),
                    'destinataire'  => new sfValidatorChoice(array(
                                          'choices' => array(Doctrine_Query::create()->select('mv.idprof')->from('MvProf mv')->fetchArray()))),
                    'idexp'         => new sfValidatorInteger(),
                    'corps'         => new sfValidatorString(array('min_length'=>4,'required'=>false))
                    ));
     
     
      }
     
    }
    Bien sur la liste est pour le moment vide, mais je la remplis (et sélectionne ensuite tout les items) avec du JS.

    Au moment de soumettre le formulaire, je me mange une erreur :
    - Si le validateur de ma liste est présent, je me mange une :
    "500 | Internal Server Error | sfValidatorErrorSchema"
    - Et si je vire le validateur, je me mange:
    Unexpected extra form field named "destinataire".

    Dans tout les cas, ça ne lui plait pas.

    Bien sur, si je vire et le validateur et le widget, mon enregistrement de message se passe bien (mais n'as pas de destinataire )
    Je pense que je dois bien mal m'y prendre, ne pas faire les choses la ou il faut...

    Dans l'idée je comptais, dans le processForm, enregistrer mon message, récuperer l'id de celui-ci et boucler sur mes destinataires pour les enregistrer.
    mes actions:

    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
    //apps/frontend/module/msg/actions/action.class.php       
    public function executeNew(sfWebRequest $request){
                    $this->form = new MessageForm();
                    $this->form->setDefault('idexp', $this->getUser()->OffsetGet('id'));
                    $this->form->setDefault('time',date("F j, Y, g:i a"));
    }
     
    public function executeCreate(sfWebRequest $request){
                    $this->forward404Unless($request->isMethod(sfRequest::POST));
                    $this->form = new MessageForm();
                    $this->processForm($request, $this->form);
                    $this->setTemplate('new');
    }
     
    protected function processForm(sfWebRequest $request, sfForm $form){
                    $form->bind($request->getParameter($form->getName()),$request->getFiles($form->getName()));
                    if ($form->isValid()){
                            $this->created=true;
                            $message = $form->save();
                            foreach($request['message']['destinataire'] as $dest):
                                    $this->formdest = new DestinataireForm();
                                    $this->formdest->setDefault('iduser',$dest);
                                    $this->formdest->setDefault('idmessage',$message['idmsg']);
                                    $this->formdest->save();
                            endforeach;
     
                    }else{
                            $this->created=false;
                            $this->redirect(array('module'=>'msg','action'=>'new','act'=>'error'));
     
                    }
            }

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Le problème vient du validateur.

    A priori, il est correcte et toutes les données me semblent bonnes. C'est le bon validateur et il est indispensable.

    Par contre, n'y a-t-il pas de remplissage dans la liste d'origine, ce que je ne suis pas bien. Je ne vois pas comment vérifier que les éléments coché font partie de la liste, si la liste n'existe pas ?

  6. #6
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Okay il y avait bien un problème avec mon validateur, je l'ai reglé ce matin et j'ai finalement réussi a venir a bout de ce *** de formulaire, il marche enfin !
    merci a tous !

    je poste mon code, des fois que cela puisse aider quelqu'un :

    mes actions:
    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
     //apps/frontend/modules/msg/actions/actions.class.php
    public function executeNew(sfWebRequest $request){
                    $this->current=$request->getParameter('act');
                    $this->users= Requete::getMvProf();
                    $this->users=Requete::perso($this->users,$request->getParameter('act'))->execute();
                    $this->form = new MessageForm();
                    $this->form->setDefault('idexp', $this->getUser()->OffsetGet('id'));
                    $this->form->setDefault('time',date("F j, Y, g:i a"));
            }
     
            public function executeCreate(sfWebRequest $request){
                    $this->users= Requete::getMvProf()->execute();
                    $this->forward404Unless($request->isMethod(sfRequest::POST));
                    $this->form = new MessageForm();
                    $this->processForm($request, $this->form);
                    $this->setTemplate('new');
            }
     
            protected function processForm(sfWebRequest $request, sfForm $form){
                    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
                    if ($form->isValid()){
                            $this->created=false;
                            $message = $form->save();
                            foreach($request['message']['destinataire'] as $dest):
                                    $formdest = new DestinataireForm();
                                    $formdest->bind(array(
                                                    'iduser'        => $dest,
                                                    'idmessage'     => $message['idmsg']
                                            ));
                                    if ($formdest->isValid()):
                                            $formdest->save();
                                            $this->created=true;
                                    endif;
                            endforeach;
     
                    }else{
                            $this->created=false;
                            $this->redirect(array('module'=>'msg','action'=>'new','act'=>'error'));
     
                    }
            }
    mes 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
    63
    64
    65
    //lib/form/doctrine/MessageForm.class.php
    class MessageForm extends BaseMessageForm
    {
      public function configure()
      {
            unset($this['time']);
            unset($this['corbeille']);
            unset($this['idmsg']);
            $this->widgetSchema['idexp'] = new sfWidgetFormInputHidden();
     
            $this->widgetSchema->setLabels(array(
                            'objet'    => 'Titre',
                            'corps'    => 'Contenu'));
     
            //ma liste
            $this->widgetSchema['destinataire']= new sfWidgetFormChoice(array(
                            'choices'       => array(),
                            'multiple'      => true,
                            'expanded'      => false));
     
            $q = Doctrine_Query::create()->select('mv.idprof,mv.nom,mv.prenom')->from('MvProf mv')->where('nom!=?',"")->OrderBy('mv.idprof')->fetchArray();
            $i=0;
            foreach($q as $usr):
                    $donnee[$i]=$usr['idprof'];
                    $i++;
            endforeach; 
            $this->setValidators(array(
                    'objet'         => new sfValidatorString(array('required'=>true)),
                    'destinataire'  => new sfValidatorChoice(array(
                                            'choices' => array($donnee))),
                    'idexp'         => new sfValidatorInteger(),
                    'corps'         => new sfValidatorString(array('min_length'=>4,'required'=>false))
                    ));
     
      }
     
    }
     
     
     
    //lib/form/doctrine/DestinataireForm.class.php
     
    class DestinataireForm extends BaseDestinataireForm
    {
      public function configure()
      {
     
            $this->disableLocalCSRFProtection();
            //dans le form dest on utilise que le champs iduser (iddest est la clé primaire et idmessage reference le msg que l'on va créer en mm tps)
            $this->widgetSchema['iduser']    = new sfWidgetFormInputText();
            $this->widgetSchema['idmessage'] = new sfWidgetFormInputText();
            unset($this->widgetSchema['iddest']);
     
     
            $this->useFields(array('iduser','idmessage'));
            $this->setValidators(array(
                    'iduser'         => new sfValidatorString(array('min_length'=>1,'max_length'=>4,'required'=>true)),
                    'idmessage'      => new sfValidatorString(array('min_length'=>1,'max_length'=>4,'required'=>true))
                    ));
     
     
     
     
      }
    }

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

Discussions similaires

  1. Création d'un formulaire un peu particulier
    Par erehcab dans le forum Zend_Form
    Réponses: 0
    Dernier message: 27/04/2010, 15h26
  2. [1.x] Formulaire un peu particulier
    Par nsoinard dans le forum Symfony
    Réponses: 5
    Dernier message: 25/02/2010, 16h33
  3. Réponses: 10
    Dernier message: 11/05/2008, 18h49
  4. problème formulaire tabulaire
    Par jax69 dans le forum Access
    Réponses: 2
    Dernier message: 05/09/2005, 11h28
  5. Problème Formulaire + popup + page PHP
    Par Invité dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/02/2005, 00h10

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