2009-07-15 7 views
12

J'ai la boîte multi-sélection suivante dans un formulaire HTML, où l'utilisateur peut sélectionner une ou plusieurs options.Comment POSTER des éléments HTML <select .. multiple> vides s'ils sont vides?

<select id="eng_0" name="eng_0[]" multiple size="3"> 
    <option value="Privilégier">Privilégier</option> 
    <option value="Accepté">Accepté</option> 
    <option value="Temporaire">Temporaire</option> 
</select> 

Lorsque l'utilisateur sélectionne aucune option, le formulaire est affecté à un back-end PHP mais il ne crée aucune valeur de tableau vide pour $ _POST [ « eng_0 »] comme si le champ était même pas sur la forme.

Cela ressemble un peu à la case non cochée qui ne pose pas de problème.

Est-il possible de faire POSTER l'objet SELECT même s'il n'y a pas d'option sélectionnée? Il peut être dans jQuery si cela aide.

+4

Oui, HTML n'envoie pas des éléments qui ne sont pas « réussi » (qui comprend les zones de sélection sans sélection, boutons radio sans plage sélectionnée, et non vérifiées) des cases à cocher. – Powerlord

+0

La question n'est pas claire, parce que vous pouvez contrôler la valeur avec 'isset ($ _ POST ['eng_0'])' .. Que voulez-vous dire par * POST la sélection même s'il n'y a pas d'option sélectionnée *? – jolt

+0

En remarque, il semble que même les sélections qui ne sont pas "multiples" peuvent avoir ce comportement et ne pas être soumises, si elles n'ont pas de "valeur" sélectionnée. Par exemple, si vous avez exécuté ce fichier javascript 'document.getElementById ('select_id'). Value = 'une non option';' (typiquement, il n'y a pas de problème avec une entrée utilisateur normale puisqu'ils ne peuvent rien sélectionner dans une liste déroulante). Je pensais que je le mentionnerais :) – rogerdpack

Répondre

19

Si votre formulaire est généré dynamiquement , vous pouvez inclure un élément de formulaire caché avec le même nom qui contient une valeur factice. Ensuite, ignorez simplement la valeur fictive, si la valeur que vous obtenez pour cette variable est ['dummy_value'] alors vous pouvez traiter cela comme signifiant «rien sélectionné» dans votre code.

12

Y a-t-il une raison pour laquelle vous ne pouvez pas traiter la situation où le tableau n'est pas défini comme s'il était envoyé sans contenu?

if (!isset($_POST['eng_0'])) 
    $_POST['eng_0'] = array(); 

EDIT:

Ajouter un champ masqué à chaque fois que le multiple sélectionnez est présent dans votre formulaire:

<input type="hidden" name="eng_0_exists" value="1"/> 

vérifier ensuite:

if (!isset($_POST['eng_0']) && isset($_POST['eng_0_exists'])) 
    $_POST['eng_0'] = array(); 
+0

Je ne sais pas si le tableau n'a pas été soumis parce que: 1) L'utilisateur n'a choisi aucune option 2) Le contrôle n'était même pas là sur le formulaire (le formulaire est généré dynamiquement, en utilisant un algorithme assez complexe). Ce sont deux scénarios différents pour moi et je voudrais être en mesure de dire ce qui se passe. – Vincent

3

Vous pouvez ajouter un - veuillez sélectionner - entrée et présélectionner.

<select id="eng_0" name="eng_0[]" multiple size="3"> 
    <option value="nothing" selected="selected">- please select -</option> 
    <option value="Privilégier">Privilégier</option> 
    <option value="Accepté">Accepté</option> 
    <option value="Temporaire">Temporaire</option> 
</select> 
+1

Non, c'est une très mauvaise idée! car l'utilisateur peut désélectionner l'option avec la touche CTRL! –

+0

Et si vous voulez tout désélectionner? Utilisez-vous ensuite du javascript pour resélectionner l'option _empty? Je suppose également que l'utilisation d'embellisseurs tels que Select2 ou Chosen affichera l'option vide en quelque sorte –

1

si même lorsque l'utilisateur sélectionne, rien sur la sélection arrive dans le $ _POST?

  <form action="cart.php" method="POST"> 
       <input type="hidden" id="acao" name="acao" value="add" /> 
       <input type="hidden" id="id" name="id" value="<?=$cnt->cnt_codigo?>" /> 
       <?php 
        $resOpc = mysql_query("SELECT * FROM loja_opcionais ORDER BY descricao")or die(mysql_error()); 
        if(mysql_num_rows($resOpc) > 0){ 
       ?> 
       <select id="opcional" nome="opcional"> 
        <?php 
         while($opc = mysql_fetch_object($resOpc)){ 
        ?> 
        <option value="<?=$opc->descricao?>"><?=$opc->descricao?></option> 
        <?php 
         } 
        ?> 
       </select> 
       <?php 
        } 
       ?> 
       <button class="botao" type="submit">Adicionar ao Carrinho</button> 
      </form> 

Lorsque je fais print_r ($ _ POST); de l'autre côté, la sortie est simplement: Array ([acao] => add [id] => 3) et aucun signe de la balise select, même lorsque je change la valeur de l'autre côté;

0

s'il n'y a pas de $ _POST, Post une chaîne vide (rien) est absolument la solution la plus simple.

Voici ma solution pour un formulaire avec un <select name="related[]" multiple>

il suffit d'ajouter la ligne suivante dans la section php qui gère le stockage de votre formulaire:

if (!isset($_POST['related'])) $_POST['related']=""; 
+2

Pas toujours utilisable! –

1

Ajouter quelque chose comme

$("#field").change(function() { 
 
     if (($("#field").val() || []) == "") $("form").append("<input type='hidden' name='field' value=''>"); 
 
    });

0

Incluez <input type="hidden" name="yourfield" value="" /> à votre formulaire dont le nom est le même que celui de votre sélection multiple="multiple".


Il est regrettable que les navigateurs n'envoient pas des paramètres de formulaire vides pour multiple="multiple" sélectionne comme ils le font pour non-sélectionne multiples ou une entrée normale. L'utilisation d'une valeur fictive comme proposé dans la réponse acceptée n'est pas une solution très propre.

(Cette question n'a rien à voir avec jQuery)

0

Si vous ajoutez une entrée cachée avant multiple élément select, il envoie la valeur d'entrée cachée si aucun des multiples éléments de sélection ont été sélectionnés. Dès que vous sélectionnez une option, cette valeur sélectionnée est utilisée à la place.

De cette façon, je suis en mesure de distinguer 2 scénarios différents Laravel/php, étant:

  • Définir tout myitems à vide (nécessitant l'entrée cachée, si PHP reçoit une chaîne vide pour myitems)
  • Mettre à jour les autres propriétés du modèle sans toucher myitems (excluant ainsi toute entrée myitems forment la forme. PHP ne recevra pas la clé myitems)

Exemple de code:

<input type="hidden" name="myitems" value="" /> 
<select name="myitems[]" multiple> 
    <option value="1">Foo</option> 
    <option value="2">Bar</option> 
</select> 
Questions connexes