Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Formulaire dynamique (+javascript ?)

2 réponses
Avatar
christophe Raverdy
Bonjour.

Je suis en train de me mettre à PHP dans le but de réaliser ce que je
faisais avant sous Access. J'arrive pour l'instant à gérer des petits
formulaires notamment avec des SELECT qui dépendent de requêtes.

Je souhaite avoir un "formulaire" qui contient notamment 2 SELECT et un
tableau. Le contenu du 2ème SELECT dépendrait du choix fait au niveau du
premier, et le contenu du tableau dépendrait des deux SELECT.

Cet écran n'est pas l'écran initial.

Je suppose :
- qu'il est possible dans le code PHP d'exploiter la variable POST
pour deviner s'il s'agit ou non d'une sorte d'appel récursif et
générer les 3 écrans différents évoqués plus haut;
- que la mise à jour doit se faire en utilisant javascript
(".onchange")

J'aimerais savoir :
- si mon analyse est correcte (existe-t-il une solution purement PHP
(autre que proposer un bouton en demandant à l'utilisateur de bien
vouloir resynchroniser à la main) ?);
- Comment mixer PHP et javascript.

En même temps que je rédigais cet article, j'ai trouvé en
http://www.zazzybob.com/onchange.html un exemple qui semble correspondre
(hormis que j'utilise mysql) :

Un bloc javascript en amont du script php :

<script language="JavaScript">
function resubmit()
{
document.myform.action="add_article.php";
document.myform.submit();
}
</script>

Dans la déclaration du select, rajout après l'attribut "name" de
"onchange="resubmit()"

Ai-je loupé quelque chose ?

Par avance, merci.

--
christophe

2 réponses

Avatar
manu
Bonjour.


Salut

Je suis en train de me mettre à PHP dans le but de réaliser ce que je
faisais avant sous Access. J'arrive pour l'instant à gérer des petits
formulaires notamment avec des SELECT qui dépendent de requêtes.

Je souhaite avoir un "formulaire" qui contient notamment 2 SELECT et un
tableau. Le contenu du 2ème SELECT dépendrait du choix fait au niveau du
premier, et le contenu du tableau dépendrait des deux SELECT.

Cet écran n'est pas l'écran initial.

Je suppose :
- qu'il est possible dans le code PHP d'exploiter la variable POST
pour deviner s'il s'agit ou non d'une sorte d'appel récursif et
générer les 3 écrans différents évoqués plus haut;
Tout a fait possible, tu peux égallement dédier une variable (Post ou

Get) aux étapes d'un traitement, très pratique dans certains cas.
- que la mise à jour doit se faire en utilisant javascript
(".onchange")
Doit? Non, mais c'est pratique

J'aimerais savoir :
- si mon analyse est correcte (existe-t-il une solution purement PHP
(autre que proposer un bouton en demandant à l'utilisateur de bien
vouloir resynchroniser à la main) ?);
A partir du moment ou tu souhaites des modifications coté client

(navigateur) alors ta réponse ne sera de toute façon pas du pur code php
(serveur). Maintenant tu peux utiliser l'événement onChange de tes
select pour passer au étapes suivante (onChange="this.form.submit" par
exemple)
- Comment mixer PHP et javascript.
en préparant ton javascript dans ton code php?

En même temps que je rédigais cet article, j'ai trouvé en
http://www.zazzybob.com/onchange.html un exemple qui semble correspondre
(hormis que j'utilise mysql) :

Un bloc javascript en amont du script php :

<script language="JavaScript">
function resubmit()
{
document.myform.action="add_article.php";
document.myform.submit();
}
</script>

Dans la déclaration du select, rajout après l'attribut "name" de
"onchange="resubmit()"

Ai-je loupé quelque chose ?

Par avance, merci.



Ca marche mais c'est loin d'être le plus propre a mon avis, il vaut
mieux modifier des variables que la destination du formulaire.. ça c'est
plutot a faire dans ton code php au moment des includes
Chacun sa vision des choses, et pas mal peuvent etre défendues mais je
trouves bcp plus propre d'exposer un minimum de fichiers ..

Pour en revenir a ce que tu cherches a faire, selon la criticité (et
quantité) des datas associées entre les 2 formulaires et les temps de
réponse du serveurs, je te proposes 2 autres solutions:
----------
la premiere c'est d'extraire les infos en php et de les mettre dans un
tableau pour traitement en js
pour le coup cela se traiterait plutot sur une liste js mais bon..
ca te donnerais des tableaux du genre

<script language="javascript" content="text/javascript">
var selectun= new Array();
var selectdeux = new Array();

//infos genere en php
selectun['valeur1'] = 'affichage1';
selectun['valeurN'] = 'affichageN';

//valeurs du second select a associer a l'entree 1 du premier
selectdeux['valeur1'] = new Array();
selectdeux['valeur1']['valeur2.1'] = 'affichage2.1';
selectdeux['valeur1']['valeur2.Y'] = 'affichage2.Y';
//valeurs du second select a associer a l'entree N du premier
selectdeux['valeurN'] = new Array();
selectdeux['valeurN']['valeurN.1'] = 'affichageN.1';
selectdeux['valeurN']['valeurN.Y'] = 'affichageN.Y';

// fonction a associer au onChange du selectun (
onChange="rempliSelect(this.value)")
function rempliSelect (valeur) {
var SelectARemplir = document.getElementById('idduselect2');
SelectARemplir.options.lenght = 0; //effacement de toutes les options
courantes
for (option in selectdeux[valeur]) { //on boucle sur le tableau defini
precedement dont les entrees correspondent
opt = new Option(selectdeux[valeur][option], option); //creation d'un
objet option
SelectARemplir.options.add(opt,1); //ajout de l'objet option a l'objet
select (en qte 1)
}
}
</script>

Il faudra pe composer un chouilla, je n'ai pas testé
Principaux défauts de cette solution:
*toutes tes entrées passent dans le code source, on peut voir ce qui
correspond a quoi
*si tu as des selects bien fournis.. ça peut faire bobo au navigateur
quand il reçoit toutes les infos (lourdeur de la page)
-----------
la seconde solution est un peu plus mixte, elle consiste a utiliser les
propriété xmlhttp de javascript pour requérir "a la volé" le tableau a
mettre dans le second select
voir
http://www.webpronews.com/webdevelopment/basicdevelopment/wpn-37-20041201PHPOnTheFly.html
pour les éléments de base sur les manips xmlhttp

ensuite tu combines avec la fonction rempliSelect de sorte que xmlhttp
te renvoi l'équivalent de selectdeux[valeur] et le tour est joué

Problème potentiel avec cette solution; si tu as un serveur (ou un
client) un peu mou du genou ça peut ne pas marcher (quand on lui en met
une pleine tête xmlhttp rend parfois les armes [il faut quand même bien
pousser avant que ça n'arrive])

Avatar
Paul Delannoy
christophe Raverdy a écrit:
Bonjour.

Je suis en train de me mettre à PHP dans le but de réaliser ce que je
faisais avant sous Access. J'arrive pour l'instant à gérer des petits
formulaires notamment avec des SELECT qui dépendent de requêtes.

Je souhaite avoir un "formulaire" qui contient notamment 2 SELECT et un
tableau. Le contenu du 2ème SELECT dépendrait du choix fait au niveau du
premier, et le contenu du tableau dépendrait des deux SELECT.

Cet écran n'est pas l'écran initial.

Je suppose :
- qu'il est possible dans le code PHP d'exploiter la variable POST
pour deviner s'il s'agit ou non d'une sorte d'appel récursif et
générer les 3 écrans différents évoqués plus haut;


Oui c'est comme cela que l'on fait ; la plupart du temps il y a un seul
niveau suivant le schéma :
Si (formulaire déjà rempli)
traiter les données
sinon
afficher le formulaire
fin
Mais bien sûr on peut faire plusieurs étages !
La 'récursivité' est dans l'utilisation de $PHP_SELF qui est une
superglobale donnat le nom du script lui même (tu peux mettre son nom
'en dur' mais penses à la portabilité et à la relecture par autrui...)
L'avantage est que : pas besoin de javascript !


Par avance, merci.


De rien.

Un exemple (si le fichier à mettre en ligne est connu on le charge sinon
on demande son nom : formulaire)
<?php
/* Test les parametres du fichier donnes par formulaire : */
if (isset($_FILES["fichier"]["name"]))
{
$file_name=$_FILES["fichier"]["name"];
$file_temp=$_FILES["fichier"]["tmp_name"];
$taille=$_FILES["fichier"]["size"];
if ($file_name !="")
{
if(is_uploaded_file($file_temp))
{
$err=move_uploaded_file($file_temp, "memoires_ais_liste.txt");
if (!$err) { echo "Cr&eacute;ation du fichier impossible...";
exit;
}
}
else
{
echo "T&eacute;l&eacute;chargement rat&eacute;";
exit;
}
}
else { die("Indiquez un fichier !");
}
echo "<h3>Transfert r&eacute;ussi !</h3>";
echo '<ul>
<li>Envoy&eacute; :'.$file_name.'
<li>Taille : '. $taille.' octets ';
exit;
}
else /*Pas vu le formulaire : on l'envoie*/
{
echo '<html>
<body><h3>Mettre en ligne ...</h3>
<form name="toto" method="post" enctype="multipart/form-data"
action=".$PHP_SELF."> /* c'est le nom du script. */
Nom du fichier local : &nbsp;
<input type="file" name="fichier" size="60">&nbsp;
<input type="submit" value="Traiter la demande">
</form>
</body>
</html>';
}

?>