Vifito_Filter_Unhyphenate, un filtro de ZF para arrays

A potencia que ofrecen os arrays en PHP non está dispoñible en Javascript. En ocasións vémonos obrigados a facer verdadeiros quebracabezas a hora de transportar datos entre cliente e servidor se traballamos con formularios dinámicos. Co termo "formularios dinámicos" refírome a ese tipo de formularios que poden variar o seu número de campos no lado cliente antes de que sexan enviados. Por exemplo unha situación típica son as liñas dunha factura, os ítems dun pedido, ...

Un exemplo aclarará o que pretendo dicir. Partimos do seguinte formulario:

<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 non presentan ningún problema para ser procesados dende PHP (os datos estarán dispoñibles no array $_REQUEST[nome][]), ou para traballar con identificadores javascript (document.getElementById('nome-1') para recuperar un elemento en concreto).

A complicación aparece cando queremos ter unha identificación a nivel de fila tanto no lado cliente como no servidor, entón o código debería incluir no índice do array o identificador correspondente:

<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="" />
...

O funcionamento seguiría sendo válido e funcional, pero estaríamos tendo unha sintase duplicada, tendo en conta que con id="nome-1" é o mesmo que name="nome[1]". Ademáis complicaríase o código javascript na xeración de campos dinámica, xa tería que ter en conta as dúas situacións.

Vexamos agora outro código que almacena información que pode ser enviada ao servidor pero que non emprega formularios:

<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 podería ser un menú dinámico, unha lista "sortable", unha árbore, ... que mediante javascript permitise o mantemento da metainformación. Para este caso interesaríame enviar nunha petición Ajax os datos serializados empregando como claves os identificadores (person-1=...&person-2=...&person-3=...) e no servidor dispoñer dunha estructura PHP máis manexable.

Facendo uso do filtro Vifito_Filter_Unhyphenate será posible transformar estes envíos en estructuras máis manexables dende código PHP. Para un dato enviado nunha petición POST tal que:

$_POST['contenedor-subcont-otro-10-2'] => 'mi valor'

será convertido nun array coas claves aniñadas en función dos guións:

$array['contenedor']['subcont']['otro'][10][2] => 'mi valor'

Está dispoñible o código fonte para a súa descarga que inclúe un exemplo de uso con jQuery.

Uso

require 'Zend/Filter/Interface.php'; 
require './Vifito/Filter/Unhyphenate.php'; 
$filter = new Vifito_Filter_Unhyphenate(); 
$data = $filter->filter($_POST);

 

Decargar

Descargar

 

OLLO!

Para que o exemplo funcione é preciso ter no include_path configurado Zend Framework, noutro caso dará un erro informando que non atopa Zend_Filter_Interface.

Última actualización 2012-08-16
12:35 AM (Europe/Madrid)
Data de creación 2011-01-09
7:59 PM (Europe/Madrid)
Implementación dun filtro de Zend Framework para transformar un array con claves separadas por guións nun array anidado
php zendframework

Relacionados