La potencia que ofrecen los arrays en PHP no está disponible en Javascript. En ocasiones nos vemos obligados a hacer malabares a la hora de transportar datos entre el lado cliente y el lado servidor si trabajamos con formularios dinámicos. Con el término "formularios dinámicos" quiero hacer referencia a ese tipo de formularios que pueden variar su número de campos en el lado cliente antes de que sean enviados. Por ejemplo una situación típica son las líneas de una factura, los ítems de un pedido, ...
Un ejemplo aclarará lo que pretendo decir. Partimos del siguiente formulario:
1 2 3 4 5
|
<input type="text" id="nome-1" name="nome[]" value="" /> <input type="text" id="nome-2" name="nome[]" value="" /> <input type="text" id="nome-3" name="nome[]" value="" /> <input type="text" id="nome-4" name="nome[]" value="" /> ...
|
Estes campos no presentan ningún problema para ser procesados desde PHP (los datos estarán disponibles en el array $_REQUEST[nome][]), o para trabajar con identificadores javascript (document.getElementById('nome-1') para recuperar un elemento en concreto).
La complicación aparece cuando queremos tener una identificación a nivel de fila tanto en el lado cliente como en el servidor, entonces el código debería incluir en el índice del array el identificador correspondiente:
1 2 3 4 5
|
<input type="text" id="nome-1" name="nome[1]" value="" /> <input type="text" id="nome-7" name="nome[7]" value="" /> <input type="text" id="nome-12" name="nome[12]" value="" /> <input type="text" id="nome-40" name="nome[40]" value="" /> ...
|
El funcionamiento seguiría siendo válido y funcional, pero estaríamos teniendo una sintáxis duplicada, teniendo en cuenta que con id="nome-1" es lo mismo que name="nome[1]". Además se complicaría el código javascript en la generación de campos dinámica, ya tendría que tener en cuenta las dos situaciones.
Veamos ahora otro código que almacena información que puede ser enviada al servidor pero que no emplea formularios:
1 2 3 4 5 6
|
<ul> <li id="person-1">Manuel ... #1</li> <li id="person-2">Perico ... #2</li> <li id="person-3">Lucas ... #3</li> <li id="person-4">Agapito ... #4</li> </ul>
|
Esta estructura podría ser un menú dinámico, una lista "sortable", un árbol, ... que mediante javascript permitiese el mantemiento de la metainformación. Para este caso me interesaría enviar en una petición Ajax los datos serializados empleando como claves los identificadores (person-1=...&person-2=...&person-3=...) y en el servidor disponer de una estructura PHP más manejable.
Haciendo uso del filtro Vifito_Filter_Unhyphenate será posible transformar estes envíos en estructuras más manejables desde código PHP. Para un dato enviado en una petición POST tal que:
1
|
$_POST['contenedor-subcont-otro-10-2'] => 'mi valor'
|
será convertido en un array con las claves anidadas en función de los guiones:
1
|
$array['contenedor']['subcont']['otro'][10][2] => 'mi valor'
|
En la sección de descargas está disponible el código fuente para descargar que incluye un ejemplo de uso con jQuery.