2010-11-18 9 views
5

Estoy tratando de trabajar en un sitio web existente y he encontrado un error, pero no estoy seguro de por qué es un error o cómo solucionarlo.Los elementos de la casilla de verificación HTML solo se envían si están marcados?

El sitio web básicamente enumera algunas propiedades comerciales que se alquilan en una ciudad. Hay una clase que toma los listados de la base de datos y crea un objeto de cada uno. En cada objeto hay una matriz de imágenes que están asociadas con esa propiedad.

Cuando el usuario edita una lista, obtiene una página de edición que tiene una lista de las imágenes y una casilla de verificación "eliminar" junto a ellas. Todas las casillas de verificación tienen el mismo nombre, por lo que cuando se vuelven a enviar al servidor, la aplicación obtiene una matriz de las imágenes que se eliminarán.

Lo que se supone que sucede, es que la aplicación tiene esta matriz de valores on/off (donde on = delete) y el índice de cada valor en la matriz corresponde al índice de una imagen en el objeto de la lista cuando uno de los valores está "on", el nombre de archivo en la matriz de imágenes correspondiente a ese valor "on" se elimina del sistema de archivos, y esa imagen se elimina de la base de datos.

Sin embargo, cuando se envía el formulario, la aplicación obtiene una matriz indexada en 0 de solo las casillas marcadas. Así que si me puse tres imágenes arbitrarias para su eliminación, la aplicación tendría

 
Array { 
    [0] => "on", 
    [1] => "on", 
    [2] => "on" 
} 

Obviamente, esto no funciona, se eliminarán las 3 primeras imágenes en la lista independientemente de qué casillas de verificación se establecen.

¿Cómo puedo solucionar esto? Me gustaría evitar nombrar cada casilla de verificación (delete_1, delete_2, delete_3, etc.) ya que el sistema ya está diseñado para funcionar con todas las casillas que tienen el mismo nombre. ¿Hay alguna manera de forzar que todas las casillas de verificación se envíen con "activado" o "desactivado"?

Respuesta

5

No, no se puede forzar casillas sin marcar que se presentará, pero se puede déles valores únicos (en lugar de "on" para todos) para determinar cuáles se verifican sin cambiar los nombres.

+0

Awesome, no sabía que podía hacer ese. Muchas gracias (lo aceptaré cuando esté permitido) –

+0

omg, es una solución terrible y definitivamente no es una respuesta a la pregunta. – zerkms

+2

@Steve Quería evitar nombrarlos de manera diferente, ya que eso tendría que cambiar el comportamiento del back-end. Sin embargo, no me di cuenta de que podría enviar un valor que no sea "activado" ni "desactivado"; esto requeriría cambios mínimos –

6

No hay manera a la fuerza, pero sólo podría añadir un derecho oculto antes de casilla con el mismo nombre y el valor necesario:

<input type="hidden" name="delete[42]" value="off" /> 
<input type="checkbox" name="delete[42]" value="on" /> 
+2

Lo siento, estaba tratando de evitar tener diferentes na mes para cada casilla de verificación. Actualmente, todos se llaman simplemente 'eliminar' y la aplicación los recibe como una matriz. No creo que esta técnica funcione con todos ellos teniendo el mismo nombre –

+0

@ Carson Myers: como dije, se podía dar el ** mismo nombre ** a la casilla de verificación. No está claro qué nombres tiene ''. ¿Es mejor? – zerkms

+0

@ Carson Myers: "No creo que esta técnica funcione", ¿por qué no lo intentas? ;-) – zerkms

1

Si realmente desea devolver una matriz de ons y offs, tendrá que adjuntar una función al formulario que examinará todas las casillas de verificación con el nombre y colocará sus valores en la matriz .

En jQuery esto sería algo como ...

$('#yourForm').submit(function(){ 
    var array = new Array(); 
    $('input[name="nameOfCheckboxes"]').each(function(index){ 
     array[index] = $(this).value(); 
    } 
    var r = $.param(array); 
    $('#someHiddenFieldInForm').value(r); 
} 

(código no se ha probado, por supuesto)

+2

+1 para una solución válida, pero javascript parece excesivo para este problema –

+0

Javascript, ¿de verdad? – Stephen

+0

¿De verdad no tienes nada mejor que hacer que quejarse? Carson pidió una solución que no requiriera cambiar la "funcionalidad" existente. Su pregunta no era clara sobre cuánto estaba dispuesto a cambiar, y el uso de JavaScript no requería cambios en el código existente. – Jeremy

1

Usted podría resolver esto añadiendo la siguiente jQuery:

$(function() { 
    $("#myform").submit(function(){ 
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off"); 
    }); 
}); 

myform siendo el ID de su formulario y delete siendo el nombre de las casillas de verificación.

+1

Consideré brevemente el uso de javascript, pero me pareció excesivo en la situación. La respuesta aceptada a esta pregunta implicó cambiar 'foreach ($ listing ['delete'] as $ index => $ state)' a 'foreach ($ listing ['delete'] as $ index)', que creo que es el ideal solución para mí +1 para una solución válida, aunque –

+0

Gert, como la tuya mejor que la mía. +1 – Jeremy

+1

Javascript es una solución de hackeo. – Stephen

1

La solución de Fred Nurk es buena y la superé. Personalmente, cuando he tenido esta situación, siempre les he dado diferentes nombres a los campos. Utilizo un prefijo común, seguido de un guión bajo para que sea fácil de reconocer, y luego algún tipo de identificación. Con frecuencia crearé un conjunto de campos con el mismo patrón, como "nombre_1", "cantidad_1", "foobar_1", "nombre_2", "cantidad_2", etc.Es bastante fácil recorrer los campos y separar estos nombres. (En Java, solo indexOf ('_').)

0

A la inversa, este problema es aceptar una rareza de formularios HTML y capturarlo con una variable local que emplea ternary operators durante la declaración.

Por ejemplo, dada una casilla de verificación

<input type="checkbox" name="notify_users" id="notify_cb"> 

Puede procesar el post como este, independientemente de la inclusión del valor casilla:

// normal boolean value  
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on');  
// explicitly set a 1 or 0 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 1 : 0); 
// explicitly set 'yes' or 'no' 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 'yes' : 'no'); 

En mi cuenta que es preferible añadir Javascript adicional para el cliente, aunque sea porque es un poco menos para mantener (y podría decirse que es más claro para un sucesor/otro desarrollador que entienda lo que está pasando)

Cuestiones relacionadas