Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/06/2011, 09h59   #1
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 10h14   #2
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
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.
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 12h21   #3
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 12h29   #4
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
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
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 12h37   #5
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
Je ne suis pas convaincu par ton
Code :
$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
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 12h50   #6
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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 ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 13h00   #7
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
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.
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 14h13   #8
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
Voici mon formulaire Equipement

Code :
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 :
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 :
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é ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 14h34   #9
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
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 :
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 :
$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..
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/06/2011, 14h58   #10
Membre habitué
 
Avatar de Maerlyn31
 
Homme Baptiste Naudinat
Développeur Web
Inscription : mai 2011
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Baptiste Naudinat
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2011
Messages : 70
Points : 146
Points : 146
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
Maerlyn31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 15h35   #11
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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 ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 15h45   #12
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
Citation:
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.
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 15h59   #13
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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 ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 12h36   #14
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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...
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 09h24   #15
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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 ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 12h53   #16
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 13h18   #17
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
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 : 76
Points : 161
Points : 161
Bonjour,

pour le soucis avec les validators et faire taire l'avertissement, il faut ajouter dans votre configure() la ligne suivante :
Code :
$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.
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 14h55   #18
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
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 :
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 :
$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 :
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 :
$equipementCollectionForm = new sfForm();
-3- Je crée tous mes sous-formulaire et je les embarque dans le formulaire créé en étape 2.
Code :
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 :
$equipementForm->embedForm('equipements', $equipementCollectionForm);
-5- Je vérifie le résultat que j'obtiens lorsque je post ce qui devrait ressembler à ça ...

Code :
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
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 10h00   #19
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
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 :
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 :
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 :
foreach ($equipements as $i => $equipement)
Car ca ne marche pas chez moi ^^
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 10h51   #20
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

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

Informations forums :
Inscription : avril 2011
Messages : 95
Points : 142
Points : 142
Qu'est-ce que c'est que ces lignes 13 et 14 là ?

Code :
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 :
$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.
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h46.


 
 
 
 
Partenaires

Hébergement Web