Réinitialisation de champs dans un formulaire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Réinitialisation de champs dans un formulaire

par laeti » 31 juil. 2007, 15:33

Merci Ryle pour ta réponse. Je vois que mon problème peut être résolu et que tu l'as bien compris. Je souhaite de préférence en effet, qu'il n'y ait qu'un seul formulaire et qu'un seul traitement. Mais concrètement les solutions que tu m'apportes me semble un peu flou.
J'aurai tendance à priviligier, au vu de tes explications, la solution JS mais pour l'instant je ne maîtrise pas très bien. (tout ce que j'ai réussi à faire en JS ce sont des fonctions de contrôle de saisies!!)

Je te mets un bout de code de mon formulaire. Si tu pouvais m'aiguiller un peu plus, ça me rendrait la vision de mon problème un peu plus claire.

Merci pour ton aide.
<FORM action="traitement_saisie3.php" method="POST" name="envoi" enctype="multipart/form-data" onsubmit="return check_field()">
		
<div id=p1> Etat des lieux </div>
		
<TABLE class=table width="85%" border="0" align="left" hspace="0" vspace="10">
<TR>
	<TD valign="top"><font face="Verdana" size="1">Quel(s) référentiel(s) spatial(aux) est/sont utilisé(s)? :</font></TD>
	<TD><select id="Ref_spa" name="Ref_spa[]" size="5" multiple="multiple"><option>-- Saisissez un/des référentiel(s) spatial(aux) --</option>
	<!--Intégration des référentiels spatiaux de la base de données dans la liste déroulante --->
			<?php
			// requête sql
			$sql = "SELECT DISTINCT ref_spa_nom, ref_spa_id FROM referentiel_spatial ORDER BY ref_spa_nom asc";
	
			// on sélectionne toutes les entrées libellés des référentiels spatiaux de la table ref_spa
			$req=pg_query($sql) or die('Erreur SQL !'.$sql.'<br>'.pg_resul_error());
						
			//On affiche ces entrées dans la liste déroulante 
			while ($line=pg_fetch_array($req))
				{
				echo "<option name='Ref_spa' value=\"".$line['ref_spa_id']."\">".$line['ref_spa_nom']."</option>";
						}
			?></select></TD>
</TR>
<TR>
	<TD><font face="Verdana" size="1">Vos données sont-elles cataloguées ? :</font></TD>
	<TD><input id="Ques_catalogue_existant1" type="radio" name="Ques_catalogue_existant" value="Oui" checked><font face="Verdana" size="1">Oui</font></TD>
	<TD><font face="Verdana" size="1">Préciser :</font></TD>
	<TD><input id="Type_catalogue1" type="radio" name="Type_catalogue" value="3"><font face="Verdana" size="1">Catalogue papier</font></TD>
</TR>
<TR>
        <TD><input id="Ques_catalogue_existant2" type="radio" name="Ques_catalogue_existant" value="Non"><font face="Verdana" size="1">Non</font></TD>
        <TD><input id="Type_catalogue2" type="radio" name="Type_catalogue" value="2"><font face="Verdana" size="1">Fichier Excel</font></TD>
</TR>
<TR>
         <TD><input id="Type_catalogue3" type="radio" name="Type_catalogue" value="1"><font face="Verdana" size="1">Serveur de métadonnées</font></TD>
</TR>
</TABLE>
<TABLE class=table2 width="95%" border="0" align="left" hspace="0" vspace="10">
<TR>
	<TD><font face="Verdana" size="1">Souhaiteriez-vous que nous cataloguions vos données à l'aide d'un serveur de métadonnées ? :</font></TD>
	<TD><font face="Verdana" size="1">Souhaiteriez-vous être partenaire dans le cadre du projet de Plate-forme départementale d'échanges de données ? :</font></TD>
</TR>
<TR>
	<TD><input type="radio" name="Ques_catalogage" value="Oui" checked><font face="Verdana" size="1">Oui</font></TD>
	<TD><input type="radio" name="Ques_partenariat" value="Oui" checked><font face="Verdana" size="1">Oui</font></TD>
</TR>
<TR>
	<TD><input type="radio" name="Ques_catalogage" value="Non"><font face="Verdana" size="1">Non</font></TD>
	<TD><input type="radio" name="Ques_partenariat" value="Non"><font face="Verdana" size="1">Non</font></TD>
</TR>
</TABLE>

<div id=p3> Inventaire des besoins en informations géographiques en fonction des domaines de compétences </div>
		
<TABLE class=table8 width="90%" border="0" align="left" hspace="0" vspace="10">
<TR>
	<TD><font face="Verdana" size="1">Compétence :</font></TD>
	<TD><input name="Comp_libelle2" type="text" size="80"></TD>
</TR>
<TR>
	<TD><font face="Verdana" size="1">Mission :</font></TD>
	<TD><input name="Mis_libelle" type="text" size="80"></TD>
</TR>
<TR>
	<TD valign="top"><font face="Verdana" size="1">Donnée possible :</font></TD>
	<TD><textarea name="Bd_libelle" rows="5" cols="60"></textarea>
</TR>
</TABLE>
		
<TABLE class=table9>
<TR>
	<TD><input type="submit" name="?" value="Ajouter" onClick="document.location='saisie3.php'"></TD>
</TR>
</TABLE>
La partie secondaire correspond à l'inventaire des besoins identifiés

tout le traitement se situe dans le même script "traitement_saisie3". Et si je ne clique pas sur le bouton Ajouter mais sur Valider quand je n'ai qu'un besoin identifié à saisir, ça fonctionne très bien.

par Ryle » 31 juil. 2007, 15:05

Le second formulaire n'aurait aucun intérêt, voire ferait perdre les données du principal lorsque l'on soumet uniquement le secondaire...

J'avions bien compris ton problème, et la solution php que je te propose (à savoir soumettre tout le formulaire, ne traiter que la partie "secondaire" si le bouton correspondant a été cliqué, et revenir au formulaire complet pour poursuivre la saisie en pré-renseignant les autres champs est sans conteste la solution en php)

Pour la solution javascript, tu as deux façon de faire en fait en fonction de ce que tu préfères. La première consiste à rajouter des lignes de formulaire dans ta page quand on clique sur ajouter (donc aucun traitement effectué, simplement ajouter des lignes de saisies) ce qui permet à l'utilisateur de remplir entièrement un seul et unique formulaire sans Remise A Zéro (RAZ) des champs et de ne valider qu'une fois le tout pour que tu le traites (tu n'aurais alors qu'à boucler sur les champs ajoutés dynamiquement pour récupérer leurs valeurs dans ton traitement actuel.

La seconde solution avec ajax a pour but d'envoyer certaines données au serveur pour qu'il effectue un traitement et renvoie le résultat à la page sans avoir besoin de la recharger (donc sans perdre les informations saisies dans les autres champs :))
Les principe d'Ajax se résume à deux fonctions : la première appelle une page du serveur et lui envoi les données (en get ou en post) pour qu'il fasse un traitement, comme si tu avais ouvert cette page directement dans ton navigateur. La seconde récupère le résultat affiché à l'écran par la page appellé. Tu peux ainsi faire afficher OK ou KO selon le résultat du traitement, ou passer bien d'autres informations.
Le principe consiste donc à envoyer en javascript les données "secondaires" du formulaire, effectuer ton traitement en php dessus, résupérer le résultat (OK) et vider les champs une fois terminé.
Voir ajax pour plus de détails :)

par laeti » 31 juil. 2007, 15:01

Oui en effet c'est une idée qui paraît moins compliqué avec du javascript mais est ce que lors de la dernière saisie des champs de mon 2ème formulaire, les données pourront être traitées par le bouton Valider de mon 1er formulaire. En imaginant que je mette le 2ème form dans le 1er.

par d0m » 31 juil. 2007, 14:55

pourquoi ne pas faire alors 2 formulaires?
- un pour les quelques champs traités qui seront toujourstraités par le bouton ajouter
- un pour les autres champs qui seront traités avec le bouton de validation final

par laeti » 31 juil. 2007, 14:51

Mon problème n'est pas très clair. Donc je vais reprendre.

J'ai un seul formulaire qui contient un certain nombre de champs. Un bouton valider qui envoie mes données en traitement. Au milieu de ce formulaire, j'ai un bouton Ajouter que je souhaite programmer pour qu'il traite la saisie de quelques champs et qu'il me renvoie ensuite sur la page de mon formulaire qui laissera toujours apparaître les données des autres champs qui n'auront pas encore été traitées et me réinitialiser les champs traités. Et ceci, n fois. A la dernière saisie, c'est le bouton Valider qui enverra les données au traitement.

Ai-je été plus clair?
Je vais peut-être me pencher sur la solution javascript proposée, est-ce qu'elle correspond à mon problème? et si oui, peut-on me l'expliquer un peu plus?

Merci par avance.

par Ryle » 31 juil. 2007, 14:36

Sans recharger la page, il te faut passer par du javascript et ajax. Tu peux ainsi envoyée une partie es données saisies au serveur pour qu'il fasse son traitement, et lorsque tu as confirmation que celui-ci est terminé, tu réinitialises tes champs avec la valeur vide :)

L'autre solution est effectivement de soumettre tout le formulaire, faire ton traitement, et en fonction du bouton qui a été cliqué, rediriger vers la page suivante ou revenir vers le formulaire pour reprendre la saisie. En revanche, cela t'oblige à retransmettre les valeurs saisies dans les autres champs pour pouvoir les réafficher (le mieux étant peut être de les mettre en session)

par d0m » 31 juil. 2007, 14:35

De plus, mon bouton de validation finale, dont le name est également envoi, doit renvoyer les données vers le script de traitement.
Evidemment il faut donner un autre nom au bouton ajouter.

Je n'ai pas très bien compris comment tu veux t'y prendre.
Tu as un seul formulaire avec des champs.
Quand tu cliques sur ajouter, il traite le fromulaire et revient sur la même page.
Après avoir ajouté n fois, tu cliques sur le bouton de validation finale. En quoi le triatement final est il différents des ajouts?[/quote]

par laeti » 31 juil. 2007, 14:09

Si j'ai bien compris, il suffit juste de faire ceci:
<TD><input type="submit" name="envoi" value="Ajouter" onClick="document.location='saisie3.php'"></TD>
Mais ça ne marche pas.
Sachant que pour mon formulaire, j'ai
<FORM action="traitement_saisie3.php" method="POST" name="envoi" enctype="multipart/form-data" onsubmit="return check_field()">
De plus, mon bouton de validation finale, dont le name est également envoi, doit renvoyer les données vers le script de traitement.

Jusqu'ici, sans vouloir resaisir des données dans les champs concernés par mon pb et en ne faisant une seule saisie, mon formulaire et son traitement fonctionnent bien.

par d0m » 31 juil. 2007, 13:21

Est-il possible de programmer ce bouton pour qu'il renvoie sur ma page en réinitialisant les champs concernés tout en ayant traité les données saisies?
il suffi de éclarer ce bouton en type submit, définir l'action comme la page elle même et dans le cas ou il a été clické, en début de page traiter les données.

Réinitialisation de champs dans un formulaire

par laeti » 31 juil. 2007, 11:52

Bonjour,

J'ai un formulaire de saisie de données dans ma base de données PostgreSQL. Le traitement fonctionne très bien.
<FORM action="traitement_saisie3.php" method="POST" name="envoi" enctype="multipart/form-data" onsubmit="return check_field()">

... champs texte, liste, bouton ...

<input type="submit" name="envoi" value="Valider">
Ce formulaire est assez long. A l'interieur de celui-ci, j'ai des champs que je souhaiterai réinitialiser après une première saisie pour en faire une seconde, voire une troisième et une quatrième. Pour cela, j'ai créer un bouton Ajouter en dessous de ces champs.
<div id=p3> Inventaire des besoins en informations géographiques en fonction des domaines de compétences </div>
		
<TABLE class=table8 width="90%" border="0" align="left" hspace="0" vspace="10">
	<TR>
		<TD><font face="Verdana" size="1">Compétence :</font></TD>
		<TD><input name="Comp_libelle2" type="text" size="80"></TD>
	</TR>
	<TR>
		<TD><font face="Verdana" size="1">Mission :</font></TD>
		<TD><input name="Mis_libelle" type="text" size="80"></TD>
	</TR>
	<TR>
		<TD valign="top"><font face="Verdana" size="1">Donnée possible :</font></TD>
		<TD><textarea name="Bd_libelle" rows="5" cols="60"></textarea>
	</TR>
</TABLE>
<TABLE class=table9>
	<TR>
	        <TD><input type="button" name="ajouter" value="Ajouter"></TD>
	</TR>
</TABLE>
Ma question est la suivante: Est-il possible de programmer ce bouton pour qu'il renvoie sur ma page en réinitialisant les champs concernés tout en ayant traité les données saisies?

J'espère avoir été claire. Mon souhait aussi serait de ne travailler que sur un seul script de traitement, celui de l'action de mon formulaire.