Bonjour à tous,

Voilà, j'ajoute des embedded forms (témoins) via ajax dans mon formulaire principal (déclaration). Tout fonctionne bien, à ceci près que lorsqu'il y a une erreur de validation, mon formulaire se réaffiche sans mes formulaires embarqués précédemment ajoutés.

Cela me paraît assez logique vu mon code, mais comment feriez vous pour palier à ce problème ?

Mon code :

DeclarationForm (formulaire principal) :

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
public function addTemoin($num)
	{
		$unTemoin = new Temoin();
 
		$temoins = $this->getObject()->Temoins;
		$nbTemoins = count($temoins);
		$this->getObject()->Temoins[$nbTemoins + 1] = $unTemoin;
 
		$newTemoinForm = new TemoinForm($unTemoin);
 
		unset($newTemoinForm["iddetmoin"]);
 
		$this->embeddedForms['new']->embedForm($num,$newTemoinForm);
		$this->embedForm('new', $this->embeddedForms['new']);
	}
méthode bind :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
public function bind(array  $taintedValues = null, array $taintedFiles = null){
		foreach($taintedValues['new'] as $key=>$newTemoin)
		{
			if (!isset($this['new'][$key]))
			{
				$this->addTemoin($key);
			}
		}
		parent::bind($taintedValues, $taintedFiles);
	}
	}
Un extrait du configure :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
// le formulaire d'ajout
		$newTemoinForm = new TemoinForm();
		$newTemoinForm->validatorSchema['nom']->setOption('required', false);
		$newTemoinForm->validatorSchema['prenom']->setOption('required', false);
		$numero = 0 ;
		$subForm = new sfForm();
		$subForm->embedForm($numero, $newTemoinForm);
		$this->embedForm('new', $subForm);
 
		// les témoins déjà ajoutés
		if(!$this->isNew()){
			$this->embedRelation('Temoins');
		}

Le javascript dans mon formulaire :

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
<script type="text/javascript">
 
 	var temoins = <?php print_r($form['new']->count())?>;
 
	function addTemoins(num) {
	  var r = $.ajax( {
		type: 'GET',
 
		url: '<?php echo url_for('declaration/addTemoinForm')?>'+'<?php echo ($form->getObject()->isNew()?'':'?id='.$form->getObject()->getIddeclaration()).($form->getObject()->isNew()?'?num=':'&num=')?>'+num,
 
		async: false
	   }).responseText;
	   return r;
	}
 
	$().ready(function() {
	   $('button#add_temoin').click(function() {
		$("#extratemoins").append(addTemoins(temoins));
		temoins = temoins + 1;
 
	  });
	});
Mon html :
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
 
<fieldset>
	<legend><?php echo('Temoins'); ?></legend>
		<div style="float:right">
			<button id="add_temoin" type="button">+</button>
		</div>
		<ul class="subform" style='float:left;'>
			<li class="titreSubForm">T&eacute;moin</li>
        		<li>
	        		<span>
		        		<?php echo $form['new'][0]['nom']->renderLabel(); ?>
		        		<?php echo $form['new'][0]['nom']->renderHelp(); ?>
		        		<?php echo $form['new'][0]['nom']->hasError() ? ' <span style="color: Red;">'.$form['new'][0]['nom']->getError().'</span>' : '' ?>
		        	</span>
		        		<?php echo $form['new'][0]['nom']->render() ?>
		        </li>
		        <li>
		        	<span>
		        		<?php echo $form['new'][0]['prenom']->renderLabel(); ?>
		        		<?php echo $form['new'][0]['prenom']->renderHelp(); ?>
		        		<?php echo $form['new'][0]['prenom']->hasError() ? ' <span style="color: Red;">'.$form['new'][0]['nom']->getError().'</span>' : '' ?>
		        	</span>
		        		<?php echo $form['new'][0]['prenom']->render() ?>
	        	</li>
				<?php echo $form['_csrf_token']->render();?>
        </ul>
 
        <div id="extratemoins">
	    </div>
     </fieldset>
        <?php if(isset($form['Temoins']) && count($form['Temoins']) > 0){ ?>
		    <fieldset>
			    <legend>Temoins déja ajout&eacute;s</legend>
	        	<?php $i = 0; ?>
				<?php foreach($form['Temoins'] as $e => $f): ?>
					<?php $i++; ?>
					<ul class="relation">
		    		    <li class="titreForm">T&eacute;moins de l'accident <?php echo $i ?> </li>
		    			<li>
			    			<span>
								<?php echo $f['nom']->renderLabel(); ?>
								<?php echo $f['nom']->renderHelp() ?>
								<?php echo $f['nom']->hasError() ? ' <span style="color: Red;">'.$f['nom']->getError().'</span>' : '' ?>
							</span>
				    			<?php echo $f['nom']->render() ?>
				    	</li>
 
				    	<li>
			    			<span>
								<?php echo $f['prenom']->renderLabel(); ?>
								<?php echo $f['prenom']->renderHelp() ?>
								<?php echo $f['prenom']->hasError() ? ' <span style="color: Red;">'.$f['prenom']->getError().'</span>' : '' ?>
							</span>
				    			<?php echo $f['prenom']->render() ?>
				    			<?php echo link_to('Supprimer', 'declaration/delete_temoin?iddeclaration='.$form->getObject()->getIddeclaration().'&idtemoin='.$f['idtemoin']->getValue(), array('method' => 'delete', 'confirm' => 'Etes vous s&ucirc;r(e) ?')) ?>
				    	</li>	
					</ul>
					<?php echo $f->renderHiddenFields();?>
				<?php endforeach ?>
			</fieldset>
		<?php } ?>