2012-02-08 23 views
12

Tengo que manejar un formulario generado por una tercera parte. Este formulario proporciona algunos atributos de "selección múltiple" de casillas de verificación. Pero los nombres de entrada son idénticos, y PHP $ _POST no puede manejar claves idénticas (solo se manejan los últimos datos).Cómo seleccionar todas las entradas que tienen el mismo nombre e indexarlas por su nombre

Aquí se muestra un ejemplo de la forma:

<form> 
    <input type="checkbox" name="attr1" value="1" /> 
    <input type="checkbox" name="attr1" value="2" /> 
    <input type="checkbox" name="attr1" value="3" /> 
    <input type="checkbox" name="attr1" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3" value="a" /> 
    <input type="checkbox" name="attr3" value="b" /> 
    <input type="checkbox" name="attr3" value="c" /> 
    <input type="checkbox" name="attr3" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

me gustaría analizar todas las entradas de casilla de verificación, obtener único grupo de mismas entradas de nombre, y anexar "[]" a su nombre ...

Lo que yo quiero llegar después del procesamiento de jQuery:

<form> 
    <input type="checkbox" name="attr1[]" value="1" /> 
    <input type="checkbox" name="attr1[]" value="2" /> 
    <input type="checkbox" name="attr1[]" value="3" /> 
    <input type="checkbox" name="attr1[]" value="4" /> 
    <input type="checkbox" name="attr2" value="xx" /> 
    <input type="checkbox" name="attr3[]" value="a" /> 
    <input type="checkbox" name="attr3[]" value="b" /> 
    <input type="checkbox" name="attr3[]" value="c" /> 
    <input type="checkbox" name="attr3[]" value="d" /> 
    <input type="text" name="attr4" value="" /> 
</form> 

¿hay una manera de identificar grupo de entradas con el mismo nombre?

+0

¿Hay alguna razón que está haciendo esto con JavaScript y no modifica el marcado directamente? Supongo que no te importa alienar a los usuarios con JS deshabilitados, ¿correcto? –

+0

Este formulario HTML es proporcionado por una tercera parte (XML transformado por XSL) y no quiero modificar el XSL proporcionado (está versionado y lo obtengo de un servicio web). Y tiene razón, no trato con usuarios discapacitados de JS (no es un sitio web público, sino una aplicación de servicio en línea). – AlterPHP

Respuesta

19

Esto anexará [] al nombre de cada casilla de verificación si existe otro elemento con el mismo nombre.

var name_map = {}; 
$("input[type=checkbox]") // for all checkboxes 
    .each(function() { // first pass, create name mapping 
     var name = this.name; 
     name_map[name] = (name_map[name]) ? name + "[]" : name; 
    }) 
    .each(function() { // replace name based on mapping 
     this.name = name_map[this.name]; 
    }); 

Demostración: http://jsfiddle.net/gnfsG/

+0

¡No está nada mal! +1 para una solución simple :) – Stefan

+0

¡Gracias, eso es exactamente lo que necesitaba! – AlterPHP

+0

@ PéCé De nada. –

4

Prueba esto:

var group = $('input[name="attr1"]'); 

if (group.length > 1){ 
    group.each(function() { 
     $(this).attr("name",$(this).attr("name")+"[]"); 
    }); 
} 
+0

Quiero hacer coincidir solo las entradas que tengan hermanos con el mismo nombre, no todas las entradas. No sé si es realmente posible ... – AlterPHP

+0

¿Puede explicar esto en detalle? ¿Como solo casilla de verificación? En mi respuesta, estoy cambiando el nombre de solo el control de casilla de verificación usando el selector ': checkbox'. –

+0

Quería cambiar el nombre, SOLAMENTE si la entrada tiene un hermano con el mismo nombre. Es por eso que su solución no es perfecta;) – AlterPHP

0

Usted tendrá que utilizar $('input[name^="attr"]') en su caso. Como sus artículos tienen attr1, attr2, attr3 etc. El selector anterior coincidirá con todos.

Esto se puede comprobar en la acción @http://jsfiddle.net/cT78Y/2/

$('input[name^="attr"]:checkbox').each(function(i){ 
    $(this).attr("name",$(this).attr("name")+"[]"); 
}); 

Esto le dará.

<form> 
    <input type="checkbox" name="attr1[]" value="1"> 
    <input type="checkbox" name="attr1[]" value="2"> 
    <input type="checkbox" name="attr1[]" value="3"> 
    <input type="checkbox" name="attr1[]" value="4"> 
    <input type="checkbox" name="attr2[]" value="xx"> 
    <input type="checkbox" name="attr3[]" value="a"> 
    <input type="checkbox" name="attr3[]" value="b"> 
    <input type="checkbox" name="attr3[]" value="c"> 
    <input type="checkbox" name="attr3[]" value="d"> 
    <input type="text" name="attr4" value=""> 
</form> 

Espero que te ayude.

0

Ésta es una solución muy largo

var array =[]; 
       $('input[type="checkbox"]').each(function(){ 
        array.push($(this).attr('name')); 
       }); 

       var sorted_arr = array.sort(); // You can define the comparing function here. 
       // JS by default uses a crappy string compare. 
       var results = []; 
       for (var i = 0; i < array.length - 1; i++) { 
        if (sorted_arr[i + 1] == sorted_arr[i]) { 
         results.push(sorted_arr[i]); 
        } 
       } 
       var names = []; 
       names = jQuery.unique(results); 
       $.each(names ,function(key,value){ 
        $('input[name ="'+value+'"]').attr("name",value+"[]"); 
       }); 
0
$("input[name=attr\\[\\]]"); 

obtener toda la entrada donde nombre = attr[]

Cuestiones relacionadas