2009-07-15 7 views
12

Mam następujące pole wyboru wielokrotnego w formularzu HTML, w którym użytkownik może wybrać jedną lub więcej opcji.Jak POST puste <wybierz .. wiele> elementów HTML, jeśli puste?

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

Gdy użytkownik wybierze innego wyjścia, formularz jest wysyłany na backend PHP, ale nie tworzy pustą wartość tablicową dla $ _ POST [ „eng_0”] a jeśli pole nie było nawet na formularzu.

To jest trochę jak niezaznaczone pole wyboru, które nie jest zgłoszonym problemem.

Czy istnieje jakiś sposób, aby go POST wybrać obiekt, nawet jeśli nie ma wybranej opcji? Może być w jQuery, jeśli to pomaga.

+4

Tak, HTML nie wysyła elementów "nieudanych" (w tym pola wyboru bez wyboru, przyciski radiowe bez zaznaczonych i niezaznaczone pola wyboru). – Powerlord

+0

Pytanie jest w rzeczywistości niejasne, ponieważ możesz kontrolować wartość za pomocą 'isset ($ _ POST ['eng_0'])' .. Co masz na myśli *, aby POST wybrać, nawet jeśli nie ma wybranej opcji *? – jolt

+0

Na marginesie wydaje się, że nawet selekcje, które nie są "wielokrotne", mogą mieć to zachowanie i nie zostać przesłane, jeśli mają wybraną opcję "brak wartości". Na przykład, jeśli uruchomiłeś ten javascript 'document.getElementById ('select_id'). Value = 'a non option';' (zazwyczaj nie jest to problem z normalną ingerencją użytkownika, ponieważ nie mogą wybrać niczego z rozwijanego menu). Pomyślałem tylko, że o tym wspomnę :) – rogerdpack

Odpowiedz

19

Jeśli formularz jest generowany dynamicznie , możesz dołączyć ukryty element formularza o tej samej nazwie, który zawiera fałszywą wartość. Następnie po prostu zignoruj ​​fałszywą wartość, jeśli wartość dla tej zmiennej to ['dummy_value'], wówczas można to potraktować jako "nic nie wybrano" w kodzie.

12

Czy istnieje powód, dla którego nie można traktować sytuacji, w której tablica nie jest ustawiona tak, jakby została wysłana bez zawartości?

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

EDIT:

Dodaj ukryte pole, gdy jest obecny w postaci wielokrotnego wyboru:

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

Następnie sprawdzić:

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

Nie wiem, czy tablica nie została przesłana, ponieważ: 1) Użytkownik nie wybrał żadnej opcji 2) Kontrola nie była nawet w formularzu (formularz jest generowany dynamicznie, używając dość złożonego algorytmu). Są to dla mnie dwa różne scenariusze i chciałbym móc powiedzieć, co się dzieje. – Vincent

3

Możesz dodać - proszę wybrać - wpis i wstępnie go wybrać.

<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

Nie, to bardzo zły pomysł! ponieważ użytkownik może odznaczyć opcję klawiszem CTRL! –

+0

Co zrobić, jeśli chcesz odznaczyć wszystko? Czy używasz również niektórych javascript, aby ponownie wybrać opcję _empty? Domyślam się również, że używanie obiektów upiększających, takich jak Select2 lub Chosen, wyświetli pustą opcję w jakiś sposób. –

1

co, jeśli nawet jeśli użytkownik wybierze to, nic o wyborze nie pojawi się w $ _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> 

Kiedy robię print_r ($ _ POST); z drugiej strony wyjście to po prostu: Array ([acao] => add [id] => 3) i brak znaku znacznika select, nawet gdy zmieniam wartość po drugiej stronie;

0

jeśli nie ma $ _POST, pusty napis (nic) jest absolutnie najprostszym rozwiązaniem.

Oto moje rozwiązanie dla postaci z <select name="related[]" multiple>

wystarczy dodać następującą linię w sekcji php, który obsługuje przechowywanie formularza:

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

Nie zawsze można użyć! –

1

dodać coś takiego

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

0

Dołącz do formularza formularz <input type="hidden" name="yourfield" value="" />, który jest taki sam jak w przypadku wyboru.


Szkoda, że ​​przeglądarki nie wysyłać pustych parametrów Formularz multiple="multiple" wybiera jak robią dla non-wielu wybiera lub normalnych wejść.

Stosowanie wartości dummy w proponowanej odpowiedzi nie jest rozwiązaniem bardzo czystym.

(To pytanie nie ma nic wspólnego z jQuery)

0

Jeśli dodać ukryte wejście przed wielokrotnego wybrać elementu, to wyśle ​​ukryte wartości wejściowej, jeżeli żaden z kilku wybranych przedmiotów zostały wybrane. Jednak po wybraniu opcji używana jest zamiast niej wybrana wartość.

ten sposób udało mi się rozróżnić 2 różne scenariusze w laravel/php, będąc:

  • Ustaw wszystko myitems opróżnić (wymagające ukryte wejście, więc PHP odbiera pusty napis myitems)
  • aktualizować inne właściwości modelu bez dotykania myitems (a więc z wyłączeniem tworzyć dowolne wejście myitems formularz. PHP nie otrzyma klucz myitems)

Przykładowy kod:

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