meduim
Invité n'ayant pas de compte PHPfrance
30 août 2005, 20:57
Avec un bouton submit normal :
Lorsque le visiteur clique sur un bouton "submit" classique (bouton gris), le navigateur du visiteur envoi la paire nom_du_bouton/valeur_du bouton, par exemple :
Si votre formulaire contient :
<input type="submit" name="action" value="valider">
alors le navigateur envoi (et le CGI reçoit) :
action=valider
Pour cela pas de problème... Mais lorsque c'est une image-submit qui est cliquée, le navigateur envoie bien autre chose !
Avec une image-submit :
Lorsque le visiteur clique sur une image-submit (image dont un clic valide le formulaire), le navigateur du visiteur envoie le nom du champ image-submit ainsi que les coordonnées de l'image (x et y) de l'endroit où vous avez cliqué. Par exemple :
Si votre formulaire contient :
<input type="image" src="
http://serveur.com/votre/image.gif" name="action" width="100" height=50">
alors à supposer que le visiteur clique en plein milieu de l'image, le navigateur envoi :
action.x=50
et
action.y=25
Généralement, cela ne vous intéresse pas de connaître les coordonnées du point de l'image qui a été cliqué. Ce qui vous importe c'est de savoir si c'est ce bouton-image qui a été cliqué ou un autre (à supposer que le fomulaire en ait plusieurs).
La solution :
Voci donc un petit sous-programme qui transforme les données reçues des images-submit, pour faire comme si le clic avait eu lieu sur un bouton-submit classique. En résumé, le but est de faire disparaître les '.x' et '.y' . Pour reprendre l'exemple ci-dessus, après l'éxécution du sous-programme, on n'aura plus action.x=50 et action.y=25, mais : action=1. Ainsi le CGI pourra savoir que le bouton d'envoi de formulaire nommé "action" a été cliqué.
Le code :
Voici le sous-programme : il suppose que le CGI ait auparavant récupéré les données envoyées par le formulaire en les stockant dans %form (tableau associatif)
Pour appeler ce sous-programme :
&receive_imgsubmit;
########################################
sub receive_imgsubmit {
local ($key);
foreach $key(keys(%form)) { #Pour chaque champ envoyé
if ($key=~ s/\.x$//) { #Si le champ finit par .x
delete($form{"$key\.x"});#...alors on le suprime
$form{$key}="1"; # et on créé: nom_champ_sans.x=1
}
if ($key=~ /\.y$/) { #Si le champ finit par .y
delete($form{$key}); #...alors on le supprime
}
}
}
########################################
Dans un script Perl, appelez ce sous-programme juste après avoir récupéré les données avec la méthode GET ou POST