2009-07-15 10 views
12

Ich habe das folgende Auswahlfeld in einem HTML-Formular, in dem der Benutzer eine oder mehrere Optionen auswählen kann.Wie lege ich <select .. multiple> HTML Elemente leer?

<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> 

Wenn der Benutzer keine Option auswählt, wird das Formular an einen PHP-Backend POSTed aber es schafft keinen leeren Arraywert für $ _POST [ ‚eng_0‘], als ob das Feld im Formular nicht einmal war.

Dies ist ein bisschen wie das Kontrollkästchen deaktiviert, das kein Problem ist.

Gibt es eine Möglichkeit, das ausgewählte Objekt POST zu senden, selbst wenn es keine ausgewählte Option gibt? Es kann in jQuery sein, wenn das hilft.

+4

Ja, HTML sendet keine Elemente, die "nicht erfolgreich" sind (einschließlich Auswahlfeldern ohne Auswahl, Optionsfelder ohne eines ausgewählt und Kontrollkästchen deaktiviert). – Powerlord

+0

Die Frage ist eigentlich unklar, weil Sie den Wert mit 'isset ($ _ POST ['eng_0'])' 'steuern können .. Was meinst du * POST die Auswahl, auch wenn keine Option ausgewählt ist *? – jolt

+0

Als eine Randnotiz scheint es, dass sogar selektiert, die nicht "mehrfach" sind, dieses Verhalten haben und nicht übergeben werden können, wenn sie "keinen Wert" ausgewählt haben. Zum Beispiel, wenn Sie dieses Javascript 'document.getElementById ('select_id') ausgeführt haben. Value = 'a non option';' (ist normalerweise kein Problem mit einer normalen Benutzereingabe, da sie nichts aus einem Dropdown auswählen können). Ich dachte nur, ich würde es erwähnen :) – rogerdpack

Antwort

19

Wenn Ihr Formular dynamisch generiert Sie könnten ein verstecktes Formularelement mit demselben Namen einschließen, das einen Dummy-Wert enthält. Ignorieren Sie dann einfach den Dummy-Wert. Wenn der Wert für diese Variable ['dummy_value'] ist, können Sie dies als "nichts ausgewählt" in Ihrem Code behandeln.

12

Gibt es einen Grund, warum Sie die Situation nicht behandeln können, in der das Array nicht so eingestellt ist, als wäre es ohne Inhalt gesendet worden?

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

EDIT:

ein verstecktes Feld hinzufügen, wenn das mehrere wählen in Ihrer Form ist:

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

Dann überprüfen:

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

Ich weiß nicht, ob das Array nicht gesendet wurde, weil: 1) Der Benutzer keine Option 2) Die Kontrolle war nicht einmal auf dem Formular (das Formular wurde generiert) dynamisch, mit einem ziemlich komplexen Algorithmus). Das sind zwei verschiedene Szenarien für mich und ich würde gerne erzählen können, was vor sich geht. – Vincent

3

Sie können einen - bitte auswählen - Eintrag hinzufügen und ihn vorwählen.

<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

Nein, es ist eine sehr schlechte Idee! weil Benutzer mit CTRL-Taste nicht ausgewählt werden kann! –

+0

Was, wenn Sie alles abwählen möchten? Verwenden Sie dann auch etwas Javascript, um die Option _empty erneut auszuwählen? Ich schätze auch, dass die Verwendung von Verschönern wie Select2 oder Chosen die leere Option irgendwie anzeigt –

1

Was passiert, wenn der Benutzer selbst wählt, nichts über die Auswahl kommt in der $ _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> 

Wenn ich print_r ($ _ POST); auf der anderen Seite ist die Ausgabe einfach: Array ([acao] => add [id] => 3) und kein Vorzeichen des select-Tags, auch wenn ich den Wert auf der anderen Seite ändere;

0

Wenn es keine $ _POST gibt, ist das Posten einer leeren Zeichenkette (nichts) absolut die einfachste Lösung.

Hier ist meine Lösung für ein Formular mit einem <select name="related[]" multiple>

nur die folgenden Zeile in dem PHP-Abschnitt hinzuzufügen, die das Speichern von Formulargriffen:

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

Nicht immer verwendbar! –

1

hinzufügen so etwas wie

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

0

Fügen Sie <input type="hidden" name="yourfield" value="" /> zu Ihrem Formular hinzu, wo der Name der gleiche wie für Ihre multiple="multiple" select ist.


Es ist bedauerlich, dass Browser, wie sie für Nicht-Mehrfach wählt oder ein normalen Eingänge nicht tut leere Form Parameter für multiple="multiple" wählt senden.

Die Verwendung eines Dummy-Werts, wie in der akzeptierten Antwort vorgeschlagen, ist keine sehr saubere Lösung.

(Diese Frage hat nichts mit jQuery zu tun)

0

Wenn Sie einen versteckten Eingang vor das mehr select-Element hinzufügen, wird es den versteckten Eingabewert, wenn keine der mehr Elemente auswählen sendet ausgewählt wurde. Sobald Sie jedoch eine Option auswählen, wird dieser ausgewählte Wert stattdessen verwendet.

Auf diese Weise konnte ich zwei verschiedene Szenarien in Laravel/php unterscheiden, nämlich:

  • alle myitems Set zu leeren (die verdeckte Eingabe erfordern, so PHP eine leere Zeichenfolge für myitems empfängt)
  • aktualisieren Sie andere Eigenschaften des Modells ohne myitems zu berühren (so ohne jede myitems Eingabe die Form bilden. PHP wird nicht die myitems Schlüssel erhalten)

Beispielcode:

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