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 :

Formulaire fusionnant avec un nombre dynamique d'autres formulaires.


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Formulaire fusionnant avec un nombre dynamique d'autres formulaires.
    Salut tout le monde,
    J'ai un problème avec PHP Symfony, ça fait deux jours là.
    J'ai deux formulaires : projet et ressource, chacun d'eux est une classe que j'ai définit et qui héritent de la classe sfForm.
    Dans la page destination, d'abord un formulaire de type projet figure et aussi un boutton "+" dont le but de créer et d'ajouter à la page un formulaire de type ressource.
    J'ai essayé une fonction javascript liée au bouton et qui fait afficher à chaque fois un formlaire de type ressource, voilà son code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function AddRs()
    {
    	var form = $('#frmSrc').val();
     
            $(form).appendTo('#rsc');
    }
    Où frmSrc est un champ hidden dont le seul but est de faire passer le formulaire (j'ai essayé la fonction alert($form) et ça affiche le code du formulaire donc c juste ) et rsc est une balise div dont le but est de recevoir les formulaires qui se crée quand j'appuie sur "+".
    9a c une méthode qui pose de problème quand je dois récupérer les valeurs dans tous les formulaires créés.
    Alors j'ai pensé à faire une fonction utilisant le jquery qui fait une fusion entre le formulaire principal et les nouveaux formulaires mais ça aussi pose des problèmes côté récupération des valeurs des formulaires.

  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
    C'est pas vraiment un problème symfony.

    A ta place, j'irais sur le forum javaScript.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci pour votre aide

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Points : 46
    Points
    46
    Par défaut
    J'ai fait ça dans mon appi : ajout de un ou plusieurs formulaire de témoins à une déclaration d'accident. Je me suis inspiré de ce post :

    http://forum.symfony-project.org/index.php/m/92706/

    Sinon j'ai mis mon source dans mon post "champs qui ne se sauvegardent pas"..

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Merci bien, je vais jeter un coup d'oeil et je posterai le résultat

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Salut rastaferraille,
    J'ai suivi le lien que vous m'avez donné, ainsi que le lien suivant http://www.thatsquality.com/articles...x-a-love-storyet voilà ce que j'ai fait.
    Pour bien expliquer le problème, je commence par le début.
    J'ai un formulaire ProjectsForm et un autre RsrcForm, le premier c'est pour contenir les informations sur un projet et le deuxième c pour récupérer les ressources attribués à ce projet.
    Voilà les deux formulaires :
    * ProjectsForm :
    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
     
    <?php
    class ProjectsForm extends sfForm
    {
      public function configure()
      {
        //setup les widgets du formulaire
      	$this->setWidgets(array(
          'i_id_project'   => new sfWidgetFormInputHidden(),
          'c_name_template'=> new sfWidgetFormDoctrineChoice(array('model' => 'TEMPLATE')),
          'c_key_project'  => new sfWidgetFormInputText(),
          'c_desc_project' => new sfWidgetFormTextarea(),
      	  'dir_prj'        => new sfWidgetFormDoctrineChoice(array('model' => 'USER')),
      	  'chef_prj'       => new sfWidgetFormDoctrineChoice(array('model' => 'USER')),
        ));
     
        //setup les validators du formulaire
        $this->setValidators(array(
          'i_id_project'   => new sfValidatorInteger(array('required' => false)),
          'c_name_template'=> new sfValidatorDoctrineChoice(array('model' => 'TEMPLATE', 'column' => 'c_name_template')),
          'c_key_project'  => new sfValidatorAnd(array(
                                                    new sfValidatorString(array('max_length' => 50)),
                                                    new sfValidatorRegex(array('pattern' => '/^[a-z0-9\_\.]+$/i'), array('invalid' => 'La cl&eacute; ne doit pas contenir des \', des espaces ou des caract&egrave;res accentu&eacute;s'))
                                                    )
                                                 ),
          'c_desc_project' => new sfValidatorAnd(array(
                                                    new sfValidatorString(array('max_length' => 900, 'required' => false)),
                                                    new sfValidatorRegex(array('pattern' => '/^[a-z0-9\s\_\.]+$/i'), array('invalid' => 'La cl&eacute; ne doit pas contenir des \' ou des caract&egrave;res accentu&eacute;s'))
                                                    )
                                                 ),
          'dir_prj'        => new sfValidatorDoctrineChoice(array('model' => 'USER', 'column' => 'i_id_user')),
      	  'chef_prj'       => new sfValidatorDoctrineChoice(array('model' => 'USER', 'column' => 'i_id_user')),
        ));
     
        //determiner les champs à afficher dans le formulaire tout en spécifiant l'ordre
      	$this->useFields(array('c_key_project', 'c_name_template', 'c_desc_project', 'dir_prj', 'chef_prj'));
     
      	//modifier les lables de chaque champs
      	$this->widgetSchema->setLabels(array(
        'c_key_project'        => 'Cl&eacute; du projet : ',
      	'c_name_template'      => 'Template de l\'arborescence : ',
      	'c_desc_project'       => 'Descriptif du projet : ',
      	'dir_prj'              => 'Directeur de projet',
      	'chef_prj'             => 'Chef de projet',
        ));
     
        $this->widgetSchema->setNameFormat('project[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
      }
     
      public function setValuesPrj($arrVal)
      {
      	$this->widgetSchema->setDefaults(array(
        'c_key_project'        => $arrVal['key'],
      	'c_name_template'      => $arrVal['tmpl'],
      	'c_desc_project'       => $arrVal['desc'],
      	'dir_prj'              => $arrVal['DP']->getIIdUser(),
      	'chef_prj'             => $arrVal['CP']->getIIdUser(),
        ));
      }
     
      public function mergeRp($arrRp, $lng)
      {
      	$subForm = new sfForm();
      	$j=1;
      	for ($i=0; $i<$lng; $i++)
      	{
      		$rpF = new RsrcForm();
      		$rpF->setDefault('rs_prj', $arrRp[$i]);
      		$subForm->embedForm($j, $rpF);
      		$j++;
      	}
      	$this->embedForm('Ressources', $subForm);
      }
     
       public function merge()
      {
      	$subForm = new sfForm();
      	$rpF = new RsrcForm();
      	$subForm->embedForm(1, $rpF);
      	$this->embedForm('Ressources', $subForm);
      }
     
      public function addRP($num)
      {
      	$rpF = new RsrcForm();
      	$num = $num + 1;
      	$this->embeddedForms['Ressources']->embedForm($num,$rpF);
      	$this->embedForm('Ressources', $this->embeddedForms['Ressources']);
     
      }
    }
    * Et le formulaire des ressources :
    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
     
    <?php
    class RsrcForm extends sfForm
    {
      public function configure()
      {
        //setup les widgets du formulaire
      	$this->setWidgets(array(
      	  'rs_prj'       => new sfWidgetFormDoctrineChoice(array('model' => 'USER')),
        ));
     
        //setup les validators du formulaire
        $this->setValidators(array(
      	  'rs_prj'       => new sfValidatorDoctrineChoice(array('model' => 'USER', 'column' => 'i_id_user')),
        ));
     
        //determiner les champs à afficher dans le formulaire tout en spécifiant l'ordre
      	$this->useFields(array('rs_prj'));
     
      	//modifier les lables de chaque champs
      	$this->widgetSchema->setLabels(array(
      	'rs_prj'          => ' ',
        ));
     
        $this->widgetSchema->setNameFormat('ressource[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
      }
     
      public function setValuesRsc($rsc)
      {
      	$this->widgetSchema->setDefaults(array(
      	'rs_prj'             => $rsc,
        ));
      }
    }
    J'ai un seul problème, c'est quand je créé un nouveau formulaire (au début, un formulaire de projet est embeded avec un seul formulaire de ressouce), j'ai un bouton "+" permettant d'ajouter un autre formulaire ressource (en fait, je vaux qu'il fusionne avec le formulaire initial). Voilà une phot qui dira plus que les mots :
    Nom : photo.JPG
Affichages : 85
Taille : 25,5 Ko
    Voilà mon fichier "nexSuccess" où l'affichage se fait
    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
     
    <div id="form">
      <form action="#" method="post">
        <table id="tabFrm">
          <tr>
            <td colspan="2" align="center">
              <h1>Nouveau projet</h1>
            </td>
          </tr>
          <?php echo $projectF->render(); ?>
          <tr>
            <td><br>
            </td>
            <td><br>
            </td>
            <td><br>
            </td>
            <td>
              <a href="#" onclick="return addrp();">  
                <img id="image" src="<?php echo image_path('add.png'); ?>" width="20" height="20" border=0 alt="add" /> 
              </a>
              <script type="text/javascript">
    			  var new_index=2;
     
    			  addrp = function()
    			  {
    			    $.post(
    			      '<?php echo url_for('project/addrpForm'); ?>',
    			      { index: new_index },
    			      function(data, textStatus) {
    			        $('#rsc').append(data);
    			      }
    			    );
    			    new_index = new_index+1;
     
    			    return false;
    			  }
    		</script>
     
            </td>
          </tr>
          <tr align="center" id="rsc">
          </tr>
          <tr>
            <td colspan="4">
              <hr />
            </td>
          </tr>
          <tr>
            <td colspan="4" align="center">
              <input type="submit" id="submit" name="submit" value="Enregistrer"/>
              <input type="reset" id="reset" name="reset" value="Annuler"/>
            </td>
          </tr>
        </table>
      </form>
    </div>
    Et voilà une partie du fichier /actions/action.class.php:
    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
     
    //##################################################################################
      //Fonction de nouveau projet
      public function executeNew(sfWebRequest $request)
      {
      	//disable la protection
      	sfForm::disableCSRFProtection();
      	//créer un nouveau formulaire
        $this->projectF = new ProjectsForm();
        $this->projectF->merge();
     
        //Tester le formulaire
        /*if ($this->getRequest()->getMethod() == sfRequest::POST)
        {
    	    $this->projectF->bind($this->getRequestParameter('project'));
     
    	    if ($this->projectF->isValid())
    	    {
    	        //La fonction d'ajout
    	        $this->addProject($this->projectF);
    	    	$this->redirect('@showprojects');
    	    }
        }*/
      }
      //############################################################################
      //fonction d'ajout de form rscs
      public function executeAddrpForm(sfWebRequest $request)
      {
      	  $Index = $request->getParameter('index');
          $this->forward404Unless($Index);
     
         $embedName = $Index; // the unique name to give this form
         $form = new ProjectsForm();
         $form->merge();
         $form->addRP($embedName);
     
         $output = $form['Ressources'][$embedName]['rsc_prj']->render();
         $this->renderText($output);
     
         return sfView::NONE;
     
     
      }
    Est-ce que le code Ajax est faux? Parce que quand j'exécute la page, le formulaire Projet fusionné avec un seul formulaire ressource s'affiche mais quand je clique sur le "+" rien ne s'effectue.
    J'ai comme une intuition qui me dit que le problème vient d'Ajax.
    Si vous avez une idée

Discussions similaires

  1. [Data] queryForList avec un nombre dynamique de paramêtres
    Par GabriHell dans le forum Spring
    Réponses: 2
    Dernier message: 14/05/2009, 09h44
  2. Réponses: 13
    Dernier message: 22/10/2008, 09h19
  3. [javascript - formulaire] select avec grand nombre d'enregistrements
    Par mussara dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/02/2007, 14h20

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