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
Archivo
- abril 2020 (1)
- marzo 2020 (1)
- abril 2012 (1)
- febrero 2012 (1)
- diciembre 2011 (3)
- noviembre 2011 (2)
- septiembre 2011 (2)
- agosto 2011 (2)
- julio 2011 (2)
- junio 2011 (3)
- abril 2011 (1)
- marzo 2011 (7)
- febrero 2011 (6)