2010-10-22 23 views

Répondre

11

Non Une forme n'a qu'un seul action (action étant une propriété du form, pas le bouton d'envoi).

La cible de l'action peut faire différentes choses sur la base des valeurs du formulaire. Ainsi, vous pourriez vouloir commencer à nommer vos boutons d'envoi.

Apprenez le HTML avant même de penser à l'écriture et au déploiement d'un script CGI.

<form method="POST" action="/cgi-bin/script"> 
<input type="submit" name="action" value="DoSomething"> 
<input type="submit" name="action" value="DoSomethingElse"> 
</form> 

Notez également que le choix d'une action fondée sur la valeur de ce bouton est une stratégie perdante si vous souhaitez internationaliser l'application parce que le value d'un bouton de soumission est ce que l'UA affiche pour l'homme.

Par conséquent, script doit décider quoi faire sur la base de la valeur d'un autre élément d'entrée. Par exemple, CGI::Application examine un paramètre run_mode.

Vous pouvez également utiliser des noms différents pour vos boutons d'envoi, comme le suggère Alec. Dans ce cas, vous devez vérifier quel bouton de soumission a été pressé en passant par les noms des paramètres passés à votre script qui, à mon humble avis, rend la répartition un peu plus lourde. Cela signifie aussi qu'il est possible pour quelqu'un de transmettre des valeurs pour tous les boutons de soumission à votre script (et non via l'interface utilisateur, mais via curl ou wget ou des programmes similaires.

Par exemple, étant donné le HTML

<form method="POST" action="/cgi-bin/script"> 
<input type="submit" name="submit_left" value="Go Left"> 
<input type="submit" name="submit_right" value="Go Right"> 
</form> 

voici comment votre script peut gérer la soumission de formulaire:

#!/usr/bin/perl 

use strict; use warnings; 

use CGI::Simple; 

my $cgi = CGI::Simple->new; 

my %dispatch = (
    left => \&handle_left, 
    right => \&handle_right, 
); 

my @actions = grep s/^action_(right|left)\z/$1/, $cgi->param; 

my $handler = \&handle_invalid_action; 

if (@actions == 1) { 
    my ($action) = @actions; 
    if (exists $dispatch{ $action }) { 
     $handler = $dispatch{ $action }; 
    } 
} 
else { 
    $handler = \&handle_too_many_actions; 
} 

$handler->($cgi); 

sub handle_left { } 
sub handle_right { } 
sub handle_invalid_action { } 

# because it may indicate someone trying to abuse your script 
sub handle_too_many_actions { } 
+0

Dans l'exemple de code ci-dessus, deux boutons d'envoi sont redondants. Les deux effectuent la même action. Corrigez? – Jean

+3

@alertjean, cela dépend du script. Les boutons d'envoi ont des valeurs différentes, donc le script peut dire lequel a été cliqué, et faire quelque chose de différent en fonction de cela. – cjm

+0

Il est généralement plus facile d'utiliser l'attribut 'name' pour différencier les différentes actions. Par exemple. ' 'et' '. De cette façon, vous pouvez associer des noms d'actions simplifiées à des textes réels. C'est aussi le seul moyen de travailler avec des sites multilingues, car la valeur ne sera jamais la même. – Alec

13

Juste au cas où quelqu'un d'autre trouve ce post:

I Si vous utilisez HTML5, cela est plus facile grâce à l'attribut formaction. Cet attribut s'applique aux éléments input et button de type="submit" et oblige le formulaire à se soumettre à l'emplacement spécifié dans l'attribut formaction de l'élément cliqué.

Le seul inconvénient de cet attribut est qu'il n'est pas supporté par Internet Explorer 9 et inférieur, mais cette limitation peut être facilement surmontée en utilisant un peu de JavaScript.

Exemple:

<form method="post" action="go_default"> 
    <input type="submit" value="Go Left" formaction="go_left" /> 
    <input type="submit" value="Go Right" formaction="go_right" /> 
</form> 

Pour IE 9 et inférieur:

<script type="text/javascript"> 
    $(function() { 
     var $submit = $('form [type="submit"][formaction]'); 

     $submit.click(function() { 
      var $this = $(this), 
       action = $this.prop('formaction'), 
       $form = $this.closest('form'); 

      $form.prop('action', action).submit(); 
     }); 
    }); 
</script> 
-1

Vous pouvez également utiliser Ajax pour cela, et chaque bouton a attribué une fonction ajax qui appelle ses propres script PHP et vous n'avez même pas besoin de rafraîchir la page ou de rediriger, comme dans cet exemple que j'ai essayé:

HTML: 
<input type="submit" value="Make other thing" onclick="ajax_post1();"/> 
<input type="submit" value="Make something" onclick="ajax_post2();"/> 

<div id="script1Response"></div> 
<div id="script2Response"></div> 

fonctions Javascript:

// la première fonction

function ajax_post1(){ 
var hr = new XMLHttpRequest(); 

// prendre les valeurs des éléments d'entrée HTML que vous souhaitez utiliser

var v1=document.getElementbyId("element1").value; 
var v2=document.getElementbyId("element2").value; 

// le script traitera les données

var url="php_script1.php"; 

// la variable qui contiendra les informations pour le script php

var dataVar="var1="+v1+"&var2="+v2; 
hr.open("POST", url, true); 
hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

// accéder à l'événement onreadystatechange pour l'objet XMLHttpRequest

hr.onreadystatechange = function() { 
    if(hr.readyState == 4 && hr.status == 200) { 
    var script_response = hr.responseText; 
    document.getElementById("script1Response").innerHTML = script_response; 
    } 
    } 

// Envoyer les données à php_script1.php

hr.send(dataVar); // Actually execute the request 
document.getElementById("script1Response").innerHTML = "processing..."; 
} 

// la deuxième fonction

function ajax_post2(){ 

var v1=document.getElementbyId("element1").value; 
var v2=document.getElementbyId("element2").value; 
var url="php_script2.php"; 
var dataVar="var1="+v1+"&var2="+v2; 
var hr = new XMLHttpRequest(); 
hr.open("POST", url, true); 
hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

hr.onreadystatechange = function() { 
    if(hr.readyState == 4 && hr.status == 200) { 
    var script_response = hr.responseText; 
    document.getElementById("script2Response").innerHTML = script_response; 
    } 
    } 

hr.send(dataVar); 
document.getElementById("script2Response").innerHTML = "processing..."; 

} 

Les fichiers php devront contenir des variables qui stockeront les valeurs envoyées par le paramètre dataVar comme ceci:

$var1_=$_POST['var1']; //the var1 from the dataVar parameter 
$var2_=$_POST['var2']; //the var2 from the dataVar parameter 

L'exemple je peuvent être trouvés ici: https://www.youtube.com/watch?v=woNQ2MA_0XU.