That’s all!
That’s all!
El motivo de este post es para presentar una clase que ayuda al procesamiento de formularios en PHP (también estará la versión Java) teniendo en cuenta su facilidad de uso (como jQuery Validate).
Para descargarlo acá tienen el desarrollo (y el ejemplo): FormValidate.
Para tener una forma de hacer cambios rápidos sin tener que hacer modificaciones en el código se usa un archivo ini, en la que para cada campo a considerar se define una sección y sus atributos a validar, por ejemplo:
;ESTE ARCHIVO ES UN EJEMPLO PARA PHPTools -> FomrValidate
;Campo para evitar los robots
[f0]
type=security
;Campo de tipo númerico
[f1]
type=number
min=5
required=true
;Campo de tipo mail
[f2]
type=mail
;Campo que requiere una expresión regular
[f3]
type=regex
regexstr="/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i"
max=100
required=true
;Campo con un tamaño mínimo de 20 caracteres
[f4]
min=20
donde:
Ahora para poder validar los datos enviados al servidor, vamos a hacer uso de este script:
<?php
include "PHPTools/FormValidate.php";
$form = new FormValidate(array(
'get' => true,
'path' => 'properties',
'ini' => 'form'
));
// limpiar entrada
$form->escape();
// validar
$form->validate();
?>
En la descarga de FormValidate el ejemplo muestra el arreglo antes de ser validado y después (que agrega mensajes de error y llena el arreglo de errores en caso de existir).
Estos son los valores de los parámetros usados para la configuración:
Estos son los valores de los parámetros para el uso de la clase FormValidate
Estas son algúnas tareas que faltan en este desarrollo:
Este clase tiene la licencia MIT.
Pues ya se va a acabar otro trimestre en la UAM y antes de encerrarme por completo en temas relacionados con la escuela, me permito escribir esto.
He llevado redes de telecomunicaciones y me encanto y ahora tengo en mente porque HTTP es tan inseguro (jeje, es lo que imagino, pero falta corroborarlo).
En mi proyecto de investigación he aprendido a usar GTK y regresar a programar con C (que hubiera preferido python, pero no se puede todo en la vida).
Saludos.
Este artículo se basa en mi experiencia en el trabajo, desarrollo de aplicaciones web, y de llevar a estas el requerimiento no funcional del rendimiento del navegador al momento de hacer el render de la página. Para poder medir este requerimiento use la herramienta web GTmetrix que realiza dos pruebas (YSlow y Page Speed) de la página web a mostrar.
Hasta este momento parte de mi trabajo ha sido trabajar con el CMS modx, que pesar de tener una nueva versión llamada revolution (con muchas mejoras sobre la versión anterior), sigue con el problema de manejar el código (html o php) a través de la base de datos y dificultando su manejo a través de su administrador. Para paliar este problema, y mostrar las maravillas de automatizar tareas, realize una clase en Java para interactuar entre archivos físicos (de tu ambiente de desarrollo) y la base de datos con el código de estos (sin tener que abrir el administrador de modx).
Para automatizar tenemos muchas herramientas que permiten hacerlo, como por ejemplo, scripts de shell o archivos de procesos por lotes. Debido a que son herramientas que cubren necesidades diferentes preferí no apegarme a una de estas opciones, en cambio, dada la extensión del lenguaje Java y las herramientas basadas en este lenguaje que permiten automatizar tareas en el desarrollo decidí usar Apache Ant.
Si buscas compresores para CSS o Javascript hay muchos online, que desde mi punto de vista son buenos para hacer el proceso una sola vez. Sin embargo, si deseas integrar esta actividad de manera continua en tus proyectos creo que verás que no es ameno estar desarrollando en x programa, abrirlo, copiar el contenido del archivo, pegarlo en el navegador y poner el resultado en un nuevo archivo. Por este motivo para la compresión de las hojas de estilos y archivos javascript he usado YUI Compressor que es una clase Java y que se puede ejecutar desde línea de comandos. Para la compresión de HTML use la herramienta HTML Compressor que básicamente cambia los saltos de línea y tabuladores en espacios en blanco.
Para el manejo de los elementos de modx hice una clase en Java (para ejecutar desde la línea de comandos) y evitar trabajar con estos a través del navegador (dejando la tarea del desarrollo a herramientas hechas para esto). Al desarrollo lo llame modxConnect y la idea es que una vez que se encuentra comprimidos los elementos (html) modxConnect inserte el contenido de los elementos en la base de datos de modx. Falta mucho desarrollo, pero es un primer acercamiento.
Para los siguientes pasos supongo que ya esta configurado todo este ambiente:
Ahora ya que tienes listo este ambiente de desarrollo vamos a empezar la configuración para la automatización.
Uno de los beneficios de Apache Ant, es que solo tienes que crear un archivo XML llamado build.xml (por lo general, pero puedes hacer referencia a otro archivo) y es donde definirás las tareas (targets) repetitivas que deseas realizar de manera automática. La estructura básica del archivo build.xml es:
<?xml version="1.0" encoding="UTF-8"?>
<project name="NombreProjecto" default="clean" basedir=".">
<property file="build.properties" />
<target name="clean" depends="" description="">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
<target name="clean" depends="" description="">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
</project>
Ahora comentemos un poco de las etiquetas (que puedes ver más a detalle en Apache Ant User Manual):
Antes de continuar, necesitamos la información del archivo build.properties:
dir.src=src dir.build=build dir.sub=assets dir.js=js dir.css=css dir.server=C:/servers/xampp/htdocs/app dir.chunks=chunks dir.lib=lib dir.classPHP=class dir.processPHP=process dir.propertiesPHP=properties dir.modx=C:/servers/xampp/htdocs/cmsModx dir.ftp=urlFTP server.dir=00.000.00.00 server.usr=usuario server.pwd=password file.css=style.css file.js=scripts.js file.chunk.css=html.css.xhtml file.chunk.js=html.js.xhtml dir.compressor=C:/tools/yuicompressor-2.4.2/build class.compressor=yuicompressor-2.4.2.jar dir.compressorHTML=C:/tools/htmlcompressor class.compressorHTML=htmlcompressor-0.9.1.jar
Y ya que se definió una tarea, para realizarla necesitas llamar a ant y darle el nombre de la tarea como parámetro:
ant nombreTarget
Una de las primeras tareas, y practicas en Java, es tener por separado el ambiente de desarrollo y el ambiente de producción, que por lo general es la compilación de los fuentes, pero en este caso solo será los archivos fuentes con cierto proceso (compresión) y para llevar a cabo esta tarea, se puede definir una tarea como la que sigue:
<target name="makeDirs" description="Crea los directorios sobre los que se trabajara">
<copy todir="${dir.build}">
<fileset dir="${dir.src}">
<exclude name="**/*.*" />
<exclude name="**/js/src/**" />
</fileset>
</copy>
</target>
Para este caso solo se crea la estructura de directorios (como lo tengas en desarrollo) ya que en otras tareas se harán los procesos para comprimir los diferentes tipos de archivos. Puedes permitir copiar las clases PHP o las imágenes desde un principio (aunque más adelante puedo dar unas ideas para no hacerlo aún).
Empecemos a hacer una de las tareas repetitivas: comprimir CSS y JS. Si se dificulta tener una sóla hoja de estilos (siempre es más ordenado separar los estilos de las secciones en diferentes archivos) entonces primero juntemos toda la información de las hojas de estilos en un sólo archivo (lo mismo pasa con los archivos de los javascripts), para eso se pueden hacer unas tareas como estas:
<target name="conCSS" description="Concatena los CSS a un archivo en el directorio BUILD">
<concat destfile="${dir.build}/${dir.sub}/${dir.css}/${file.css}" force="no">
<filelist dir="${dir.src}/${dir.sub}">
<file name="${dir.css}/charset.css" />
<file name="${dir.css}/reset.css" />
<file name="${dir.css}/estilo1.css" />
<file name="${dir.css}/estilo2.css" />
<file name="${dir.css}/estilo3.css" />
</filelist>
</concat>
</target>
<target name="conJS" description="Concatena los JS a un archivo en el directorio BUILD">
<concat destfile="${dir.build}/${dir.sub}/${dir.js}/${file.js}" force="no">
<filelist dir="${dir.src}/${dir.sub}">
<file name="${dir.js}/jquery-1.4.2.js" />
<file name="${dir.js}/jquery.ui.core.js" />
<file name="${dir.js}/jquery.ui.widget.js" />
<file name="${dir.js}/jquery.ui.mouse.js" />
<file name="${dir.js}/jquery.ui.draggable.js" />
<!-- wrapper > -->
<file name="${dir.js}/wrapStart.js" />
<file name="${dir.js}/main1.js" />
<file name="${dir.js}/main2.js" />
<file name="${dir.js}/main3.js" />
<file name="${dir.js}/wrapEnd.js" />
<!-- < wrapper -->
</filelist>
</concat>
</target>
Comprimir los archivos de CSS y JS ya concatenados (con el YUI Compressor):
<target name="compressCSS" description="comprime el CSS de BUILD" depends="conCSS">
<exec executable="cmd">
<arg line="/c java -jar ${dir.compressor}/${class.compressor} ${dir.build}/${dir.sub}/${dir.css}/${file.css} -o ${dir.build}/${dir.sub}/${dir.css}/${file.css} " />
</exec>
</target>
<target name="compressJS" description="comprime el js de BUILD" depends="conJS">
<exec executable="cmd">
<arg line="/c java -jar ${dir.compressor}/${class.compressor} ${dir.build}/${dir.sub}/${dir.js}/${file.js} -o ${dir.build}/${dir.sub}/${dir.js}/${file.js} " />
</exec>
</target>
Con esto ejecuta
ant compressJS compressCSS
y siempre se generarán los archivos de JS y CSS comprimidos.
Los archivos HTML y PHP son muchos y no tiene caso que los concatenemos, pero si se puede “comprimir” (eliminar los metacaracteres) para agilizar la transferencia de los archivos. Esto se resuelve con la siguiente tarea:
<target name="compressAll" depends="makeDirs">
<apply executable="java" parallel="false">
<fileset dir="${dir.src}/" includes="**/*.html,**/*.php,**/*.xhtml">
<exclude name="**/config/**" />
<exclude name="**/css/**" />
<exclude name="**/js/**" />
<exclude name="**/lib/**" />
<exclude name="pagina1.php" />
<exclude name="pagina2.php" />
<exclude name="pagina3.php" />
</fileset>
<arg value="-jar"/>
<arg path="${dir.compressorHTML}/${class.compressorHTML}"/>
<arg line="--type html"/>
<srcfile/>
<arg value="-o"/>
<mapper type="glob" from="*" to="${dir.build}/*"/>
<targetfile/>
</apply>
<copy todir="${dir.build}/${dir.sub}/${dir.lib}">
<fileset dir="${dir.src}/${dir.sub}/${dir.lib}" includes="**/*.php"></fileset>
</copy>
</target>
Por último resolvemos el inconveniente de modx respecto a los elementos con modxConnect. La definición de la tarea:
<target name="copyServer" depends="compressJS,compressCSS,compressAll"> <exec executable="cmd"> <arg line="/c C:\Java\jdk1.6.0_03/bin/java -jar C:\tool\modxConnect.jar" /> </exec> <!-- limpiar el cache del modx --> <exec executable="cmd"> <arg line="/c curl http://SITEURE/clearCache.html" /> </exec> </target>
<?php
// Snippet para limpiar la cache
$paths = array(
'config.cache.php',
'sitePublishing.idx.php',
'registry/mgr/workspace/',
'lexicon/'
);
$contexts = $modx->getCollection('modContext');
foreach ($contexts as $context) {
$paths[] = $context->get('key') . '/';
}
$options = array(
'publishing' => 1,
'extensions' => array('.cache.php', '.msg.php', '.tpl.php'),
);
if ($modx->getOption('cache_db')) $options['objects'] = '*';
$results= $modx->cacheManager->clearCache($paths, $options);
return 'OK';
?>
Ya configuraste todo, pero no te olvides de agregar una tarea que borre todo lo que generaste
<target name="clean" description="limpiar los paths">
<delete dir="${dir.build}" />
<delete dir="${dir.server}" />
</target>
La parte más sencilla de esto: usar Apache Ant. Una de las ventajas de modularizar la construcción, es que puedes hacer cualquier paso intermedio y no tener siempre que ejecutar todo, por esa razón se separo la concatenación de los archivos de la compresión o la creación de el árbol de producción.
Para ejecutar todas las tareas, ponemos
ant compressAll
Por ejemplo, esta modificando la hoja de estilos y solo quieres concatenar los archivos (sin comprimir) sólo ejecutas
ant compressCSS
y ya solo subes el archivo y haces el debug (lo mismo se puede hacer con los javascript).
Este artículo se centra en mejorar algunos procesos en el desarrollo de software. Después de estar trabajando un tiempo de esta manera mi experiencia me dice que HAY QUE ORGANIZAR LOS PROYECTOS (y esto incluye como se implementará) para atender procesos que son susceptibles de automatizar y mejorar la calidad en este rubro.
También es dar algunas ideas respecto a lo que se me ocurre automatizar:
Me encanto este theme de wordpress.