Doctrine 2

Últimamente estuve trabajando bastante con CodeIgniter en conjunto con el ORM de Doctrine 1.2 para simplificar el acceso a datos y dar más poder que el Active Record que implementa el framework.

Hoy me topé con una presentación muy interesante de lo que traerá la versión 2, que aprovecha todo el potencial de PHP 5.3.

Una de las cosas más novedosas es el uso de namespaces y “annotations” para declarar una clase como entidad, sin tener que extender de una clase base:

<?php 

namespace Entities; 

/** * @Entity @Table(name="users") */
class User {

	/** @Id @Column(type="integer") @GeneratedValue */
	private $id; 

	/** @Column(length=50) */
	private $name; 

	/** @OneToOne(targetEntity="Address") */
	private $address; 

}

Más información

Nace CodeIgniter Reactor

CodeIgniter LogoEllisLab, Inc., la empresa responsable y creadora de el framework PHP CodeIgniter anunció que a partir de el año que viene el desarrollo del mismo se dividirá en dos ramas:

CodeIgniter Core será mantenida por la empresa e incorporará cambios de la segunda rama, a un ritmo más lento, para adaptarse al ambiente empresarial.

CodeIgniter Reactor será la rama mantenida por la comunidad, guiada por seis ingenieros voluntarios y apadrinada por EllisLab. Esta rama tendrá un desarrollo más dinámico.

Eventualmente los cambios implementados en Reactor se implementarían en Core, una vez que estén suficientemente probados y sean aceptados por la empresa.

Para comenzar a contribuír con el proyecto, basta con entrar al espacio de CodeIgniter Reactor que crearon sobre la plataforma de UserVoice y comenzar a darle peso a las funcionalidades que creemos que hacen falta: CodeIgniter Reactor (UserVoice).

Más información

  • http://codeigniter.com/news/codeigniter_in_2011_reactor_core_uservoice/
  • http://codeigniter.uservoice.com

Traits en PHP 5.4

¿Qué son Traits?

Los Traits son un mecanismo de programación que provee un conjunto de métodos que conforman un bloque de comportamiento, que actúa como una unidad reusable. Son una unidad de reuso similar a las clases. Sin embargo, funcionan siempre como un complemento para éstas, no pueden ser instanciados. En simples términos y como más de uno ha comentado, son como un “copy&paste asistido”.

Los beneficios son el reuso de código y permitir que las clases pueden seguir el formato de herencia simple y aun así poder implementar diferencias de comportamiento con respecto a sus superclases.

Un ejemplo – Comportamiento Singleton

trait Singleton {

	private static $_instance = NULL;

	private function __construct() {...}

	static public function getInstance() {
		if (self::$_instance == NULL) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}
}

class Manager extends AppManager {
    use Singleton;
	...
}

class Editor extends AppEditor {
    use Singleton;
    ...
}

De esta manera, ambas clases Manager y Editor se comportan según el patrón Singleton:

Manager::getInstance();
Editor::getInstance();

Fuentes

  • http://simas.posterous.com/new-to-php-54-traits
  • http://wiki.php.net/rfc/traits
  • http://wiki.php.net/rfc/horizontalreuse

Indicador de entradas pendientes de revisión en WordPress

Como sabrán, para cada entrada WordPress trae por defecto tres estados: Publicado, Borrador y Pendiente de revisión. Este último es útil sobre todo para los casos en que una persona escribe una entrada y otra se encarga de revisarla, previo a su publicación. Puede ser el caso de un blog con varios autores o alguno que cuente con un editor.

En Ted el Mecánico usamos mucho esta funcionalidad, ya que hacemos una especie de revisión cruzada. Uno escribe una entrada, otro usuario entra, revisa los pendientes y publica.

Hasta ahí todo funciona bien. El problema es que la única manera de saber si hay entradas pendientes es entrando al listado de entradas. Los comentarios, que también tienen un estado similar (Pendiente de aprobación) cuentan con un indicador en el menú lateral:

Indicador de comentarios pendientes

La pregunta es: ¿Porqué las entradas pendientes de revisión no se comportan así por defecto? Fácilmente podríamos tener algo así:

Indicador de entradas pendientes de revisión

Sin embargo, mientras no se implemente este comportamiento, se puede recurrir a plugins. Existe un plugin que dice hacer exactamente eso. Se llama Pending Posts Indicator.

La única desventaja que tiene es que nos hardcodea el título “Posts” y por alguna extraña razón, quita el ícono del título. Para corregir esto, hay que actualizar el único archivo del plugin, en la línea 27:
$menu[5] = array( sprintf( __('Posts %s'), "<span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . "</span></span>" ), 'edit_posts', 'edit.php', '', 'wp-menu-open menu-top', 'menu-posts', 'div' );

Sustituírlo por:
foreach( $menu as $menu_key => $menu_data ) :
if( 'edit.php' != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
endforeach;

(El crédito de parte de los cambios es de t31os.)

Ya me contacté con el autor del plugin original, para que incluya los cambios y así esté disponible desde el directorio de plugins de WordPress. Mientras tanto se puede descargar la versión 1.1 de aquí:

[download id=”4″]

Momentos luego de recibir el cambio anterior postearon otra respuesta en StackExchange, que contempla el caso de  Custom Post Types pendientes: Ver respuesta en StackExchange.

Actualizado 12/11/2010 20:00 – Subí un ticket al trac de WordPress (ticket 150406). En el peor de los casos, obtengo una respuesta de porqué no está implementado, en el mejor, se implementa el patch y todos felices :)

Actualizado 14/11/2010: El ticket fue actualizado y aparentemente fue agendado para “Future Release”!

Enlaces

Día mundial de la usabilidad

Día mundial de la Usabilidad

El 11 de noviembre desde hace 5 años se festeja el día mundial de la usabilidad. El mismo pretende servir como impulso para crear conciencia para el diseño de productos y servicios que facilitan y mejoran la comunicación. En pocas palabras, hacernos la vida más fácil.

Con ese motivo, Concreta y Universidad ORT organizan una mesa redonda para tratar este tema.

El 11 de noviembre a las 19 horas, Concreta y la Cátedra de Nuevas Tecnologías de la Universidad ORT organizan por cuarto año consecutivo una mesa redonda para celebrar el Día Mundial de la Usabilidad.

Este año el tema propuesto es “La enseñanza de la usabilidad en la universidad”.

En la mesa redonda participarán representantes de las diferentes universidades del país moderados por Daniel Mordecki, Director de Concreta y docente de la Universidad ORT.
Auditorio de la Facultad de Comunicación y Diseño
Av. Uruguay 1185
Entrada libre

World Usability Day | Sitio oficial

Cargar ítems antíguos de un feed RSS

Hace poco un amigo planteó la siguiente duda: “¿Cómo se puede consultar ítems antíguos en un feed RSS?”.

En principio la respuesta sería “No se puede”.

No se puede porque en el nivel más bajo un feed es simplemente una porción de software que escupe código XML (como este muy simple: RSS Generator) y en general no se incluye ningún tipo de parámetros de consulta, pues no hay un estándar que lo requiera.

Sin embargo, en Google Reader uno puede hacer scroll hacia abajo y al pasar el último ítem vemos como se cargan unos cuantos más debajo de éste, y si seguimos se puede ver como se cargan más, y así. ¿Cómo hace para conocer posts anteriores?

La respuesta es sencilla: Google sabe todo. Bueno, no todo, pero sabe mucho. Otro que sabe mucho es Stackoverflow, donde encontramos la explicación más factible: Google tiene cada ítem indexado, cuando uno solicita más, simplemente trae lo que tiene en el archivo. Es por eso que el scroll parece infinito, pero solo va hasta el primer ítem que indexó.

Una posible manera de obtener ítems antíguos entonces es utilizando Google Reader, formando una URL de este tipo: http://www.google.com/reader/atom/feed/[FEED_URL]?n=[ITEMS]

Donde [FEED_URL] es la URL del feed y [ITEMS] es la cantidad de ítems que queremos traer del archivo. Por ejemplo: http://www.google.com/reader/atom/feed/http://tedelmecanico.com/feed?n=50

Como dato aparte, existen borradores para el formato ATOM, que incluye paginado y archivo de ítems. Podes ver la especificación aquí: http://tools.ietf.org/html/rfc5005.

Enlaces

1er Concurso Interuniversitario de Bloggers

Les dejo la información sobre el primer concurso interuniversitario de blogs:

LR21 con el apoyo del Ministerio de Educación y Cultura y la participación de La Universidad de la República, la Universidad ORT, la Universidad de Montevideo, La Universidad Católica y La Universidad de la Empresa, quieren fomentar la información y el debate sobre la actualidad del Uruguay y el Mundo entre los jóvenes universitarios internautas, y para estimular las iniciativas que contribuyan a este fin, convocan al 1er concurso InterUniversitario de bloggers en nuestro país.

Hay más de 20 categorías para inscribirse. De cada categoría se elegirá el mejor blog, y de esos se elegirán los 3 ganadores.

El jurado fundamentará su decisión en base a los siguientes criterios:

  • Calidad literaria o estética (en caso de blogs multimedia)
  • Actualización: Los blogs que tengan más periodicidad tendrán un mayor puntaje. Se tomará en cuenta también a los blogs que hayan tenido más entradas en el año 2010.
  • Comunidad creada en el blog: la cantidad de miembros/seguidores del blog será también un factor a calificar.
  • Diseño y originalidad de contenidos.

Premios

  1. Viaje al Machu Picchu.
  2. Fin de semana en hotel en Colonia para dos personas con dos días de auto incluído.
  3. Un celular touchscreen.

Inscripción

El período de inscripción va hasta el 7 de noviembre. fue extendido en algún momento de esta semana, ahora es hasta el 14 de noviembre.

¡Suerte!

Enlaces

Tag <label>

Falso

Intenten clickear verdadero. Luego el falso. ¿Se nota la diferencia?

Es frustrante. Quizá hay muchos usuarios que ni se percatan de que clickeando el texto al lado de un checkbox (o cualquier otro tipo de input) pueden accionar sobre él. Pero hay una mayoría (espero) que sabe que al hacer click en el texto de rótulo de un elemento, el mismo se accionará.

Al perder este comportamiento rompemos con la consistencia y eso afecta la experiencia de usuario, en particular la usabilidad del sistema.

Cómo usarlo

Para utilizar un rótulo de este tipo lo único que hay que hacer es utilizar el tag <label for="element-id">, donde el atributo for define el ID del elemento que queremos accionar. También se puede lograr poniendo el input dentro del label, pero no es tan limpio y no se puede hacer en todos los casos.

Como ejemplo, el código de Verdadero/Falso:

<input type="checkbox" id="verdadero" /> <label for="verdadero" id="label-usuario-ok" >Verdadero</label>
<input id="falso" type="checkbox" /> <span id="label-usuario-mal" >Falso</span>

Como comentario aparte, este “error”  es uno de los tantos que pasan desapercibidos por más que el HTML valide perfectamente.

Referencia

  • https://developer.mozilla.org/en/HTML/Element/label