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 :

Enregistrement multiple dans une seule table [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut Enregistrement multiple dans une seule table
    Bonjour,

    J'ai un tout petit soucis avec symfony. J'aimerais connaître la méthode pour pouvoir faire plusieurs enregistrement d'un coup avec un seul formulaire qui ne dépend que d'une seule table.

    J'ai une table équipement. Donc dans mon formulaire New, j'ai bien tous les champs lié à l'ajout d'un seul equipement. J'affiche tous les champs inputs dans une table sur une seule ligne, et à terme, je voudrais créer un bouton "ajout ligne" pour pouvoir rajouter une nouvelle ligne pour ajouter un nouvel équipement en plus et en même temps

    Mais avant de créer tous ca dynamiquement, je voudrais simplement que lorsque que je clique sur le lien nouvel équipement, je tombe sur la fiche new, mais avec la possibilité d'ajouter deux équipements d'un coup.

    Déjà est ce possible ? Et si oui, dans quel fichier doit porter mes recherches (comment afficher deux lignes d'un coup ? Faire plusieurs sauvegarde dans la BDD en fonction du nombre de ligne ?)

    Merci d'avance pour votre aide

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    J'aurai tendance à penser que les embed forms sont la solution à ce que tu désires.

    Corrige moi si je me trompe, tu veux en réalité pouvoir afficher plusieurs fois le même formulaire pour créer autant d'équipement qu'il y aura de formulaires affichés c'est bien ça ?

    Tu as soit la possibilité d'embarquer autant de formulaires de type equipement que tu le souhaites avec l'aide de la méthode embed, et dans ce cas lorsque tu affiches ton form celui-ci t'affichera tous ceux qui sont embarqués. Au moment de lier tes formulaires, tu n'as qu'à bind le formulaire parent pour que tous les suivants le soient également, et par la même occasion la sauvegarde en BDD.

    Ou alors la solution du goret feignant (ouais j'la vends bien) qui consiste à afficher autant de form que tu as besoin. L’inconvénient c'est que comme son nom l'indique c'est un peu cochon de faire une boucle pour afficher les forms, et une boucle pour les bind ensuite. Mais c'est un chouhia moins prise de tête que les embed lorsqu'on n'a pas l'habitude.

    Cela dit je ne peux que préconiser la première solution qui s'adaptera très bien et qui te servira plus d'une fois car les embed sont assez puissants.

    Donc dans un premier temps en statique tu embarques deux formulaires en dur pour vérifier que ça fonctionne, ensuite tu feras peut-être quelque chose en AJAX pour créer dynamiquement une succession de formulaires embarqués je présume.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    C'est exactement ce que je veux faire.
    J'ai rajouter un "$this->embedForm('equipement', $this);" dans mon formulaire d'équipement.

    Comment est ce que je peux lui dire ensuite, de m'afficher deux lignes d'équipement ?

    Je dois avouer que pour le moment, je voudrais comprendre comment fonctionne l'envoie de formulaire multiple avec symfony. Donc même la méthode "cochon", ca me va

  4. #4
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Pour afficher plusieurs fois le même formulaire, je suis pas sur que l'embed form soit la bonne solution.
    Surtout si ensuite doit s'ajouter une couche AJAX, il vaut mieux que le nombre de formulaire soit géré dans l'action que dans le modèle (après tout il n'y a aucune logique métier en plus, enfin ça me semble plus du ressort du contrôleur).

    L'embedForm je ne l'utilise que dans le cas de formulaires dont les modèles ont une relation Doctrine, pour le reste c'est souvent trop spécifique et autant repenser le processus en entier.

    Sinon, oui, mon côté goret fainéant, je l'assume bien au quotidien

  5. #5
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Je ne suis pas convaincu par ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedForm('equipement', $this);
    pour chaque formulaire que tu veux embarquer il faut en instancier un nouveau avant. Et puis compte tenu que tu vas en embarquer plusieurs il faudrait songer à les nommer différemment (equipement.form1, equipement.form2 etc... par exemple)

    Pour l'embarquement de formulaires je ne peux que te conseiller l'excellente (et foisonnante sur la toile) documentation de symfony concernant les formulaires avancés.

    Si tu veux un exemple je peux te rediriger vers un topic que j'avais ouvert il y a quelques semaines ou je débutais moi même avec les formulaires embarqués, c'est un cas sensiblement similaire ... il te suffira juste de l'adapter avec ton propre modèle. Il y a le code qui fonctionnait à la fin et sur lequel tu peux te baser.

    EDIT: @Maerlyn

    J'approuve sur le fait que l'embarquement doit se faire dans l'action et non dans le modèle.
    Par contre, ça ne me dérange pas particulièrement d'avoir plusieurs fois le même formulaire embarqué. C'est même plutôt pratique surtout au moment du bind() qui se fait en cascade. J'étais assez perplexe également sur cette manière de faire ... jusqu'à ce que je l'essaye et qu'elle fonctionne parfaitement bien

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Je ne me trompe en disant que pour afficher deux fois mon formulaire, je le fais dans l'action "new" d'équipement ?

    Et dans mon template, je devrais faire un foreach ?

    Ou j'ai définitivement rien compris ?

  7. #7
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Tu as à 50% compris ! ^^

    A priori c'est bien pour une action new que tu veux afficher tes n formulaires donc c'est bien dans cette action que tu vas construire ton form.

    La ou tu te trompes c'est justement que grâces aux embed, tu n'auras pas besoin de faire un foreach pour tes form. Tu as besoin d'un foreach si tu fais un form1, form2, form3, etc. que tu regroupes dans un tableau de form.

    Si tu utilise l'embarquement de formulaires, tu n'as qu'à faire un ou $form est le formulaire parent qui regroupe les n sous-formulaires.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Voici mon formulaire Equipement

    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
    class EquipementForm extends BaseEquipementForm
    {
      public function configure()
      {
        $this->setWidgets(array(
          'eqp_id'                => new sfWidgetFormInputHidden(),
          'teqp_id'               => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('TypeEqpt'), 'add_empty' => true)),
          'eqp_num_serie'         => new sfWidgetFormInput(array(),array('size' => 8 ,'maxlength' => 20)),
          'eqp_libelle'           => new sfWidgetFormInput(array(),array('size' => 15,'maxlength' => 50)),
          'eqp_abrege'            => new sfWidgetFormInput(array(),array('size' => 6,'maxlength' => 6)),
          'eqp_adr_mac'           => new sfWidgetFormInput(array(),array('size' => 26,'maxlength' => 23)),
          'eqp_etat'              => new sfWidgetFormInput(array(),array('size' => 4,'maxlength' => 4)),
          'eqp_version'           => new sfWidgetFormInput(array(),array('size' => 5,'maxlength' => 5)),
          'eqp_licence'           => new sfWidgetFormInput(array(),array('size' => 10,'maxlength' => 30)),
          'eqp_date_livr'         => new sfWidgetFormInput(array(),array('size' => 7,'maxlength' => 7)),
          'eqp_date_fin_garantie' => new sfWidgetFormInput(array(),array('size' => 7,'maxlength' => 7)),
          'eqp_date_sortie'       => new sfWidgetFormDateTime(),
          'org_id'                => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Organisme'), 'add_empty' => true)),
          'lieu_id'               => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Lieu'), 'add_empty' => true)),
          'pers_id'               => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Personne'), 'add_empty' => true)),
          'eqp_est_repliq_local'  => new sfWidgetFormInputHidden(),
          'dcreat'                => new sfWidgetFormInputHidden(),
          'ucreat'                => new sfWidgetFormInputHidden(),
          'dmodif'                => new sfWidgetFormInputHidden(),
          'umodif'                => new sfWidgetFormInputHidden(),
        ));
     
        $this->setValidators(array(
          'eqp_id'                => new sfValidatorChoice(array('choices' => array($this->getObject()->get('eqp_id')), 'empty_value' => $this->getObject()->get('eqp_id'), 'required' => false)),
          'teqp_id'               => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('TypeEqpt'))),
          'teqp_id'			   	  => new sfValidatorPass(),
          'eqp_num_serie'         => new sfValidatorString(),
          'eqp_libelle'           => new sfValidatorString(),
          'eqp_abrege'            => new sfValidatorString(array('required' => false)),
          'eqp_adr_mac'           => new sfValidatorString(),
          'eqp_etat'              => new sfValidatorInteger(array('required' => false)),
          'eqp_version'           => new sfValidatorString(array('required' => false)),
          'eqp_licence'           => new sfValidatorString(array('required' => false)),
          'eqp_date_livr'         => new sfValidatorDate(array('required' => false)),
          'eqp_date_fin_garantie' => new sfValidatorDate(array('required' => false)),
          'eqp_date_sortie'       => new sfValidatorDateTime(array('required' => false)),
          'org_id'                => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('Organisme'))),
          'lieu_id'               => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('Lieu'), 'required' => false)),
          'pers_id'               => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('Personne'), 'required' => false)),
          'eqp_est_repliq_local'  => new sfValidatorBoolean(array('required' => false)),
          'dcreat'                => new sfValidatorDateTime(array('required' => false)),
          'ucreat'                => new sfValidatorString(array('required' => false)),
          'dmodif'                => new sfValidatorDateTime(array('required' => false)),
          'umodif'                => new sfValidatorString(array('required' => false)),
        ));
     
        $this->embedForm('equipement', $this);
     
        $this->widgetSchema->setNameFormat('equipement[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
      	$this->usefields(array(
      		'eqp_num_serie','eqp_licence',
      		'eqp_libelle','org_id',
      		'teqp_id','eqp_version',
      		'eqp_etat','eqp_adr_mac',
      		'eqp_id','eqp_abrege',
      		'eqp_date_livr','eqp_date_fin_garantie',
      	    'dcreat','ucreat',
      		));
      }
    }
    Mon action "New"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function executeNew(sfWebRequest $request)
      {
      		for ($i = 0; $i < 3; $i++) {
        		$this->form = new equipementForm();
      		}
      }
    Et mon template New Equipement

    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
     
    <form action="<?php echo url_for('equipement/create') ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?> onSubmit='return verif_form_equipement("<?php echo $sf_user->getCulture(); ?>")'>	
     
    		<?php echo $form->renderHiddenFields(); ?>
     
    		<?php $form->getWidget('org_id')->setOption('add_empty', __('A séléctionner')); 
    		 $form->getWidget('teqp_id')->setOption('add_empty', __('A séléctionner')); ?>
     
     
    		<div id="choix_organisme">
    			<?php echo 'Organisme : '.$form['org_id']; ?>
    		</div>
     
    		<table id='table_ajout_eqp' class='table_ajout_eqp'>
        		<tr>
          			<th><?php echo __('Nom') ?></th>
          			<th><?php echo __('Abrégé') ?></th>
          			<th><?php echo __('Numéro de <br/>serie') ?></th>
          			<th><?php echo __('Adresse Mac') ?></th>
          			<th><?php echo __('Numéro de <br/>version') ?></th>
          			<th><?php echo __('Numéro de <br/>licence') ?></th>
          			<th><?php echo __('Type') ?></th>
          			<th><?php echo __('Date de <br/>Livraison') ?></th>
          			<th><?php echo __('Date de <br/>fin de garantie') ?></th>
        		</tr>
      		<tbody>
      		<?php echo sfContext::getInstance()->getUser()->getFlash('error') ?>
        		<tr id="ligne_equipement">
          			<td>
          				<?php echo $form['eqp_libelle']->renderError() ?>
                 		<?php echo $form['eqp_libelle']?>
                 	</td>
                 	<td>
          				<?php echo $form['eqp_abrege']->renderError() ?>
        	    		<?php echo $form['eqp_abrege'] ?>
       	  			</td>
          			<td>
          				<?php echo $form['eqp_num_serie']->renderError() ?>
                 		<?php echo $form['eqp_num_serie']?>
          			</td>
          			<td>
          				<?php echo $form['eqp_adr_mac']->renderError() ?>
                 		<?php echo $form['eqp_adr_mac']?>
          			</td>
          			<td>
          				<?php echo $form['eqp_version']->renderError() ?>
                 		<?php echo $form['eqp_version']?>
          			</td>   
          			<td>
          				<?php echo $form['eqp_licence']->renderError() ?>
                 		<?php echo $form['eqp_licence']?>
          			</td>
          			<td>
          				<?php echo $form['teqp_id']->renderError() ?>
        	    		<?php echo $form['teqp_id'] ?>
       	  			</td>
       	  			<td>
          				<?php echo $form['eqp_date_livr']->renderError() ?>
        	    		<?php echo $form['eqp_date_livr'] ?>
       	  			</td>
       	  			<td>
          				<?php echo $form['eqp_date_fin_garantie']->renderError() ?>
        	    		<?php echo $form['eqp_date_fin_garantie'] ?>
       	  			</td>
        		</tr>
        		<?php    		 	  
        			  $form->setdefault('eqp_etat', Equipement::ETAT_FONCTIONNEMENT);
        		 	  echo $form['eqp_etat'];
     
        		      $form->setdefault('dcreat', date('d-m-Y H:i:s')); 
        		 	  echo $form['dcreat'];
     
        		      $form->setdefault('ucreat', $sf_user->getAttribute('initiale')); 
        		 	  echo $form['ucreat']; ?>
      		</tbody>
     
     
    		</table>
    		<input class="bouton" type="submit" value="<?php echo __('Enregistrer') ?>"></input>
     
    </form>
    En théorie, je devrais me retrouver avec un tableau contenant 3 formulaires et pourtant je n'en ai qu'un.
    Je doute que le soucis vienne de Symfony, mais plutôt de moi , donc qu'elle est le truc que j'ai oublié ?

  9. #9
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Le contenu de ton action est mauvais, tu crées trois fois un formulaire sur la même variable sans rien embarquer.

    Quelque chose dans ce goût là me semble d'avantage se rapprocher de ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Dans ton action
    $form = new equipementForm();
    $form->useFields(array());
    for ($i = 0; $i < 3; $i++) {
      $embedForm = new equipementForm();
      $form->embedForm('equipement.form'.$i, $embedForm);
    }
    $this->form = $form;
    Comme je disais la construction de ton formulaire doit se faire dans l'action et pas dans la classe générique de ton formulaire. Tu peux virer cette ligne qui ne sert à rien dans ta classe form.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedForm('equipement', $this);
    Tu devrais quand même jeter un œil à la doc histoire de bien comprendre comment fonctionne l'embarquement de formulaires.

    Pour terminer, en ce qui concerne l'affichage rendu, je te conseille de jeter un oeil au résultat d'un echo $form, histoire vérifier que tu as bien les trois, et ensuite si tu as envie de t'amuser à parcourir tout le formulaire pour afficher tes champs ici ou là libre à toi..

  10. #10
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Petit détail, qui ne fais pas trop avancer le débat sur l'organisation du code, mais qui peut simplifier la vie. J'étais sur la page de l'API de sfForm pour un autre truc, et je suis tombé là dessus :

    http://www.symfony-project.org/api/1...bedformforeach

    Ca peut peut-être t'aider un peu

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup pour votre aide.

    J'ai bien les 3 $form['equipementform'] dans mon echo $form.
    Mais du coup, je devrais bien faire un foreach dans mon template pour afficher mes 3 formulaires non ?

    En faite, avant tous ca, j'avais déjà fait un petit bouton qui appel une fonction jquery qui me recopie la ligne_équipement (avec tous mes champs) et ajoute a l'identifiant un chiffre auto-incrémenté. Pas de soucis avec ca, il me rajoute bien ma ligne, et me change bien l'identifiant du champ input de ma ligne. Mais je suppose que ce n'est pas une bonne idée, puisque pour enregistrer les données, symfony a besoin d'avoir le vrai nom de l'identifiant du champ input ?

  12. #12
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Mais du coup, je devrais bien faire un foreach dans mon template pour afficher mes 3 formulaires non ?
    -->non.

    Justement, en partant du principe que comme je te l'ai écrit ton $form correspond au formulaire parent qui accueille les n sous-form, tu verras apparaitre tous tes forms juste en faisant UN echo $form dans ta template, chaque formulaire embarqué sera affiché.

    Par contre je n'ai vraiment pas compris ce que tu veux dans la deuxième partie de ton message.

  13. #13
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Si je veux avoir mes lignes de mon tableau, je vais être obligé de faire un foreach.

    En faisant un echo $form en dehors de mon tableau mais dans le $form, j'ai bien mes quatres formulaires. En remplissant tous, il me met, quand je valide mon form,

    * Unexpected extra form field named "equipementform0".
    * Unexpected extra form field named "equipementform1".
    * Unexpected extra form field named "equipementform2".

    C'est un soucis de validator ou je délire une nouvelle fois ?

  14. #14
    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
    Je n'ai que parcouru rapidement les conseils données.

    Une chose me surprend, c'est le joyeux mélange entre php et javascript...

    Soit tu traites en php, soit tu le fais en javascript, évite de mélanger les deux.

    L'idéal serait d'avoir un écran qui fonctionne pour ajouter une ligne à la fois, le tout en php.

    Ensuite, rajoute du js pour pouvoir en créer plusieurs. Accessoirement, si tu utilise du js pour le rajout de plusieurs lignes, je ne vois plus trop l'intérêt d'en avoir plusieurs à gérer à l'écran... vu que l'ajout sera presque instantané, une action json pour ajouter l'enregistrement et nettoyer la zone d'ajout et une action pour récupérer juste le tableau des lignes à afficher...

  15. #15
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Le faire en php, puis en js c'est ce que je veux faire, et c'est pratiquement ce que j'ai déjà fait.

    En faite, j'ai déjà créer ma page php qui ajoute un équipement à la fois. Ceci, aucun soucis. Et qui enregistre bien mes infos quand je valide mon formulaire.

    Puis j'ai bien rajouter mon petit bouton "ajout de ligne", qui appel une fonction JS, qui me permet de rajouter une ligne. (C'est la méthode dont je ne suis pas sur).

    J'ai mon <form> puis ma <table> puis ma <tr> avec toute mes <td> et dans chaques <td> j'ai mes champs inputs de mon formulaire. En JS, ce que je faisais, c'était de copier la ligne <tr> et la remettre en dessous. Pas de soucis de ce coté là non plus. Je changeait bien le nom de mes champs inputs. Pour chaque ligne je mettais un numéro autoincrémenté a la fin du nom et de l'id.

    Vu comme je ne savais pas utiliser les embedForm, je ne sais pas si c'est une "solution" pour rajouter plusieurs équipements d'un coup, et si ca fonctionne bien...

    D'où le fait que je me soit tourné vers l'ajout de plusieurs équipements d'un coup avec deux lignes dés le départ, mais ca aussi, je coince

    Ma solution pour ajouter une ligne en jquery vous sembles t'elle la bonne ?

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Désolé pour le double post, mais là je bloque ^^
    J'ai un soucis avec les validators (enfin je pense que c'est ca). J'ai ce message là :

    * Unexpected extra form field named "equipementform0".
    * Unexpected extra form field named "equipementform1".
    * Unexpected extra form field named "equipementform2".

    Quelqu'un saurait-il pourquoi ?

    Merci d'avance

  17. #17
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 80
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    pour le soucis avec les validators et faire taire l'avertissement, il faut ajouter dans votre configure() la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->validatorSchema->setOption( 'allow_extra_fields', true );
    ce bout de code ne fera que faire taire l'avertissement et ne résoudra pas les problèmes que vous pourriez avoir en aval.

    Je n'ai fait que survoler le reste de votre problème, mais pour avoir été confronté au même besoin, je me suis tourné vers une solution s'approchant de ce que vous propose Michel Rotta.

    Je vous suggère aussi d'aller visiter ce lien qui est un bon tutoriel à propos de ce que vous essayez de faire => http://tech.cibul.net/fr/formulaires...1-4-et-jquery/

    HTH.

  18. #18
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Désolé pour l'absence prolongée, d'autant plus que c'est moi qui t'ai plongé dans cette galère que sont les formulaires embarqués. En fait dans mon deuxième post, je t'ai suggéré de jeter un oeil à mon topic et ce n'est pas pour rien.

    La solution à ton problème d'extra-form-field se trouve dedans. Et plus précisément à cette ligne là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //mon code
    $partnerCollectionForm = new sfForm();
    En rajoutant un formulaire vierge de type sfForm à un niveau intermédiaire, tu n'auras plus de messages d'erreur sur le nombre de champs attendus. Et de cette manière tu n'es pas obligé de rajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->validatorSchema->setOption( 'allow_extra_fields', true );
    qui en soi n'est pas très propre (si tant est que ma méthode le soit).

    L'idée, et là j'insiste sur le fait que tu devrais te baser sur ce que j'ai fait puisqu'il s'agit d'un cas similaire, est la suivante :

    -1- Je crée mon formulaire parent que je pourrais binder (et donc le bind se fera en cascade par la suite) de type equipementForm et je n'utilise aucun de ses champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $equipementForm = new EquipementForm();
    $equipementForm->useFields(array());

    -2- Je crée un formulaire vierge (equipementCollectionForm) qui embarquera tous les sous formulaires qui seront de type A également

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $equipementCollectionForm = new sfForm();
    -3- Je crée tous mes sous-formulaire et je les embarque dans le formulaire créé en étape 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($equipements as $i => $equipement)
    {
      //...traitements divers
      $embedForm = new EquipementForm();
      $equipementCollectionForm->embedForm($i, $embedForm);
    }
    -4- Je termine par embarqué le formulaire de type sfForm dans le tout premier formulaire créé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $equipementForm->embedForm('equipements', $equipementCollectionForm);
    -5- Je vérifie le résultat que j'obtiens lorsque je post ce qui devrait ressembler à ça ...

    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
    equipement: { 
      equipements: { 
        equipement1: { 
          field1: 'value', 
          field2: 'value', 
          fields3: 'value',
          ... 
        }, 
        equipement2: { 
          field1: 'value', 
          field2: 'value', 
          fields3: 'value',
          ...  
        } 
      }, 
      _csrf_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    }
    A savoir que le premier 'equipement' est le nom du paramètre et que equipements est donc le premier niveau de la valeur.

    Maintenant pour ce qui est de la partie javascript je suis moins apte à t'éclairer

  19. #19
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Pardon pour l'absence, j'étais occupé par la finalisation de mon dossier de stage ^^

    Donc je suis rendu là :

    Dans mon action class New :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $equipementForm = new equipementForm();
    	$equipementForm->usefields(array());
     
     
    	$equipementCollectionForm = new sfForm();
     
      	for ($i = 0; $i < 2; $i++)
    	{
      //...traitements divers
      		$embedForm = new equipementForm();
      		$equipementCollectionForm->embedForm($i, $embedForm);
    	}
    	$this->form = $equipementForm;
      	$this->form = $equipementCollectionForm;
    et dans mon Post :
    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
    array
      '_csrf_token' => string '9b6032d3786ff5a01ca1fad151599d4e' (length=32)
      0 => 
        array
          'eqp_id' => string '' (length=0)
          'dcreat' => string '' (length=0)
          'ucreat' => string '' (length=0)
          'eqp_date_sortie' => string '' (length=0)
          'eqp_est_repliq_local' => string '' (length=0)
          'dmodif' => string '' (length=0)
          'umodif' => string '' (length=0)
          'eqp_num_serie' => string '123' (length=3)
          'eqp_licence' => string '123' (length=3)
          'eqp_libelle' => string '123' (length=3)
          'org_id' => string '2' (length=1)
          'teqp_id' => string '1' (length=1)
          'eqp_version' => string '123' (length=3)
          'eqp_etat' => string '1' (length=1)
          'eqp_adr_mac' => string '11-11-11-11-11-11' (length=17)
          'eqp_abrege' => string '123' (length=3)
          'eqp_date_livr' => string '' (length=0)
          'eqp_date_fin_garantie' => string '' (length=0)
      1 => 
        array
          'eqp_id' => string '' (length=0)
          'dcreat' => string '' (length=0)
          'ucreat' => string '' (length=0)
          'eqp_date_sortie' => string '' (length=0)
          'eqp_est_repliq_local' => string '' (length=0)
          'dmodif' => string '' (length=0)
          'umodif' => string '' (length=0)
          'eqp_num_serie' => string '321' (length=3)
          'eqp_licence' => string '321' (length=3)
          'eqp_libelle' => string '312' (length=3)
          'org_id' => string '2' (length=1)
          'teqp_id' => string '3' (length=1)
          'eqp_version' => string '321' (length=3)
          'eqp_etat' => string '1' (length=1)
          'eqp_adr_mac' => string '22-22-22-22-22-22' (length=17)
          'eqp_abrege' => string '321' (length=3)
          'eqp_date_livr' => string '' (length=0)
          'eqp_date_fin_garantie' => string '' (length=0
    Il ne veut pas me valider mon formulaire, car je suppose qu'il manque mon formulaire principal.
    Il me dit "csrf token: Required."

    D'où vient mon problème ?

    PS : Ton foreach, je ne vois pas à quoi il correspond.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($equipements as $i => $equipement)
    Car ca ne marche pas chez moi ^^

  20. #20
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Qu'est-ce que c'est que ces lignes 13 et 14 là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->form = $equipementForm;
    $this->form = $equipementCollectionForm;
    Je ne vois pas bien ce que tu essayes de faire de cette manière mais si c'est un embarquement tu n'y es pas. Ce que tu fais là c'est donner un $equipementForm (qui est encore complètement vide à ce stade) à ton $this->form, puis tu l'écrases avec la collection de formulaires (que tu vois dans ton post). Si tu veux embarquer le tout dans ton formulaire principal, cela se fait avec la méthode embedForm() que tu utilises notamment à la ligne 11.

    Remplace ces deux lignes par ce que je t'ai écrit en point 4, et tu conclus avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->form = $equipementForm;
    Et pour le foreach désolé effectivement mon exemple était légèrement différent dans la mesure ou la liaison entre les deux tables était déjà définie.
    Le for que tu as mis fera l'affaire.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. import dans une seule table
    Par mike2302 dans le forum VBA Access
    Réponses: 10
    Dernier message: 28/06/2007, 07h03
  2. Réponses: 5
    Dernier message: 21/06/2007, 08h49
  3. Enregistrement multiple dans une base à partir d'un formulaire
    Par ange_dragon dans le forum Modélisation
    Réponses: 2
    Dernier message: 05/06/2007, 15h28
  4. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  5. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19

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