Archivo de la categoría: php

Traducción de Zend Validate con gettext y poedit

Zend Framework cuenta con una lógica de Formularios bastante «chori».

Consta de una clase Zend_Form, algunas cuantas Zend_Form_Element_* y algunos Zend_Form_Decorator_*.

Lo «chori» es como funciona. Integra en un solo objeto la lógica de los datos de un formulario, la vista html, el procesamiento de las entradas por cada campo (elemento) y la validación de los valores ingresados.

Así nos ahorramos la lata de escribir varios scripts por separado. Antes era necesario coordinar los nombres de los elementos con las claves que llegaban por $_GET o $_POST. Al hacer cualquier cambio al formulario html, podía provocarle hipo al script validador.

Ahora solo es necesario declarar el formulario, agregarle los validadores a cada elemento (que sea necesario), los decoradores del formulario y/o de los elementos y ya esta todo cocinado. Se pasa el objeto $form al script de vista y automáticamente es dibujado como HTML, y nuestro script Controller puede perfectamente procesar los mismos inputs declarados en el Form.

Tutoriales y documentación para trabajar con Zend Form abundan, así que no voy a profundizar en ello.

El Problema

Los validadores arrojan mensajes de error cuando el valor recibido no coincide con su criterio de validación. Pero estos mensajes estan en idioma inglés, definidos en constantes de clase en cada clase Zend_Validate_*.

La solución

Zend_Translate permite introducir texto traducible en nuestro código.

Escoger un adaptador de traducción

Entre sus adaptadores, mi favorito por el momento es el basado en Gettext. Las ventajas de gettext son múltiples:

  • Las traducciones están en un formato binario y no texto plano, lo que facilita evitar problemas como la codificación de caracteres en distintos sistemas operativos. De hecho, la codificación es un parámetro que se guarda en el mismo binario, ahorrando el «parseo» para detectarlo.
  • PHP es compatible con gettext, por lo tanto, la integración es directa. Cuanta con funciones nativas para cargar las traducciones y además soporta la macro _(‘texto’) para convertir cualquier string en su traducción.
  • El rendimiento de carga uso es altísimo comparado con cualquier otro adaptador basado en texto.

Por su puesto que, dada las circunstancias, se puede escoger cualquier otro adaptador. Solo que gettext es mi favorito 😀 .

Acá hay más detalles sobre Zend_Translate y sus adaptadores.

Zend_Form permite usar automáticamente los mensajes que ya estén traducidos cuando ocupamos validadores con él. ¿Pero como se hace la magia?

Seguir leyendo Traducción de Zend Validate con gettext y poedit

Internet Explorer Encoding Fail

…o como un buen día acaba arruinado por esa basura.

Ayer fue un día prolífico de web-developeo, gracias a que me tope con parte del trabajo ya implementado (y libre), facilitándome mucho las cosas :D. Gracias a eso, podré añadirle otro toque «2.0» a Gonium.

En los últimos días, por motivos de fuerza mayor, he estado trabajando con otro laptop, … con windows xp (chan!). Es acá donde recordé que gran cantidad de las herramientas que ocupaba para desarrollar, cuando desconocía Linux, eran propietarias, pesadas y expiraban a los 10-15-30 días (a menos claro que…). Aproveche esta oportunidad para hacer las pruebas de rigor en Internet Explorer. Como era de suponerse, me causo algunas reacciones urticantes.

Entonces investigando encontré algunas cosas útiles, libres y para windows:

  • 7-zip sino como diablos abro un tar.gz o un tar.bz2 😆
  • Xampp un instalador de Apache+PHP(4/5)+Mysql5 y PHPMyAdmin. Lo bueno es que trae además:
    • mod_rewrite (Apache) Necesario para trabajar con Zend_framework y las urls para SEO. Hay que activarlo en el httpd.conf descomentado la linea que lo carga).
    • xdebug (PHP) Aunque no viene preinstalado, pero es cosa de editar el php.ini, sacar zend_optimizer y descomentar las lineas de xdebug (vienen seguidas).
  • Zend Framework, pack de clases + documentación + … + guías, para trabajar con PHP5
  • Notepad++ Editor te texto plano, para trabajar con código fuente en un montón de lenguajes.
  • Poedit Interfaz gráfica para gettex, una aplicación que permite realizar traducciones desde y en nuestro código fuente.

Con todo esto, más un buen pack de navegadores (Firefox, Arora (basado en webkit), Opera, Safari, IE en todas sus repugnantes versiones), ¿necesito pagar un peso para aprender/trabajar?

Construcción

Basado en el código que me encontré, quería implementar un nuevo módulo para mi sitio. Como trabajo con Zend Framework, es cosa de crear una nueva carpeta con la siguiente estructura:

root/modules
root/modules/my_new_module
root/modules/my_new_module/controllers
root/modules/my_new_module/models
root/modules/my_new_module/views
root/modules/my_new_module/views/scripts

Luego cree mi «MyNewModule_IndexController» (en root/modules/my_new_module/controllers) y mi script de vista index.phtml (en root/modules/my_new_module/views/scripts).

Es tan sencillo y corto que no lo voy a postear.

¿Y donde esta el EPIC FAIL?

Probé el nuevo módulo en Firefox durante todo el día, hasta que se me ocurrió ¿porque no probarlo en IE7 si estoy en windows?

EPIC FAIL:

Módulo pwneado en Internet Explorer 7

Todo el div central se desencuadro 👿 !!!

Seguir leyendo Internet Explorer Encoding Fail

Mi nuevo proyecto: Gonium

Tal vez se vea como una tremenda reinvención de rueda.

¿Por qué?

Hay un dicho muy cierto: si quieres las cosas bien hechas, hazlas tu mismo.

Gonium
Captura de pantalla de Gonium

Hay una infinidad de CMS’s a lo largo y ancho de la web. Realmente la fauna es inmensa. Hay CMS’s fáciles de instalar, otros fáciles de administrar, fáciles de extender, fáciles de modificar, etc…

Mi propia reinvención partirá siendo Gonium. Espero poder agregar lo bueno y evitar lo malo de los otros CMS’s. Pero para que no sea una reinvención total, decidí ocupar un Framework PHP: Zend Framework. ¿Por qué ZF? Básicamente porque ya lo conocía. Cuenta con documentación bastante buena, ciclos de desarrollo ágiles, es libre, tiene buena comunidad, etc…

No esperen mucho, está en una etapa embrionaria muy temprana aún. Prácticamente TODO se debe hacer a mano, incluyendo instalación, configuración de la base de datos, crear/instalar módulos, etc…

Además es una buena oportunidad para probar Google Code como repositorio del proyecto.

Inspiración

Lamentablemente ninguno de los CMS’s que he ocupado me ha logrado satisfacer del todo. Generalmente cumplen con su objetivo, pero siempre hay algo que le falta a alguno que sí tiene el otro. O algo que le sobra… Así que pretendo juntar lo bueno y evitar lo malo de aquellos que he probado.

Por ejemplo, admiro y me inspiro en los siguientes:

Seguir leyendo Mi nuevo proyecto: Gonium

PHP5 and his curious inheritance handle (OOP) PHP5 y su curiosa la manera de manejar la herencia (POO)

Mi problema inicial era por decirlo menos, «simple». Cree unas clases para manejar «módulos» (like-joomla), «bloques» (like-phpnuke) , widgets (like-wordpress). Es decir pequeños recuadros de html que puedo poner en una barra lateral, como en este blog.
OK. Mi diseño consistió en:

  • Clase Dock: es un «área» donde se pueden encolar los widgets. Ejemplo: un leftSidebar, un menuBar, etc…
  • Clase Widget: una clase básica de la cual heredaran los demás widgets. Un Widget entonces será un pequeño espacio que retornará HTML.
  • Clases que heredan de Widget. Ejemplo: Widget_Validator, es uno que hice que retorna los botoncitos con los links para validar el html con el validador de la w3c.

Hasta ahí todo OK.

Entonces, surgió la problemática. Algunos de mis Widget_* necesitaban recursos externos (un script de vista, un modelo, una traducción, etc…). Así que pensé «OK, necesito un directorio de recursos para cada widget». El problema está en que en algunas partes del código, tengo las instancias de los widgets, pero no necesariamente conozco su nombre de clase, pues el método $widget->getContent() es el que hace la magia de pegar el HTML en su posición. Entonces pensé «ok, necesito un método que me retorne el nombre del ‘directorio de recursos’, puede ser en base al nombre de la propia clase».

Acá es donde pillé el EPIC FAIL:
Seguir leyendo PHP5 and his curious inheritance handle (OOP) PHP5 y su curiosa la manera de manejar la herencia (POO)

PHP y Xdebug

Hace unas semanas encontré respuestas a preguntas que me planteé hace años acerca de PHP.

Unas de las primeras cosas que aprendemos cuando conocemos PHP, es que al trabajar en la web, el motor funciona con ciertos límites. Límite de tiempo de ejecución (30 segundos por omisión) y límites de uso de memoria (16M por omisión en mi caso).

Lo malo no es que existan límites, todo lo contrario, en el caso de una aplicación web, de naturaleza concurrente, es necesario que lo que hace un usuario no pase a llevar lo que hace otro, cuidando de pasada los recursos de la máquina servidora. Sería nefasto programar mal un ciclo, de tal modo que en ciertas condiciones se vuelva infinito y además la ejecución no parara nunca. También sería catastrófico que tan solo 2 usuarios ejecutando un script terminaran haciendo colapsar el servidor por uso excesivo de memoria. El problema está cuando estamos desarrollando y olvidamos estos límites, lamentablemente en las situaciones más incomodas es cuando se manifiestan, por ejemplo al extraer demasiados datos desde una base de datos, o al hacer una operación muy larga en uso de disco (por ejemplo copiar muchos archivos de un lado a otro), o al leer un archivo muy grande, etc…

Entonces las preguntas que me hice hace años fueron algo así:
¿Como puedo saber cuanto tiempo demora la ejecución de mi script? ¿Como puedo saber cuanto que funciones/procedimientos son las más lentas? ¿Como puedo saber cuanta memoria consume mi script en ciertas condiciones? ¿Como puedo saber cuanta memoria consume una operación?

RESPUESTA: Xdebug
Seguir leyendo PHP y Xdebug

Resolver problema de traducción de WordPress (probado en 2.3.1)

Hace poco que estoy probando Kubuntu en AMD64, y al parecer, esta plataforma tendría algo que ver con el problema que se da al intentar instalar wordpress traducido en español (o wordpress normal + traducción).

El problema es luego de hacer la instalación, igualmente queda en inglés (Como si no se hubiera hecho nunca la traducción).

Acá está una posible solución.

A mi me funcionó.

Corto tiempo de las sesiones PHP en K/Ubuntu Feisty

PHP LogoEn este prolífico día de blog, me dí cuenta que mientras trabajaba con aplicaciones PHP en el servidor local Apache que tengo instalado en Kubuntu, al estar alejado mucho tiempo con una página abierta sin tocarla, se pierde muy rápido la sesión.

Lógicamente la página debe iniciar una sesión.

El problema es que si me demoro mucho en escribir un pedazo de código y probarlo, debo volver a hacer login.

La solución al parecer es bastante sencilla.

Seguir leyendo Corto tiempo de las sesiones PHP en K/Ubuntu Feisty

En un viejo nuevo proyecto

Aunque suene raro.

Hace años que comencé con la idea de hacer mi propio CMS (Content Manager System, o Sistema de Manejado de Contenidos) usando PHP y una base de datos. Hablo de al menos 5 años atrás cuando comencé a programar PHP en serio, después de haberlo conocido unos meses (pocos días después que me conecté a internet por «banda ancha» por primera vez).

Pero de a poco me di cuenta que el trabajo se pone cuesta arriba. El lema «dividir para conquistar» se va a las pailas cuando el número de sub-problemas comenzó a crecer, y para peor, varios dependían de la solución de otros. Pensé entonce que no sería capaz de hacerlo sólo y compartí el código, en aquel entonces nadie aportó ni una misera linea