Decorators para un checkbox con Zend_Form

En muchos de mis proyectos suelo usar el Zend_Form para definir los formularios, sus campos y sus filtros y a veces, también para mostrarlos en el HTML. Es en esos casos cuando te sueles encontrar con problemas por el modo en que el componente genera el código HTML (basado en una <dl>) y con la dificultad que suelen entrañar los decorators.

El último problema que me encontré fue el de mostrar un checkbox poniendo el texto (etiqueta) a la derecha del control.
Para todos los que os encontréis en esa situación, aquí dejo la solución que encontré:

$form->addElement('checkbox', 'remember_me', array (
      'label' => 'Recordarme en este ordenador',
      'decorators' => array(
         array('ViewHelper'),
         array('Label', array('placement' => 'APPEND'))
)));

El valor de “placement” puede variar entre APPEND (a la derecha del control) o PREPEND (a la izquierda).

Tus derechos, mis derechos

Copyright

Esta encantadora escena puede parecer inofensiva, pero si el precioso gatito que están viendo en el videoblog de la tía Val está bailando una canción con copyright, esta familia está ROBANDO.
Ese es el motivo por el que necesitamos el poder para expulsaros de Internet: Porque nuestros copyrights valen más que vuestros derechos humanos.

Vía merodeando.

Usa las ETags en tu proyecto

Y no sólo porque lo diga Yahoo! sino porque te ahorrán tiempo y dinero. Harán que tu servidor sea capaz de procesar más peticiones y que estas sean más rápidas.

Últimamente y a medida que mis sitios web están ganando en visitas, estoy muy interesado en el tema de la optimización de los proyectos web y poco a poco, voy incorporando varias técnicas que incorporo en la fase final del desarrollo.Una de ellas es la de añadir ETag para los proyectos web que generan contenido dinámico.

La mayoría de los sitios web con contenido dinámico no están continuamente cambiando el contenido, sino que éste es modificado en momentos muy puntuales. Todo el tiempo entre un cambio y otro, el contenido es el mismo y sin embargo, hacemos que el servidor vuelva a generarlo y a enviarlo al servidor como si fuera completamente nuevo.

Las ETags son unos identificadores que se envían al navegador para identificar el “estado” de una página dinámica o de un archivo estático. Son fácilmente configurables en Apache para los archivos estáticos, pero pocas veces son usadas cuando el contenido es generado a partir de fuentes dinámicas.

Imaginemos el caso de este blog. Cada página es modificada únicamente cuando yo hago algún cambio desde el panel de control o cuando alguien deja/modifica un comentario. El resto del tiempo, el contenido de las páginas no varía.Podríamos por tanto identificar a cada página por su URL (p.ej.  “/2008/10/03/en-espana-se-vende-menos-que-se-compra/” ) y por la fecha en que fué actualizada. Si unimos ambas cosas, podríamos obtener un identificador único. Por ejemplo:

$etag = md5 ($_SERVER['REQUEST_URI'] . $last_modification_time);

Esa sería por lo tanto su Etag.  Y podríamos enviarla al navegador de la siguiente forma:

header("Etag: $etag");

El navegador, cada vez que pida esa página, enviará un header especial “If-None-Match” preguntando si es la misma página que ya le fué enviada la última vez. Con lo que antes de generar la página, podríamos comprobar:


if (trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}

De esta forma, informaríamos al navegador de que la página no ha cambiado y por lo tanto no tendríamos necesidad de volver a generarla ni de enviarla por la red. Así ahorraríamos tiempo de proceso en el servidor (carga) y ancho de banda, además de ofrecer una mejor experiencia al usuario.

Por supuesto esta no es una solución válida para cualquier proyecto o situación ( en algunas puede ser incluso contraproducente ), pero si que supone una mejora en una gran parte de los desarrollos. Al menos así ha sido para mí ;)

En el Zend Framework también tenemos ya una propuesta para usarlas.

De página web a entrada en Twitter

El otro día estuve probando algunos de los componentes que el Zend Framework tiene aún en la incubadora o como simples propuestas. Entre ellos, encontré el Zend_Service_Twitter y se me ocurrió una idea.

Desde hace tiempo, sigo la web del equipo de Cárpatos en www.serenitymarkets.com y siempre he echado en falta el que dispusiera de un feed para poder seguirlo con mi agregador. Pero además, viendo la frecuencia de actualización, se me ocurrió pensar que es prácticamente lo mismo que lo que ocurre en una cuenta Twitter, donde se va contando minuto a minuto lo que va pasando en los mercados financieros.

Gracias al ZF, pasé del dicho al hecho en poco más de 1 hora. Convertí el html de su web en un documento DOM y con ese documento, creé un Feed (Zend_Feed_Builder) y con el Zend_Service_Twitter hice que cada vez que aparecía una entrada nueva, esta se publicara en una cuenta de Twitter ( twitter.com/carpatos ).

No todo puede ser trabajo, de vez en cuando toca divertirse un ratito :)

Hay mucha gente que defiende que en PHP se pueden crear grandes aplicaciones sin necesidad de Frameworks. Yo estoy con ellos, creo que los frameworks no son necesarios, pero si son útiles. En algunos casos, muy útiles, ya que te ayudan a realizar tu trabajo en mucho menos tiempo y a realizar tareas muy complejas con unas pocas líneas de código.

Actualización: En este momento he tenido que cerrarlo por algunas razones que ya revelaré más adelante ;)

Crear un nuevo proyecto con Zend_Tool

Una de las herramientas interesantes que vienen con el Zend Framework 1.6 es Zend_Tool. Se trata básicamente de una utilidad para automatizar la creación de carpetas/documentos iniciales en un proyecto (al estilo ruby on rails).

Es bastante interesante porque te ahorra bastante tiempo y te ayuda a que tus proyectos sean más “estándar”.

Teneis un artículo con ejemplo incluído en la Zend Developer Zone: Using Zend_Tool to start up your ZF project.

Disponible la versión 1.6 del Zend Framework

Desde hace unas horas, ya tenemos disponible la nueva versión del Zend Framework.Aunque muchos llevamos ya bastante tiempo usándola, es un buen momento para descargarla y actualizar nuestras aplicaciones ya que se han cerrado más de 270 bugs. Los nuevos componentes:

  • Zend_Tool
  • Lucene 2.3 Index File Format Support
  • Zend_Session save handler for Database Tables
  • Paginator Component
  • Figlet Support
  • ReCaptcha Service
  • Captcha Form Element
  • Zend_Config_Xml Attribute Support
  • Zend_File_Transfer Component
  • File Upload Form Element
  • Zend_Wildfire Component with FireBug Log Writer

Sin duda, para mi el que más util ha sido hasta el momento ha sido el Zend_Paginator, que me ha ayudado a simplificar y hacer mucho más agradable la repetitiva tarea de programar el sistema de paginación en los listados. Aunque ya estoy echándole un vistazo al nuevo Zend_File_Transfer, que puede ayudarme a simplificar y mejorar la subida de archivos. 

Zend_Mail y Servidores Microsoft Exchange

Durante el día de ayer y casi toda esta mañana, he estado dándole vueltas a un problema con los archivos adjuntos que enviaba usando el Zend_Mail.

El script PHP genera una imagen que luego es enviada como adjunto usando las funciones de la clase Zend_Mail. Hasta aquí todo bien. Lo pruebo y funciona correctamente. Lo prueba el cliente… y no le funciona. El adjunto llega corrupto y no puede ver la imagen. Mi primera suposición es que sería algún problema de Windows (no iba muy mal encaminado), pero dificil discernir cuando el cliente tiene instalado un filtro antivirus, otro filtro antispam y la gestión del correo en un servidor Microsoft Exchange…

Bueno, pues para los que os encontreis con el mismo problema, aquí va la solución:

Cambiar el valor de la constante LINELENGTH en el archivo Zend/Mime.php (sobre la línea 41) y poner 72 en vez de 74.

Al parecer al servidor Microsoft Exchange no le gusta que las lineas sean muy largas en los adjuntos codificados…

Gracias, gracias y mil gracias a David Brännlund .