2009-07-15 11 views
12

Ho la seguente casella di selezione multipla in un modulo HTML, in cui l'utente può selezionare una o più opzioni.Come POST vuotare <selezionare .. più> elementi HTML se vuoto?

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

Quando l'utente seleziona alcuna opzione, il modulo è inviato ad un backend PHP ma crea alcun valore dell'array vuoto per $ _POST [ 'eng_0'] come se il campo non era nemmeno nel modulo.

Questo è un po 'come la casella di controllo deselezionata che non è stato presentato problema.

C'è un modo per averlo POST l'oggetto selezionato anche se non esiste un'opzione selezionata? Può essere in jQuery se questo aiuta.

+4

Sì, l'HTML non invia elementi "non riusciti" (che include caselle di selezione senza selezione, pulsanti di opzione senza uno selezionato e caselle di controllo deselezionate). – Powerlord

+0

La domanda è in realtà poco chiara, perché puoi controllare il valore con 'isset ($ _ POST ['eng_0'])' .. Cosa intendi * per POST la selezione anche se non ci sono opzioni selezionate *? – jolt

+0

Come nota a margine, sembra che anche selezionare che non siano "multiple" può avere questo comportamento e non essere inviato, se hanno "nessun valore" selezionato. Ad esempio, se esegui questo javascript 'document.getElementById ('select_id'). Value = 'a non option';' (in genere non è un problema con il normale input da parte dell'utente dato che non è possibile selezionare nulla da un menu a discesa). Ho solo pensato di menzionarlo :) – rogerdpack

risposta

19

Se il modulo viene generata dinamicamente , potresti includere un elemento modulo nascosto con lo stesso nome che contiene un valore fittizio. Quindi, ignora semplicemente il valore fittizio, se il valore che ottieni per tale variabile è ['dummy_value'], allora puoi considerarlo come "nulla selezionato" nel codice.

12

C'è un motivo per cui non è possibile considerare la situazione in cui l'array non è impostato come se fosse stato inviato senza contenuti?

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

EDIT:

Aggiungi un campo nascosto ogni volta che è presente nel modulo multiplo selezionare:

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

Poi controllare:

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

Non so se l'array non è stato inviato perché: 1) L'utente non ha scelto alcuna opzione 2) Il controllo non era nemmeno lì sul modulo (il modulo è stato generato in modo dinamico, utilizzando un algoritmo abbastanza complesso). Questi sono due diversi scenari per me e vorrei essere in grado di dire cosa sta succedendo. – Vincent

3

È possibile aggiungere un - selezionare - inserire e preselezionarlo.

<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

No, è una pessima idea! perché l'utente può opzione deselezionata con il tasto CTRL! –

+0

Cosa succede se si desidera deselezionare tutto? Utilizzi anche alcuni javascript per riselezionare l'opzione _empty? Immagino anche che l'uso di abbellimenti come Select2 o Chosen visualizzerà l'opzione vuota in qualche modo –

1

E se anche quando l'utente lo seleziona, nulla sulla selezione arriva in $ _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> 

Quando eseguo print_r ($ _ POST); dall'altra parte l'output è semplicemente: Array ([acao] => add [id] => 3) e nessun segno del tag select, anche quando cambio il valore sull'altro lato;

0

se non c'è $ _POST, pubblicare una stringa vuota (niente) è assolutamente la soluzione più semplice.

Ecco la mia soluzione per un modulo con un <select name="related[]" multiple>

sufficiente aggiungere la seguente riga nella sezione php che gestisce la memorizzazione del modulo:

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

Non sempre utilizzabile! –

1

aggiungere qualcosa di simile

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

0

Includere <input type="hidden" name="yourfield" value="" /> nel modulo in cui il nome è uguale a quello selezionato per multiple="multiple".


È spiacevole che i browser non inviare parametri modulo vuoto per multiple="multiple" seleziona come fanno per non più di selezionare o un normale ingressi.

L'utilizzo di un valore fittizio come proposto nella risposta accettata non è una soluzione molto pulita.

(Questa domanda non ha nulla a che fare con jQuery)

0

Se si aggiunge un ingresso nascosto prima l'elemento di selezione multipla, invierà il valore di ingresso nascosta se nessuno dei molteplici elementi selezionati sono stati selezionati. Non appena si seleziona un'opzione, invece, viene utilizzato quel valore selezionato.

questo modo sono in grado di distinguere 2 scenari differenti in laravel/php, essendo:

  • impostare tutti myitems a svuotare (richiede l'input nascosto, così PHP riceve una stringa vuota per myitems)
  • aggiornare altre proprietà del modello senza toccare myitems (quindi escludendo ogni myitems ingresso formano il modulo. PHP non riceverà la chiave myitems)

Codice esempio:

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