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 :

Validation et formulaires embarqués ajoutés dynamiquement


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut Validation et formulaires embarqués ajoutés dynamiquement
    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 } ?>

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Sur le peu que j'ai travaillé en AJAX, j'ai toujours suivi la méthode des couches indépendante.

    D'abord cela doit marcher en PHP. Toutes les fonctionalités, y compris l'ajout d'un témoins, un personas qui n'aurait pas de javascript activé peut ainsi accéder à toutes les fonctions (en fait, cela doit aussi marcher sans CSS, le XHTML doit être lisible et exécutable dans les CSS).

    Puis le java vient englober le formulaire généré pour en faciliter l'usage.

    Bien sur, les appels java qui vont rajouter les témoins doivent passer par le même code que l'ajout de témoin tout en php. Enfin presque. Disons que les fonctions d'appels seront différentes, mais les fonctions au cœur de l'application doivent être commune.

    Ainsi, tu ne devrais plus avoir de problèmes.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut
    Je suis d'accord. Mais comme c'est un intranet, je pars du principe que tout les utilisateurs ont javascript installé. Je n'ai donc pas besoin d'être aussi rigoureux que pour un site internet.

    Maintenant, c'est toujours plus propre et plus portable de développer quelque chose qui marche sans javascript.

    Et justement comment ferais tu en php pur pour ajouter des formulaire avec un bouton ? J'avoue que je n'ai pas réussi sans passer par ajax ?

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Probablement avec des embeded form s'ils sont lié directement au premier, si non avec plusieurs formulaires les uns derrière les autres.

    Et une construction dans un array stockée dans l'objet user pour savoir où on en est dans les formulaires ajoutés.

    Après, le java va chercher le code xhtml généré pour le forumulaire et met à jour l'array dans les données de l'utilisateur.

    On peut donc utiliser indiférement l'un où l'autre et le contrôle final à l'arrivée utilise les données du user pour savoir ce qu'il doit vérifier et valider.

    En très gros et sans aucune analyse précise de ton problème spécifique.


    Effectivement, si tu es sur un parc matériel maîtrisé, c'est moins contraignant. Tant que l'administrateur n'a pas décidé de rajouter un matériel l'année prochaine...

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut
    Je suis l'administrateur !

    Merci pour les conseils. Je vais y réfléchir.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Pour avoir administré et géré de nombreux réseaux, je sais très bien que les choses peuvent changer très vite, parfois même à la barbe de l'administrateur.

    L'administrateur n'est pas nécessairement le décideur, et j'ai vu des parques changer du tout au tout (niveau logiciel) parce que le nouveau patron préférais tel interface de messagerie ou tel logiciel de post'it (si si) ! Tous le système lotus note mis à mal par un truc à post'it !

    Alors un explorateur, d'ici qu'un des directeurs choisisse que chrome ou un autre est mieux, qu'il veuille utiliser le truc sur son iphone ou son google phone...

    Et toute l'application est à l'eau, le parc n'est plus homogène. D'où mon idée qu'il faut toujours prévoir le plus large possible.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2013, 11h01
  2. [JavaScript] [SRC] Name d'un élément de formulaire ajouté dynamiquement
    Par SpaceFrog dans le forum Contribuez
    Réponses: 4
    Dernier message: 26/01/2008, 20h34
  3. Ajout dynamique de champ dans un formulaire
    Par gendalf37400 dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 06/06/2007, 15h11
  4. ajout dynamique de contrôle dans un formulaire
    Par celiaaa dans le forum IHM
    Réponses: 2
    Dernier message: 26/02/2007, 19h23
  5. Ajout dynamique de champs de type file dans un formulaire !
    Par stitch dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/11/2005, 11h18

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