OVH Cloud OVH Cloud

Formulaire : router le postage

4 réponses
Avatar
P. Gonogeu
Bonjour

J'ai composé un formulaire à POSTer dont je souhaite router
l'action en fonction du bouton submit qui est pressé.
Le problème en paramétrant l'action avec quelque chose du type
$_POST['bouton'] est qu'il faut presser le bouton 2 fois pour
que l'effet souhaité ait lieu.

J'ai tenté des choses avec un onclick propre à chaque bouton
se branchant sur une fonction JS contenant un
document.formulaire.action="URL adéquate" ; c'est du bricolage,
et ça ne fonctionne pas.

Puis-je m'en sortir avec seulement du PHP+HTML, où dois-je
nécessairement passer par du javascript ?
Je ne suis famillier ni avec JS ni avec les "header".

Merci pour votre aide.

Pierre

PS : J'ai besoin des variables $_POST dans la cible, dont le GET
ne peut suffire.

4 réponses

Avatar
Yann PIQUET
Bonjour

J'ai composé un formulaire à POSTer dont je souhaite router
l'action en fonction du bouton submit qui est pressé.
Le problème en paramétrant l'action avec quelque chose du type
$_POST['bouton'] est qu'il faut presser le bouton 2 fois pour
que l'effet souhaité ait lieu.

J'ai tenté des choses avec un onclick propre à chaque bouton
se branchant sur une fonction JS contenant un
document.formulaire.action="URL adéquate" ; c'est du bricolage,
et ça ne fonctionne pas.

Puis-je m'en sortir avec seulement du PHP+HTML, où dois-je
nécessairement passer par du javascript ?
Je ne suis famillier ni avec JS ni avec les "header".

Merci pour votre aide.

Pierre

PS : J'ai besoin des variables $_POST dans la cible, dont le GET
ne peut suffire.



Hum...

On peux faire des deux manieres, je pense... Mais avec PHP, c'est plus
complexe (à mon sens).

La methode avec PHP nécéssite la librairie CURL: tu commence par faire
un formulaire normal, par exemple:

<html>

<head>
<title>Formulaire</title>
</head>

<body>

<form method="post" action="test.php">
<input name="bidule">

<!-- Note que les deux submit ont le même nom, car je test leur
valeures. Tu peux aussi utiliser isset() et changer le nom -->
<input type="submit" name="vers" value="Envoyer au un">
<input type="submit" name="vers" value="Envoyer au deux">
</form>

</body>

</html>

Ensuite, on passe au php:

(fichier test.php ici)
<?php
// Création d'une ressource CURL
//Merci php.net :P
$ch = curl_init();

//On regarde vers où on doit se rediriger.
//Note que les urls sont completes
//Utilise une structure select ... case si
//tu utilise plus de deux redirections ^^
$redir = ($_POST['vers'] == "envoyer au un") ?
"http://127.0.0.1/usenet_test/testdeux.php" :
"http://127.0.0.1/usenet_test/testtrois.php";

// Définition de l'URL et autres options appropriées

//Celle-ci défini qu'on va envoyer les headers POST
curl_setopt($ch, CURLOPT_POST, 1);

//Celle-ci en défini le contenu; ici, j'envoi directement le tableau $_POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);

//Et celle-là défini l'url par la variable choisie précédement
curl_setopt($ch, CURLOPT_URL, $redir);

// Récupération de l'URL et passage au navigateur
curl_exec($ch);

// Fermeture de la ressource CURL et libération des ressources systèmes
curl_close($ch);
?>

Et tes autres scripts, normaux.

Sinon, tu à aussi la méthode Javascript:

<html>

<head>
<title>Formulaire</title>
</head>

<body>

<form method="post" action="test.php">
<input name="bidule">

<!-- Ici les deux peuvent avoir des noms differents -->
<input type="submit" name="vers" value="Envoyer au un"
onClick="javascript: document.forms[0].action = 'testdeux.php'">
<input type="submit" name="vers" value="Envoyer au deux"
onClick="javascript: document.forms[0].action = 'testtrois.php'">
</form>

</body>

</html>

Seul inconveniant, si le visiteur à désactivé le Javascript, tu l'as
dans l'os ;p

Bonne journée,

Aramiil

Avatar
Olivier Miakinen

La methode avec PHP nécéssite la librairie CURL: tu commence par faire
un formulaire normal, par exemple:

[...]

Ensuite, on passe au php:

(fichier test.php ici)
<?php
[...]
$redir = ($_POST['vers'] == "envoyer au un") ?
"http://127.0.0.1/usenet_test/testdeux.php" :
"http://127.0.0.1/usenet_test/testtrois.php";

[...]

curl_exec($ch);
?>


Pourquoi pas ceci ?

<?php
$redir = ($_POST['vers'] == "envoyer au un")
? "testdeux.php" : "testtrois.php";
require($redir);
?>

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
P. Gonogeu
Sinon, tu à aussi la méthode Javascript:
[...]
<input type="submit" name="vers" value="Envoyer au un"
onClick="javascript: document.forms[0].action = 'testdeux.php'">


C'était la syntaxe JS que j'utilisais qui était incorrecte (j'utilisais
un document.location au lieu de document.formulaire.action).
Ca fonctionne complètement avec ta proposition, et en plus ça
lève un autre problème JS à coté.

Comme il me fallait avancer, j'avais commencé à contourner mon problème
en utilisant un cookie (puisqu'il semble que "global" ne s'applique
qu'au script courant), et comme c'était galère, j'en suis venu à
utiliser un champ de $_SESSION pour passer le $_POST.
Finalement, ta réponse fonctionnelle m'évite ces acrobaties.

Merci !
Pierre

PS : Les pages sur lesquelles je travaille actuellement sont des pages
d'administration pour lesquelles JS est de toutes façons requis. Comme
il ne s'agit pas d'un projet à distribuer largement, l'usage de JS ne
pose pas de problème.

Avatar
Guy
J'ai composé un formulaire à POSTer dont je souhaite router
l'action en fonction du bouton submit qui est pressé.


vous pouvez sur une page HTML avoir plusieurs formulaires.

Le problème en paramétrant l'action avec quelque chose du type
$_POST['bouton'] est qu'il faut presser le bouton 2 fois pour
que l'effet souhaité ait lieu.

J'ai tenté des choses avec un onclick propre à chaque bouton
se branchant sur une fonction JS contenant un
document.formulaire.action="URL adéquate" ; c'est du bricolage,
et ça ne fonctionne pas.


la valeur du bouton est transmise, elle peut donc etre testée par le
PHP; ceci fournit une deuxiéme méthode: on execute la meme action, et le
php "route";


Puis-je m'en sortir avec seulement du PHP+HTML, où dois-je
nécessairement passer par du javascript ?


Javascript me semble indiqué pour simplifier la présentation de "FORM"


PS : J'ai besoin des variables $_POST dans la cible, dont le GET
ne peut suffire.