checkbox non compatissante

Eva
Petit nouveau ! | 6 Messages

16 févr. 2010, 16:46

Bonjour à tous,

Je créé actuellement un formulaire dont les informations sont destinées à être transmises par mail. L'une des infos que je souhaite recueillir est de savoir si une checkbox a été cochée ou non :

Code : Tout sélectionner

<form method="post" action="contact.php" name="contactform" id="contactform"> ... <label><span class="required"></label> <input name="allerretour" type="checkbox" id="allerretour" value="AR" />
Je récupère donc l'info via contact.php :

Code : Tout sélectionner

if (isset($_POST['submit'])) { $allerretour = NULL; if(isset($_POST['allerretour'])){ $allerretour = $_POST['allerretour']; } else { $allerretour = FALSE; }
Le problème, c'est que j'obtiens toujours la même valeur, que la case soit cochée ou non. J'ai essayé de multiples façons, à chaque fois le résultat est le même :

Code : Tout sélectionner

if(!empty($allerretour)){ $allerretour= "Oui";} else {$allerretour= "Non"; };
Je finis par me poser de sérieuses questions sur ma compréhension des formulaires.

Si vous avez des suggestions, je suis preneuse ;)

Merci

Eva

Eléphant du PHP | 86 Messages

17 févr. 2010, 11:38

Salut,

C'est normal... tu donnes la valeur "AR" à ta checkbox

Eva
Petit nouveau ! | 6 Messages

17 févr. 2010, 12:18

Merci de ta réponse...Mais on n'est pas censé pouvoir donner la valeur que l'on souhaite à une checkbox ? Le cas échéant, quelle valeur est-ce que je dois donner ?

Eva

Eléphant du PHP | 86 Messages

17 févr. 2010, 15:52

Dans le formulaire :
<input name="allerretour" type="checkbox" id="allerretour" />
Dans la page de traitement :
if(!empty($_POST['allerretour']))
    $allerretour = true;
else
    $allerretour = false;

Eva
Petit nouveau ! | 6 Messages

17 févr. 2010, 17:50

Merci Skikit, malheureusement le problème perdure...Que la case soit cochée ou non, je reçois :

Code : Tout sélectionner

Aller/Retour : "1"
par mail.

mon fichier contact.php ressemble à çà (j'ai éliminé les lignes non concernées) :

Code : Tout sélectionner

<?php if(!$_POST) exit; .... if(!empty($_POST['allerretour'])) $allerretour = true; else $allerretour = false; ... $address = "[email protected]"; $e_subject = 'Une demande de ' . $name . '.'; $e_body = "message.\r\n\n"; $e_ligne1 = "Ville : \"$depart\"\r\n\n"; $e_ligne2 = "Aller-retour : \" $allerretour\"\r\n\n"; ... $msg = $e_body . $e_ligne1 . $e_ligne2; if(mail($address, $e_subject, $msg, "From: [email protected]\r\nReply-To: $email\r\nReturn-Path: $email\r\n")) { echo "<fieldset>"; echo "<div id='success_page'>"; echo "<h1>Message envoyé.</h1>"; echo "</div>"; echo "</fieldset>"; } else { echo 'ERROR!'; } } function isEmail($email) { return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i",$email)); } ?>
Incompréhensible...Tous les autres champs de type text, dropdown, textarea sont correctement récupérés, à l'exception de ces foutus checkboxes !

Eléphant du PHP | 86 Messages

17 févr. 2010, 18:07

C'est encore une fois normal :)
Ta checkbox te renvoit un booléen : true si cochée, false si non cochée.
Si tu utilises ta variable $allerretour directement dans ton mail, ça va t'afficher 1 si true et soit 0 soit rien du tout si false.
Utilise donc plutôt une chaîne dans ton cas :
if(!empty($_POST['allerretour']))
       $allerretour = "Oui";
   else 
       $allerretour = "Non";
J'ai testé le code que tu as posté et ça fonctionne sur ma machine, si ta variable $allerretour a toujours la même valeur, c'est que tu y touches dans une partie du code que tu as caché ou alors que notre fonction empty() ne fait pas la même chose... Dans ce cas test directement :
if(isset($_POST['allerretour']))
       $allerretour = "Oui";
else 
       $allerretour = "Non";

Eva
Petit nouveau ! | 6 Messages

17 févr. 2010, 18:52

Je viens de me rendre compte que cette variable était également appelée dans un javascript (jquery). En le desactivant, la checkbox a effectivement bien fonctionnée :

Code : Tout sélectionner

jQuery(document).ready(function(){ $('#contactform').submit(function(){ var action = $(this).attr('action'); $("#message").slideUp(750,function() { $('#message').hide(); $('#submit') .after('<img src="assets/ajax-loader.gif" class="loader" />') .attr('disabled','disabled'); $.post(action, { depart: $('#depart').val(), arrivee: $('#arrivee').val(), date: $('#date').val(), heure: $('#heure').val(), allerretour: $('#allerretour').val(), miseadispo: $('#miseadispo').val(), duree: $('#duree').val(), protections: $('#protections').val(), bagages: $('#bagages').val(), nom: $('#nom').val(), societe: $('#societe').val(), adresse: $('#adresse').val(), codepostal: $('#codepostal').val(), ville: $('#ville').val(), telephone: $('#telephone').val(), email: $('#email').val(), commentaires: $('#commentaires').val(), fidelite: $('#fidelite').val(), facturation: $('#facturation').val(), conditions: $('#conditions').val() }, function(data){ document.getElementById('message').innerHTML = data; $('#message').slideDown('slow'); $('#contactform img.loader').fadeOut('slow',function(){$(this).remove()}); $('#contactform #submit').attr('disabled',''); if(data.match('success') != null) $('#contactform').slideUp('slow'); } ); }); return false; }); });
Visiblement, cette ligne ne convient pas :

Code : Tout sélectionner

allerretour: $('#allerretour').val(),

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 févr. 2010, 23:05

C'est un problème lié au fait que tu soumettes le formulaire en ajax et effectivement au niveau de ton javascript :)

En effet, lorsque tu fais appel à

Code : Tout sélectionner

$('#allerretour').val()
jQuery te retourne la valeur de l'élément dont l'id est "allerretour" (que la case soit cochée ou non), tu récupères donc à chaque la valeur "AR". Pour savoir si la case est cochée avec jQuery tu peux utiliser :

Code : Tout sélectionner

$('#allerretour').is(':checked')
qui te renverra alors true ou false en fonction du résultat.
A vérifier, mais je pense que tu peux le faire également comme ceci :

Code : Tout sélectionner

$('#allerretour').checked

@Skikit : dans un mode d'envoi classique du formulaire, quelque soit les valeurs de tes checkbox, celles-ci ne sont transmises que lorsqu'elles sont cochées (si aucune valeur n'est spécifiée pour la case, c'est la chaine "on" qui est transmise lorsqu'elle est cochée ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eva
Petit nouveau ! | 6 Messages

18 févr. 2010, 00:55

Merci Ryle ;)

En fait, les 2 syntaxes :

Code : Tout sélectionner

$('#allerretour').is(':checked')
et

Code : Tout sélectionner

$('#allerretour').checked
ne fonctionnent pas dans le sens où elles désactivent totalement les effets Ajax du formulaire. Mais il y a une bonne nouvelle, c'est que la 1ere proposition a le mérite de me transmettre l'info de la checkbox (cochée ou non cochée), alors que la 2nde proposition me renvoie systématiquement la même valeur...Sans doute un probleme de syntaxe, mais je n'y connais rien en javascript :wink:

Eva

Eva
Petit nouveau ! | 6 Messages

18 févr. 2010, 03:57

Merci de votre aide à tous les 2 !

Pour info, voici une petite fonction qui m'a bien aidé :

Code : Tout sélectionner

function getCheckedValue(field) { field = $('#' + field) txt = "" for (i = 0; i < field.length; i++) { if (field[i].checked) { txt = field[i].value } } if (txt == "") { return "0" } else { return "1" } }
Maintenant, il n'y a plus qu'à déclarer mes variables sous la forme :

Code : Tout sélectionner

mavariable: getCheckedValue('mavariable'),
et le tour est joué !

Merci encore de votre aide !

Eva