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()"
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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])
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])
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])
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éation du fichier impossible..."; exit; } } else { echo "Téléchargement raté"; exit; } } else { die("Indiquez un fichier !"); } echo "<h3>Transfert réussi !</h3>"; echo '<ul> <li>Envoyé :'.$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 : <input type="file" name="fichier" size="60"> <input type="submit" value="Traiter la demande"> </form> </body> </html>'; }
?>
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éation du fichier impossible...";
exit;
}
}
else
{
echo "Téléchargement raté";
exit;
}
}
else { die("Indiquez un fichier !");
}
echo "<h3>Transfert réussi !</h3>";
echo '<ul>
<li>Envoyé :'.$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 :
<input type="file" name="fichier" size="60">
<input type="submit" value="Traiter la demande">
</form>
</body>
</html>';
}
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éation du fichier impossible..."; exit; } } else { echo "Téléchargement raté"; exit; } } else { die("Indiquez un fichier !"); } echo "<h3>Transfert réussi !</h3>"; echo '<ul> <li>Envoyé :'.$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 : <input type="file" name="fichier" size="60"> <input type="submit" value="Traiter la demande"> </form> </body> </html>'; }