Mar
10
2011

Formularios en Joomla

Investigando sobre nuevas extensiones que permitan generar formularios a medida en Joomla me he tropezado con SmartFormer, una extensión cuya versión libre se puede instalar en las versiones 1.5, 1.0 y Legacy. Es una extensión muy versatil que nos permite trabajar con gran comodidad a la hora de crear formularios, bien por pasos, bien en una página. Gran validación de campos generados, gestión de registros y exportación de los mismos a diferentes formatos.

Al ser una versión de una empresa estadounidense pues empezamos con las típicas pegas para el mercado Europeo, sobre todo relacionadas con el formato de las fechas y la traducción de algunas cosillas.

La primera de ellas es cuando quieres mostrar el típico calendario dinámico, para que una vez seleccionada la fecha se inserte automáticamente en el campo correspondiente. El formato de idioma está en inglés y el SmartFormer inserta en su código el fichero de idioma inglés de este calendario. La solución viene dada por dos pasos, el primero cambiar la entrada que apunta en components/com_smartformer/engine.php al fichero js en inglés, buscamos la cadena calendar-en.js y la sustituimos por calendar-es.js. El siguiente paso sería generar el fichero calendar-es.js con la traducción adecuada a nuestro idioma cuyo contenido os pongo a continuación.

/ ** I18N
Calendar._DN = new Array
("Domingo",
 "Lunes",
 "Martes",
 "Miércoles",
 "Jueves",
 "Viernes",
 "Sabado",
 "Domingo");
Calendar._MN = new Array
("Enero",
 "Febrero",
 "Marzo",
 "Abril",
 "Mayo",
 "Junio",
 "Julio",
 "Agosto",
 "Septiembre",
 "Octubre",
 "Noviembre",
 "Diciembre");

// tooltips
Calendar._TT = {};
Calendar._TT["TOGGLE"] = "Ir al primer día de la semana";
Calendar._TT["PREV_YEAR"] = "Año anterior (presiona para menú)";
Calendar._TT["PREV_MONTH"] = "Mes anterior (presiona para menú)";
Calendar._TT["GO_TODAY"] = "Ir a hoy";
Calendar._TT["NEXT_MONTH"] = "Mes siguiente (presiona para menú)";
Calendar._TT["NEXT_YEAR"] = "Año siguiente (presiona para menú)";
Calendar._TT["SEL_DATE"] = "Escoje fecha";
Calendar._TT["DRAG_TO_MOVE"] = "Arrastra para mover";
Calendar._TT["PART_TODAY"] = " (Hoy)";
Calendar._TT["MON_FIRST"] = "Ver Lunes primero";
Calendar._TT["SUN_FIRST"] = "Ver Domingo primero";
Calendar._TT["CLOSE"] = "Cerrar";
Calendar._TT["TODAY"] = "Hoy";

// date formats
Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd";
Calendar._TT["TT_DATE_FORMAT"] = "D, M d";

Calendar._TT["WK"] = "Sem";

Luego simplemente tenemos que dejar el contenido del mismo dentro de la carpeta components/com_smartformer/calendar/lang/ y ya tendremos nuestro calendario dinámico en español. Pero todo no termina aquí ya que la gestión de fechas que hace SmartFormer es en formato MM/DD/YY, ahora nos toca cambiar la programación del mismo para que soporte nuestro formato DD/MM/YY y esto lo hacemos de nuevo en engine.php.

Buscamos estas líneas:

$s.="if (type==23) {a=obj.value.split('/'); if (a[0]-0>0 && a[0]-0<=12 && a[1]-0>0 && a[1]-0<=31 && a[2]-0>1000 && a[2]-0<=9999 && a[3]==null ||obj.value.length==0) return ''; else return '".$msgs['validator23']."'; }\n";
$s.="if (type==24) {a=obj.value.split('/'); if (a[0]-0>0 && a[0]-0<=12 && a[1]-0>0 && a[1]-0<=31 && a[2]-0>=0 && a[2]-0<=99 && a[3]==null ||obj.value.length==0) return ''; else return '".$msgs['validator24']."'; }\n";

Y las sustituimos por estas otras:

$s.="if (type==23) {a=obj.value.split('/'); if (a[0]-0>0 && a[0]-0<=31 && a[1]-0>0 && a[1]-0<=12 && a[2]-0>1000 && a[2]-0<=9999 && a[3]==null ||obj.value.length==0) return ''; else return '".$msgs['validator23']."'; }\n";
$s.="if (type==24) {a=obj.value.split('/'); if (a[0]-0>0 && a[0]-0<=31 && a[1]-0>0 && a[1]-0<=12 && a[2]-0>=0 && a[2]-0<=99 && a[3]==null ||obj.value.length==0) return ''; else return '".$msgs['validator24']."'; }\n";

Un poco más abajo y en el mismo fichero volvemos a buscar:

if ($id==23) return "a=this.value.split('/'); if (a[0]-0>0 && a[0]-0< =12 && a[1]-0>0 && a[1]-0< =31 && a[2]-0>1000 && a[2]-0< =9999 && a[3]==null ||this.value.length==0) ; else show_message$uid(this,'$msg',alert_mode);";
if ($id==24) return "a=this.value.split('/'); if (a[0]-0>0 && a[0]-0< =12 && a[1]-0>0 && a[1]-0< =31 && a[2]-0>=0 && a[2]-0< =99 && a[3]==null ||this.value.length==0) ; else show_message$uid(this,'$msg',alert_mode);";

Y lo sustituimos por:

if ($id==23) return "a=this.value.split('/'); if (a[0]-0>0 && a[0]-0< =31 && a[1]-0>0 && a[1]-0< =12 && a[2]-0>1000 && a[2]-0< =9999 && a[3]==null ||this.value.length==0) ; else show_message$uid(this,'$msg',alert_mode);";
if ($id==24) return "a=this.value.split('/'); if (a[0]-0>0 && a[0]-0< =31 && a[1]-0>0 && a[1]-0< =12 && a[2]-0>=0 && a[2]-0< =99 && a[3]==null ||this.value.length==0) ; else show_message$uid(this,'$msg',alert_mode);";

Lo que hacemos es variar el orden en el que se procesan los días y meses. De esta manera ya funcionará correctamente la validación de fechas.

Entradas relacionadas

Sobre el autor: Juan Carlos Giménez Moncada

Luchando con el Open Source desde 1996...

Comentarios cerrados.