2011-11-02 9 views
12

Problemas para hacer que mis matrices de POST muestren todos los valores de casilla de verificación de mi formulario.Matrices de POST que no muestran casillas de verificación

Tengo una forma de configurar como sigue:

<form name='foo' method='post' action=''> 
    <table> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
     <tr> 
      <td class='bla'>Checkbox: <input type='checkbox' name='cBox[]'/></td> 
     </tr> 
    </table> 
</form> 

tengo un botón en la parte inferior unida a una función jquery que añade 5 filas más vacíos a la forma (por lo tanto las matrices para el nombre de entrada cBox []).

Ahora, el problema. Digamos que la primera casilla de verificación está desmarcada, y las últimas 2 están marcadas. Cuando me los valores de salida (usando PHP print_r para depuración), que conseguirán:

Array ([0] => on [1] => on) 

Por alguna razón, la matriz no contiene ningún valor para casillas sin marcar.

He visto algunas soluciones donde se pasa una variable oculta con cada casilla, pero ¿se puede implementar esta solución en mi situación (usando matrices)?

+0

suena bastante simple .. Lo intentaré :) gracias – SpaghettiMonster

+0

desafortunadamente todavía no estoy obteniendo los valores sin verificar. gracias aunque – SpaghettiMonster

+0

me di cuenta de que mi comentario anterior fue motivado por una comprensión totalmente errónea de su pregunta por mi parte. He agregado una respuesta adecuada a continuación. – Jon

Respuesta

16

Ese comportamiento no es sorprendente, ya que el navegador no envía ningún valor para las casillas que están desmarcadas.

Si se encuentra en una situación en la que necesita enviar un número exacto de elementos como una matriz, ¿por qué no hace lo mismo cuando hay un id de algún tipo asociado a cada casilla de verificación? Basta con incluir el nombre clave de la matriz PHP como parte del nombre del elemento <input>:

<tr> 
                 <!-- NOTE [0] ---> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[0]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[1]'/></td> 
    </tr> 
    <tr> 
     <td class='bla'>Checkbox: <input type='checkbox' name='cBox[2]'/></td> 
    </tr> 

Eso todavía le deja con el problema de que las cajas sin marcar, todavía no estarán presentes en la matriz. Eso puede o no ser un problema. Por un lado, es posible que realmente no le importe:

foreach($incoming as $key => $value) { 
    // if the first $key is 1, do you care that you will never see 0? 
} 

Incluso si no le importa, puede solucionar fácilmente el problema. Dos enfoques directos aquí. Uno, acaba de hacer el truco oculto elemento de entrada:

<tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[0]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[0]'/> 
     </td> 
    </tr> 
    <tr> 
     <td class='bla'> 
     <input type="hidden" name="cBox[1]" value="" /> 
     Checkbox: <input type='checkbox' name='cBox[1]'/> 
     </td> 
    </tr> 

Y dos, que me parece preferible, llenar los espacios en blanco de PHP en su lugar:

// assume this is what comes in: 
$input = array(
    '1' => 'foo', 
    '3' => 'bar', 
); 

// set defaults: array with keys 0-4 all set to empty string 
$defaults = array_fill(0, 5, ''); 

$input = $input + $defaults; 
print_r($input); 

// If you also want order, sort: 

ksort($input); 
print_r($input); 

See it in action.

+0

Gracias Jon. Veré esta solución. Mi única preocupación son los nombres únicos. Tengo un número desconocido de entradas, ya que se agregan con jquery .clone(). Además, su enlace no funciona, ¿puede usar un acortador de url? – SpaghettiMonster

+1

@SpaghettiMonster: Enlace fijo (copiado fallido). Incluso si es clonado, puede encadenar un par de métodos adicionales de jQuery para establecer el nombre una vez que se haya hecho el clon. – Jon

+0

Gracias Jon. Agregué algunas líneas más de jQuery para contar el número de filas existentes y usar esto para incrementar las posiciones de la matriz, y utilicé el código anterior. Funciona 100% a la perfección! :) – SpaghettiMonster

2

Trate

<input type='checkbox' value="XXX" name='cBox[]'/> 
<input type='checkbox' value="YYY" name='cBox[]'/> 
<input type='checkbox' value="ZZZ" name='cBox[]'/> 

Las casillas de verificación funciona de esa manera. Si está marcado, solo se publicará el valor.

+0

Intenté esto, y el resultado que obtengo es: Array ([0] => YYY [1] => ZZZ). Lamentablemente, no puedo dar a cada entrada valores únicos ya que se pueden agregar dinámicamente a través de la función jquery de la que hablé. – SpaghettiMonster

+1

Bien, entonces reemplace YYY, ZZZ con los valores que necesita. Luego solo verifique, si $ _POST ['cBox'] (que es una matriz) contiene los valores necesarios. –

0

Intente establecer un valor para cada casilla, de 1 o verdadero.

<input type='checkbox' value='1' name='cBox[1]'/> 

¿por qué no está enviando nada?

4

ONE TRICK debe anular el valor de la casilla de verificación, si está seleccionada. de lo contrario, su valor será 0.

<form> 
    <input type='hidden' value='0' name="smth"> 
    <input type='checkbox' value='1' name="smth"> 
</form> 
+0

Si bien su lógica es cierta, esto no responde a la pregunta porque si usted tiene una matriz que entonces foreach con par de claves será incorrecta –

1

Si usted está manejando gama casilla de verificación dinámica, puede intentar esto:

HTML:

<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<label> 
    <input type="hidden" name="cBox[]" value="" /> 
    <input type="checkbox" class="checkbox" value="on" /> 
</label> 
<!-- extend --> 

Javascript (jQuery):

$(document).on("change", "input.checkbox", function() { 

    var value = $(this).is(":checked") ? $(this).val() : null; 

    $(this).siblings("input[name='cBox[]']").val(value);  
}); 

resultado backend (Si sólo se marcó el segundo):

// PHP $_POST['cBox'] 
Array 
(
    [0] => 
    [1] => on 
) 

En este implemento, las casillas de verificación se utilizan para controlar cada entrada oculta en un grupo.

Para mostrar la página, puede representar cada par de entradas asignando el valor en entradas ocultas y marcando casillas de verificación como checked.

+0

Realy help full ... Thank you !! –

+0

Me alegra oír eso :) –

Cuestiones relacionadas