Construir formularios (casi) automáticamente con PHP
Construir formularios html es una tarea bastante monótona y en la que es fácil cometer algún error tonto y puñetero así que tenía que haber una forma de hacerlos automáticamente (o casi).
Como tengo la costumbre de convertir en arrays todo lo que saco de las bases de datos antes de combinarlo con el html, una buena parte del camino ya la tenía hecha.
El método que voy a proponer a continuación no es nada del otro mundo y sólo pretende ser un punto de partida para que cada cual lo adapte y complique a su gusto.
Cuando me di cuenta de que un array como este:
$a = array( type=>"text", name=>"nombre", value=>"Pepe", )
era fácilmente convertible, vía php, en un html como este:
<input type="<?=$a[type];?>" name="<?=$a[name];?>" value="<?=$a[value];?>" />
Decidí hacer una función que resolviera la construcción de cualquier formulario simplemente recibiendo los datos necesarios en forma de arrays.
Antes de nada traté de agrupar más o menos los diferentes elementos que componen un formulario: Los <input> tipo text, password y hidden tienen una sintaxis muy parecida. A <textarea> hay que darle de comer aparte y lo mismo con los <select>. Los <input> tipo radio y checkbox se portan de una manera muy similar, y luego quedan los <input> tipo submit.
En el ejemplo de este artículo presento la función f, que resuelve los <input> tipo text, password, hidden y submit, los <textarea> y los <select> y los botones de submit. El resto lo dejo para una pŕoxima ocasión.
El ejemplo resuelve de paso los <label> y permite aplicar class o style particulares a cada elemento. Por cierto: Tengo la costumbre en los formularios de utilizar siempre el mismo valor en name y en id. No sé si eso es bueno o malo (al menos el validador del W3C no protesta), pero si a alguien no le gusta eso no tiene más que crear una nueva variable para uno de ellos.
Ah! La parte en la que se construye el menú desplegable tipo <select> es la que ya presenté en el artículo Construir un menú Select con PHP publicado el 25|09|2009.
Bueno, probadlo y a ver qué os parece. En este link he colgado una demo con CSS y todo.
<?php
$colores = array( // Array de valores para el select
1=>Azul,
2=>Negro,
3=>Naranja,
4=>Violeta,
5=>Granate,
);
$qq=array(
f=>array( // Datos generales del formulario
fN=>"loginForm", // name
fM=>"post", // method
fA=>"form.php", // action
fB=>"Enviar", // texto del botón submit
),
ff=>array(
array( // Datos del input id
fN=>"id",
fV=>123,
fT=>"hidden", // Tipo hidden
),
array( // Datos del input nombre
fN=>"nombre", // Variable
fV=>"Perico", // Valor
fL=>"Nombre", // Texto para el label
fT=>"text", // Tipo text
fC=>"special", // Class CSS (dato opcional)
fS=>"width:100px;", // Style CSS (dato opcional)
),
array( // Datos del input apellidos
fN=>"apellidos",
fV=>"Los Palotes",
fL=>"Apellidos",
fT=>"text",
fC=>"readonly", // Class CSS (dato opcional)
fS=>"width:200px;",
rO=>true, // queremos que sea 'readonly'
),
array( // Datos del input contrasena
fN=>"contrasena",
fV=>"123456",
fL=>"Contraseña",
fT=>"password", // Tipo password
),
array( // Datos del textarea direccion
fN=>"direccion",
fV=>"Calle de Los Desamparados s/n",
fL=>"Dirección",
fT=>"textarea", // Tipo textarea
fC=>"login",
fW=>"10|3", // Width | Height
fS=>"width:200px;height:100px;",
),
array( // Datos del select desplegable color
fN=>"color",
fV=>3, // Valor (numérico en este caso)
fL=>"Color favorito",
fT=>"select", // Tipo select (desplegable)
fC=>"login",
fZ=>$colores, // Array de valores
),
),
);
function f($x)
{
extract($x);
$r="<form name=\"{$f[fN]}\" id=\"{$f[fN]}\" method=\"{$f[fM]}\" action=\"{$f[fA]}\">\n";
for($i=0;$i<count($ff);++$i)
{
if(in_array($ff[$i][fT],array("text","password","hidden",))){$r.="\t".($ff[$i][fT]!="hidden"?"<label for=\"{$ff[$i][fN]}\">{$ff[$i][fL]}</label>":"")."<input type=\"{$ff[$i][fT]}\" name=\"{$ff[$i][fN]}\" id=\"{$ff[$i][fN]}\" value=\"{$ff[$i][fV]}\"".($ff[$i][fT]!="hidden"?($ff[$i][fC]?" class=\"{$ff[$i][fC]}\"":"").($ff[$i][fS]?" style=\"{$ff[$i][fS]}\"":""):"").($ff[$i][rO]?" readonly=\"readonly\"":"")." />".($ff[$i][fT]!="hidden"?"<br />":"")."\n";}
if(in_array($ff[$i][fT],array("textarea",))){$r.="\t<label for=\"{$ff[$i][fN]}\">{$ff[$i][fL]}</label><textarea name=\"{$ff[$i][fN]}\" id=\"{$ff[$i][fN]}\"";$w=explode('|',$ff[$i][fW]);$r.=" cols=\"{$w[0]}\" rows=\"{$w[1]}\"".($ff[$i][fC]?" class=\"{$ff[$i][fC]}\"":"").($ff[$i][fS]?" style=\"{$ff[$i][fS]}\"":"").">{$ff[$i][fV]}</textarea><br />\n";}
if(in_array($ff[$i][fT],array("select",))){$r.="\t<label for=\"{$ff[$i][fN]}\">{$ff[$i][fL]}</label><select name=\"{$ff[$i][fN]}\" id=\"{$ff[$i][fN]}\">";foreach($ff[$i][fZ] as $x=>$v){$r.="<option value=\"$i\"";$r.=$ff[$i][fV]==$x?" selected=\"selected\"":"";$r.=">".$v."</option>";}$r.="</select><br />\n";}
}
$r.="<input type=\"submit\" value=\"{$f[fB]}\" />";
$r.="</form>";
return $r;
}
echo f($qq);
?>
Sin comentarios por ahora
Añadir comentario | comments rss [?] | trackback uri [?]