Monthly Archives: August 2008

Zend Form: Decoradores

Extendiendo un poco el tutorial de Formularios Zend ahora explicaré como funcionan los decoradores. Los decoradores son la manera de visualizar los diferentes elementos de la forma, básicamente se encargan de ‘renderizar’ los elementos de una forma (es decir es la parte de la Vista).

En el tutorial anterior no definí ningún decorador, esto es porque el Zend Framework inicializa los decoradores con algunos por defecto. Veremos un poco del código interno del Zend Framework para entenderlo a detalle.

en Zend/Form/Element.php nos daremos cuenta que en el __construct (inicialización del elemento) hasta al final hay una llamada a la función loadDefaultDecorators que es la siguiente:

public function loadDefaultDecorators()
{
    if ($this->loadDefaultDecoratorsIsDisabled()) {
        return;
    }

    $decorators = $this->getDecorators();
    if (empty($decorators)) {
        $this->addDecorator('ViewHelper')
            ->addDecorator('Errors')
            ->addDecorator('HtmlTag', array('tag' => 'dd'))
            ->addDecorator('Label', array('tag' => 'dt'));
    }
}

Estos cuatro decoradores son la base de como los elementos son renderizados. El sistema procesa en orden lineal de como definimos los decoradores, si no modificamos entonces el orden es de procesar primero ViewHelper, luego Errors, HtmlTag y por último Label.

Cada decorador al momento de procesar en la función render, el sistema le pasa una cadena con el contenido actual y regresa una cadena de texto que procesó. Idealmente debe de utilizarse la cadena del contenido actual, pero con esto también podemos incluso procesar los elementos procesados y sobreescribir todo el resultado o hacer otras cosas interesantes (aunque podría ser no recomendable en un elemento que tenga como propósito ser parte de una librería).

Los elementos por defecto funciona de la siguiente manera:

  • ViewHelper: renderea en sí el elemento mediante un helper. Por ejemplo un elemento Zend_Form_Element_Select que tiene un helper formSelect utilizará este último helper para mostrar el elemento como <select>...</select>
  • Errors: renderea las partes de los errores, utiliza una plantilla de la siguiente forma:
    <ul class="errores"[opciones html]>
    <li>[error1]</li>
    ....
    <li>[errorN]</li>
    </ul>
  • HtmlTag: Le da un poco de formato al elemento ya que lo agrega en una plantilla de la siguiente forma:
    <dd>
    ...
    </dd>
  • Label: Asigna una etiqueta de la siguiente forma:
    <dt><label>Etiqueta</label></dt>

Los decoradores por defecto tienen opciones para ser puestos al inicio (PREPEND) o al final (APPEND) del contenido, por defecto Errors se pone al final, HtmlTag pone el contenido en medio de las etiquetas y Label se pone al inicio del contenido.

Por lo que con las opciones por defecto la plantilla de como se verá nuestro elemento es:

<dt><label>[Etiqueta del elemento]</label></dt>
<dd>
    [Elemento]
    <ul class="errors">
        <li>[Errores]</li>
    </ul>
</dd>

Si queremos cambiar el orden, o forma de presentación tenemos que cambiar un poco el formato de salida; por ejemplo con el siguiente código (modificándolo de IndexController.php del tutorial de Zend Form):

$decoradores = array(
     'ViewHelper',
     'Errors',
     array('HtmlTag', array('tag' => 'div', 'class' => 'formElement')),
     array('Label', array('tag' => 'div'))
);

$nombre = $formulario->createElement('text', 'nombre_completo')
               ->setLabel('Nombre Completo')
               ->setDecorators($decoradores)
               ->setRequired(true);

Esto nos mostrará un resultado como el siguiente:

Ejemplo de Zend_Form_Decorator

Como hemos definido todos los decoradores que vamos a utilizar es fácil aplicarlo a los demás elementos (en el ejemplo anterior, sólo se aplicó al primer elemento.

Hay que hacer notar que sólo podemos utilizar una vez el decorador en un elemento, si agregamos otro HtmlTag por ejemplo, el último sobreescribirá al primero.

Si queremos construir algo más complejo existe un decorador que nos permite tener mucho mayor control: ViewScript, este decorador básicamente llamará a un archivo de la carpeta de vista (views/scripts) y le pasará tres parámetros:

  • content: El contenido actual producto del renderizado de los otros decoradores
  • element: El Zend_Form_Element que estamos renderizados
  • decorator: Una referencia al decorador ViewScript

Por defecto el resultado se agrega al final, si pasamos como opcion que la posición sea false entonces el contenido que resulte de renderizar este decorador será el único contenido.

Por ejemplo lo siguiente crea un “contenedor” al elemento:

$decoradores = array(
           'ViewHelper',
           'Errors',
           array('HtmlTag', array('tag' => 'div', 'class' => 'formElement')),
           array('Label', array('tag' => 'div')),
           array('ViewScript', array('viewScript' => 'decorador-contenedor.phtml', 'placement' => false)),
    );

Y el decorador está especificado como (archivo nombreado como: views/scripts/decorador-contenedor.phtml:

<div class="formElementContent">
	<?=$this->content ?>
</div>

El resultado es el siguiente (con un poco de CSS):
Ejemplo de Zend_Form_Decorator

Ahora bien, si queremos podemos prácticamente reconstruir todo los demás decoradores mediante un un decorador de ViewHelper y un decorador ViewScript de la siguiente manera:

$decoradores = array(
          'ViewHelper',
          array('ViewScript', array('viewScript' => 'decorador-avanzado.phtml', 'placement' => false)),
     );

Y el decorador seria de la siguiente manera:

<!-- Esta primera parte reemplazaria HtmlTag -->
<div class="formElementContent">
	<!--  parte que remplaza el decorador Label -->
	<div>
    <?php
    	$attribs = $this->element->getAttribs();
    	$label = $this->element->getLabel();

    	//nuevo, verificamos si el elemento es requerido,
    	//entonces agregamos un elemento en html al final de la etiqueta
    	if ($this->element->isRequired()) {
    		$attribs['escape'] = false;
    		$label = $this->escape($label). ' <span class="required">*</span>';
    	}

    	echo $this->formLabel($this->element->getName(), $label, $attribs);
    ?>
    </div>

    <!-- parte del elemento -->
    <?=$this->content ?>

    <!--
    	parte que reemplaza Errors
    	observen que estoy poniendo los errores
    	con simples saltos de linea en lugar de lista
     -->
	<?php if ($this->element->getMessages()) { ?>
	<div class="errors">
		<?=implode('<br />', $this->element->getMessages())?>
	</div>
	<?php } ?>

    <!-- esta parte es opcional si agregaron una descripción -->
    <div class="hint"><?= $this->element->getDescription() ?></div>
</div>

El resultado con un poco de CSS es el siguiente:

Ejemplo de Zend_Form_Decorator

Como se puede observar el anterior ejemplo nos da completo control sobre como mostrar los elementos.

También en un caso más complejo y avanzado podemos incluso definir con algunos cambios sobre el formulario principal (Zend_Form) para definir un decorador que nos permita sobre la vista definir el orden de los elementos, mostrar un formulario totalmente estilizado que no sea regular o incluso no mostrar elementos o crear nuevos para cosas como AJAX/Javascript por ejemplo.

Pero de eso hablaría en otro pequeño tutorial =).

Código Fuente:

DanguerArticle_Zend_Form_Decorator.tar.gz

Visitar Sitio Demo

Imagenes graciosas

Algunas imagenes para alegrar el dia:

Tipo asustado en la montaña rusa
Niña asustada en la montaña rusa
Caras graciosas en la montaña rusa

Solo en Estados Unidos

Solo en Estados Unidos - Final de la Acera

“Fin de Acera”… ¿Te cae?

Solo en Estados Unidos - 50 Mujeres bellas y 3 feas

En un “bar para caballeros”, 50 hermosas mujeres y 3 feas.  Sinceridad ante todo =)

Solo en Estados Unidos - Haciendo ejercicio

Que mejor forma de empezar a hacer ejercicio con una escalera eléctrica =)

Solo en Estados Unidos - Un bello paseo

Nada como dar un paseo y respirar el aire fresco… mhh y hacer un poco de ejercicio

Algo de boxeo

Algunos videos que me encontré sobre boxeadores:

Nunca beses a un boxeador (y menos si eres su oponente):

Boxeador golpea a dos referee distintos en el mismo encuentro:

Si no puedes con el oponente… corre por tu vida:

Partidas de Ages – Velada del 9-10 de Agosto

Un poco tarde pero aqui están las partidas que estuvieron: Hansel, Tavo, Tere, Miyo, Ceiz, Pollo, Clao y yo.

Ages-2008-08-09-01.zip
Ages-2008-08-09-02.zip
Ages-2008-08-09-03.zip
Ages-2008-08-09-04.zip
Ages-2008-08-09-05.zip
Ages-2008-08-09-06.zip

Engrish

Engrish.com es una página donde envian fotos de inglés mal escrito y que da como resultado algo totalmente diferente de lo que intentaron escribir =)

Para muestra:

Engrish - Anti Lust Spray - Spray Anti-Lujuria

Spray Anti-Lujuria =)

Engrish - Fresh Herpes - Herpes Fresco

Herpes fresco… bueno al menos no es añejado

Para calmar el calor, ir a un lugar a la sombra

No está mal escrito, pero dice literalmente “Para no tener calor, la ciudad te sugiere que estés en la sombra”…. ¿Te cae?

Relativo a mi cuate pollo:

Engrish - Born to be chicken - Nacido para ser pollo

Nacido para ser pollo… espero que sea algo de comida >=)

Hari Putter (pelicula de Bollywood)

Me encontré con la noticia de que Warner Brothers quiere demandar a una compañia productora hindú debido a que el título de la pelicula hindú “Hari Putter” se asemeja mucho a “Harry Potter”

Sinceramente es exagerado que solamente porque el nombre se parezca ya quieran demandar, sobre todo porque se explica que Hari es un nombre común en india y Putter significa hijo en Punjabi.

La película por supuesto no tiene que ver nada con el maguito, sino que en realidad es una copia de “Mi pobre angelito” =P

Por cierto alguien comentó que el tren que se ve por los minutos 1:21 es igual al del maguito, aunque en realidad es solamente un tren viejo =)

Mas Datos Interesantes

  • El chocolate puede matar a los perros; afecta directamente al sistema nervioso y al corazon
  • 45% de los Estadounidenses no saben que el sol es una estrella (y dicen que el 60% no saben localizar a Estados Unidos en un mapa, si lo creo, vean el siguiente video)

  • Debido a la escasez de metal en la segunda guerra mundial los oscares de esa época fueron hechos de madera
  • 53% de las mujeres estadounidenses dejarían a sus novios si no les regalan nada el día de San Valentin
  • Hay 318,979,564,000 posibles combinaciones de los primeros cuatro movimientos en el ajedrez
  • Un estudio reveló que los hombres nacidos bajo en peso se casaban menos
  • El nombre de Wendy fue creado en el libro de Peter Pan, aunque ya se había registrado el nombre de Wendy alguna vez anteriormente pero como nombre para hombre
  • De acuerdo a una aseguradora de Estados Unidos, la mayoría de accidentes ocurren entre las 3:00 y 6:00 pm los viernes
  • Si se le da una gota de licor a un escorpión, este se volverá loco y comenzará a picarse a si mismo hasta morir
  • Los hombres son cuatro veces más propensos a ser golpeados por un rayo que las mujeres (y eso que había leido que la ropa interior de las mujeres podía conducir la electricidad :S )

Datos Interesantes

  • La mayoria de los lapices labiales contienen escamas de pescado
  • Las jirafas y las ratas pueden sobrevivir más tiempo sin agua que los camellos
  • La declaración de independencia de Estados Unidos fue escrita sobre papel de mariguana
  • Se estima que en cualquier momento el 0.7% de la población mundial se encuentra ebrio
  • 55.1% de las personas que están encarceladas en Estados Unidos es debido a la droga
  • La catsup se vendía en 1830 como medicina
  • No hay relojes en los casinos de las Vegas
  • El nombre completo de Barbie es: Barbara Millicent Roberts.
  • Ken no era vendido en la India porque chocaba con la tradición de los matrimonios arreglados
  • Los hombres que no se casan tienen una esperanza de vida 10 años menor (parecería que es al reves ;) )

Formas erroneas de escribir Restaurant

Algunas formas erroneas de escribir Restaurant:

Resturan

Resturan

De todos es el que más cerca estuvo

Ris Ti Ran

Ris Ti Ran

Bueno, casi suena igual

Restuarait

Restuarait

Staurant

Staurant

Restavrent

Restavrent

Restaurent

Restaurent

Otro que se acerca mucho al original

Restauraht

Restauraht

Restraunt

Restraunt

Restauyant

Restauyant

Resturent

Resturent

Algo dificil de leer

Y el mejor de todos:

Restavrnctja

Restavrnctja

Definitivamente ni siquiera lo intentaron =)

iPhone-Mania

Sin duda el iPhone es un excelente teléfono, pero la iPhone Manía ha llegado sinceramente a niveles que te hacen decir WTF

Para muestra basta dos articulos de eBay:

Ver listado en eBay

Caja del iPhone por 300 dolares

El anterior articulo (en subasta) si lo compras al chaz-chaz cuesta solamente $300, barato, excepto por una cosa; es solamente la caja!!

Lo único posiblemente valioso de esa caja son los stickers y si eres demasiado metódico pues el manual.

Pero es sorprendente que una caja está en subasta (actualmente cuesta $31 dolares en subasta), no la toco nadie especial, no es edicion especial. Es simplemente una caja….

El segundo WTF sobre el iPhone, es que te venden un iPhone 3G de 8GB por $400 dolares, realmente una ‘ganga’ el pequeño detalle…. está roto y no sirve

iPhone roto por solo $400

Ver listado en eBay

Sinceramente, si algunas partes que se pudieran reemplazar por máximo $100 dolares podría ser una buena opción; pero el iPhone está practicamente deshecho además dice que se le metió agua por lo que bueno… si lo quieres es para tener un portapapeles que ya ni es bonito…

Sinceramente WTF?