Bueno, parece que tendré que retirar el cartelito de "78 días sin actualizar Drupal", hoy mismo, aprovechando la resaca de la DrupalCamp Spain 2010, han salido las versiones 6.16 y 5.22.

Ambas actualizaciones incluyen solución a cuatro vulnerabilidades de seguridad, por ejemplo un cross site scripting si nos dejabamos nuestro sitio sin instalar, o que un usuario bloqueado podía mantener su sesión en el sitio a pesar de tener un estado no activo, más detalles. Además, la actualización de Drupal 6 incluye la solución para más de 30 bugs encontrados en la versión 6.15.

La actualización de Drupal 5 no incluye solución a ningún error ya que está a punto de ser sobrepasada por Drupal 7. Así que en cuanto salga la primera versión estable de Drupal 7, todas las instalaciones de Drupal 5 dejarán de tener soporte de seguridad.

14 de Febrero, San Valentín, el día de los enamorados, y qué mejor que una plantilla / theme de Drupal acorde a esta ocasión tan señalada.
Buceando entre los temas gratuitos de drupal.org me he encontrado con cuatro que se adecúan perfectamente:

Skyroots

 

Plantilla a dos columnas fijas sin tablas, se puede descargar aquí porque el autor no se arregla con el CVS de drupal.org.

Powerful Pink

Plantilla fija a dos columnas y resolución de 800x600.

Strange Little Town

Plantilla configurable a diferentes resoluciones, también fluida y con muchas opciones para modificar vía interfaz.

aBeesParadise

Plantilla a dos columnas y 700px de ancho.

 

Hace ya tiempo que no pongo ningún artículo sobre desarrollo con Drupal, a continuación explico los usos más comunes de la función l() para generar links de forma segura y sencilla.

Creando links en Drupal 6: la función l()

La función l() permite generar links en el código y es una práctica recomendada para el desarrollo con Drupal, pasando los enlaces a través de esta función nos aseguramos de que las rutas se generan bien y nos ahorramos problemas de seguridad (ya que se filtra el texto) y también con los alias, ya que es consciente del alias que tiene cada contenido y se genera correctamente, por ejemplo si tenemos un enlace al primer nodo node/1 y tiene un alias como contenido/primer-articulo, si cambiamos el alias, un link construido con l() no será necesario modificarlo.

Sintaxis

l($text, $path, $options = array());

  • $text - El texto que se mostrará en el enlace, es recomendable pasarlo a través de una función t() si trabajamos con traducciones y sitios multilenguaje.
  • $path - Ruta a la que accede el link.
  • $options - Array de opciones que nos va a permitir alterar el comportamiento del enlace, permitir HTML, añadir clases CSS...

Por ejemplo, un link a un contenido fijo, el formulario de contacto:

<?php
 
print l('Contacta', 'contact');
?>

Otro ejemplo, un link a un nodo, pasado por traducción.

<?php
 
print l(t('Enlace al contenido'), 'node/4');
?>

Si queremos enlazar la home, debemos usar la cadena <front>.

<?php
 
print l(t('Home'), '<front>');
?>

Justo 3 meses después (91 días) de la última actualización de Drupal, esta noche han salido las versiones 6.15 y 5.21.

La actualización para Drupal 5 solamente incluye dos correcciones de problemas de seguridad relacionados con el cross site scripting (XSS), una que afecta al módulo Contact que permite a usuarios con suficientes privilegios crear categorías e insertar HTML o scripts maliciosos para conseguir permisos de administración. La otra es similar y afecta al módulo de Menu.
La actualización para Drupal 6 incluye estas dos mismas correcciones de seguridad y además 28 correcciones de bugs, algunos de ellos de documentación. Uno de los cambios más importantes es el fichero .htaccess, que incluye modificaciones sobre las directivas de mod_expires.

Como siempre, es muy recomendable actualizar cuanto antes para evitar problemas, si no podemos aplicar la actualización completa, al menos sí el parche, éste para drupal 6.14 y éste otro para drupal 5.20.

Si tenéis dudas de cómo se aplican estos parches, en drupal.org hay un paso a paso. También es muy recomendable este artículo de Cuenco Digital sobre los parches de Drupal.

Desde Anaya Multimedia han tenido la deferencia de hacernos llegar a Neurotic un ejemplar del primer libro que se edita en español sobre Drupal, una traducción del magnífico "Using Drupal" escrito por la gente de lullabot en colaboración con O'Reilly. 

Es una publicación orientada a la configuración de sitios utilizando las herramientas y módulos contribuidos de Drupal, no trata temas de programación o theming, pero sí que ofrece una visión bastante bastante pormenorizada de módulos muy importantes, CCK, Views, Ubercart o Internacionalization, y lo más importante, a partir de ejemplos prácticos. El libro está ya en las principales librerías y tiene un precio aproximado de 45€. Estamos dando buena cuenta del libro y en breve pondremos una reseña. Actualizo: Jose María me indica que los ejemplos del libro se pueden descargar libremente desde aquí: http://www.anayamultimedia.es/cgigeneral/ficha.pl?id_sello_editorial_web...

Uno de los tweets de Dries ya me lo hizo sospechar esta tarde, y 76 días después de la última actualización de seguridad para Drupal, salen las versiones 6.14 y 5.20.

Drupal 6.14 incluye más de 50 correcciones entre bugs de seguridad, de código y documentación, mientras que la versión 5.20 tiene ocho correcciones.

Las vulnerabilidades más importantes que corrigen estas versiones están en su mayoría relacionadas con OpenID. La implementación de OpenID en el core de Drupal 6 permitía a usuarios malintencionados identificarse con cuentas de OpenID y vincularlas a usuarios ya existentes para así robar la identidad de otros usuarios. También se ha corregido este módulo para que incluya las especificaciones de OpenID 2.0.
Además, algunos de los ficheros subidos mediante file upload podían ser creados como ejecutables por Apache. El .htaccess que genera Drupal debería resolver este problema.
Finalmente, se corrige un problema con el id de la sesión que los usuarios anónimos siguen cuando se recupera un password mediante mail de confirmación. Hasta el momento ese id de sesión era reutilizable y podía ser utilizado en varias ocasiones. Esto último solo pasaba en Drupal 5.

En la nota de la release podéis encontrar más detalles.

Como siempre, es muy recomendable actualizar cuanto antes para evitar problemas, si no podemos aplicar la actualización completa, al menos sí el parche, éste para drupal 6.13 y éste otro para drupal 5.19.

Qué es jQuery

jQuery es una librería Javascript de código abierto que ayuda a desarrollar funcionalidades complejas tanto en Javascript como en Ajax (Asynchronous JavaScript + XML). Facilita la interacción de los diferentes códigos cliente y proporciona un desarrollo basado en objetos y modular para realizar aplicaciones más interactivas y con comportamientos más aparentes. Así que es una librería a utilizar tanto por aquellos que empiezan con javascript, ya que es más sencillo de utilizar para desarrollar Ajax, como por aquellos que tengan experiencia utilizando lenguajes de cliente, en este caso facilitará el desarrollo y acelerará los tiempos de implementación.

A través de jQuery se puede acceder al código DOM (Document Object Model) de las páginas HTML o xHTML y manipular sus elementos, así como cambiar propiedades de las CSS, reaccionar ante eventos o facilitar el uso de efectos y transiciones, entre otras cosas. Además, es modular y se puede extender mediante la gran cantidad de plugins existentes que complementan y habilitan funcionalidades extra que van desde efectos drag and drop a multitud de presentaciones de datos en forma de carrusel, de acordeon, etc.

Conceptos básicos de jQuery

No es el objetivo de esta entrada ser una guía de jQuery, para esto hay recursos magníficos como la propia documentación de jQuery o visual jQuery que proporciona una visión gráfica e interactiva de todas las funciones y eventos que podemos utilizar, aún así creo que es bueno que hable de un par de conceptos básicos para que, si alguien que no ha visto el uso de jQuery lee este artículo, al menos pueda entender los ejemplos.

La parte más básica de la librería es la "función" $, que representa el contexto de jQuery, por ejemplo, para añadir una propiedad css a un elemento de una página HTML, bastaría con esta sentencia:

$('p.clase_elemento').css('color', 'blue');

Con este código, el elemento o elementos de tipo p (párrafo) que tengan la clase (clase_elemento) cambiarán su color de texto a azul.
También es posible encadenar sentencias, por ejemplo para cambiar el texto de un título y además cambiar alguna propiedad de css:

$('div.contenido h2').html('texto cambiado).css('font-size', 20);

Este código reemplazará el texto del elemento o elementos de tipo h2 que estén dentro de alguna capa (div) con clase 'contenido', el nuevo texto será 'texto cambiado' y además cambiará el tamaño del mismo a 20.

Utilizando jQuery también podemos disparar acciones ante determinados eventos, por ejemplo, en el click a un link.

$('#ocultate a').click(function() {
  $(div.timido).hide();
});

Con el código de aquí arriba, cuando pulsemos (evento click) en los enlaces (anchors) que estén contenidos dentro del elemento con el id 'ocultate', los divs con la clase 'timido' se ocultarán al haberles invocado la función hide().

Además de toda la nueva funcionalidad de jQuery, se puede utilizar el código javascript como en cualquier fichero normal de tipo .js.
Podéis encontrar un listado de eventos, efectos, acciones y todo lo que se puede hacer con jQuery en la documentación que he mencionado más arriba.

Drupal 6 y jQuery

Desde la versión 5, allá por 2006, se ha incluido jQuery en el core de Drupal, convirtiéndose así en la librería "oficial" de desarrollo en javascript y Ajax para módulos y plugins en aplicaciones de Drupal. Antes de incluir jQuery, otras librerías como Dojo o Prototype fueron consideradas, pero jQuery fue elegido gracias a su estabilidad, a su tamaño ligero, y sobre todo a la colaboración de su creador, John Resig, facilitando que la licencia de la librería permitiese integrarla en Drupal. Más sobre la historia de jQuery y Drupal.

La versión de jQuery agregada en el core de Drupal varía según si es Drupal 5, que incluye jQuery 1.0, 1.1 o 1.2 o Drupal 6, que incluye jQuery 1.2 o 1.3 en sus últimas subversiones. De todas formas, el módulo jquery update permite actualizar la versión de jQuery de las diferentes versiones de Drupal.

Añadiendo ficheros jQuery

La función central para añadir ficheros con código jQuery (.js) dentro de Drupal es drupal_add_js() (referencia). Con esta función podemos añadir ficheros para un módulo, un theme o incluso pasar variables desde el código PHP a jQuery.

Por ejemplo, para añadir un fichero en un theme, podemos utlizar esta función dentro de la plantilla:
drupal_add_js('path/fichero.js', 'theme');

También se puede añadir un fichero javascript a un módulo con una llamada parecida:
drupal_add_js('path/fichero.js', 'module');

Una función muy útil para añadir ficheros javascript es drupal_get_path, que sirve para recuperar la ruta de un theme o de un módulo para poder añadir el fichero js.

Mostrar imágenes en una página web es una de las acciones que más ancho de banda consume en el servidor web, y la optimización de esta carga es uno de los puntos clave para que una web vaya rápido, y se reduzca el tráfico consumido. Es por esta razón por la que el módulo ImageCache es tan imprescindible en una instalación de Drupal que utilice imágenes.

¿Qué es ImageCache y para qué sirve?

ImageCache permite generar imágenes de diferente tamaño y dimensiones a partir de una original. A través de un interfaz gráfico de usuario se pueden programar una serie de modificaciones, llamadas presets, que serán cacheadas y permitirán mostrar una misma imágen de muchas maneras diferentes. Almacena estas versiones en ficheros a modo de caché, por lo que si en algún momento no se encuentra la imagen solicitada, se generará dinámicamente.
Es muy útil, por ejemplo, para mostrar una imagen de un tamaño menor en el preview de una noticia y una versión ampliada en la noticia completa sin necesidad de subir varios ficheros. También puede utilizarse, gracias a su interfaz con Views para generar galerías de imágenes con miniaturas, o gracias a otros módulos que extienden la funcionalidad de ImageCache, es posible manejar las imágenes del perfil del usuario, sobreponer texto encima de la imágen, marcas de agua, versiones con colores alterados, etc.

¿Con qué módulos interactúa ImageCache?

  • ¿Qué módulos necesita?
    Para instalar ImageCache, necesitamos haber habilitado antes los módulos ImageAPI y uno de los motores de manejo de imágenes, ImageMagik o GD, y además el módulo Transliteration, que sanitiza el nombre de los ficheros subidos, de esta forma los nombres de las imágenes manejadas por ImageCache no tendrán problemas de caracteres extraños.
  • ¿Qué módulos utilizan ImageCache?
    Existen multitud de módulos que utilizan ImageCache, el principal seguramente es Views, ya que tiene total integración cuando se crean imágenes utilizando ImageField de CCK, por lo que cuando creamos una vista podemos asignarle el aspecto que queramos a través de las presets que hayamos definido previamente en el interfaz de usuario.
    El Taxonomy Image permite asociar imágenes a las taxonomías de nuestro sitio y además utiliza ImageCache si lo tenemos instalado.
    Otros módulos que utilizan ImageCache son Ubercart, para mostrar el catálogo de una tienda online, módulos de galerías de imágenes (Galleria, Fast Galery, HighSlide), o de efectos de jquery (jQuery Lightbox, Thickbox) entre otros muchos.

Han pasado 49 días desde la última actualización de seguridad para Drupal que nos dejó el versionado en la 6.12 / 5.18 y hoy mismo ha salido una nueva versión que corrige vulnerabilidades.
Este nuevo parche proporciona una solución para varias debilidades de seguridad en el core de Drupal

  • Un problema en la obtención de los argumentos de la URL en el módulo forum de la versión 6.x hace que nuestro sitio sea vulnerable a Cross Site Scripting.
  • Al modificar el formato de entrada de los comentarios, si estos tienen un formato demasiado permisivo (como full html o incluso php filter), permite, en Drupal 6, que los usuarios puedan inyectar código a través de sus firmas.
  • Si un usuario se equivoca en los datos de login en una página que contiene tablas con cabeceras "ordenables", los datos son incluidos en la tabla, haciéndolos visibles a través de links a usuarios maliciosos, esto pasa tanto en drupal 5 como drupal 6.

Además, la versión 5.19 contiene la corrección de dos bugs mas y la 6.13 contiene hasta 24 modificaciones, entre corrección de bugs y temas de documentación.

Como siempre, es muy recomendable actualizar cuanto antes para evitar problemas, si no podemos aplicar la actualización completa, al menos sí el parche, éste para drupal 6.12 y éste otro para drupal 5.18.

Si tenéis dudas de cómo se aplican estos parches, en drupal.org hay un paso a paso.

De la charla de Views 2 que hice en drupal.cat salieron muchos ejemplos interesantes de utilización de vistas que quiero ir mostrando en diferentes videos, hoy es el turno de un ejemplo de vistas con relaciones y argumentos.

¿qué son los argumentos y las relaciones?

En otro artículo anterior ya he ofrecido mi definición de argumentos para vistas en drupal, vamos ahora a definir qué es una relación.
Las relaciones en las vistas para drupal permiten mostrar contenido de varios origenes diferentes que tengan alguna relación entre sí. Normalmente querremos utilizar esta funcionalidad de Views 2 para mostrar tipos de contenido que se relacionan entre sí mediante node reference o contenido de usuarios relacionado con user reference.

Para nuestro ejemplo, he partido de un tipo de contenido Lugar, que tiene información sobre diferentes lugares y un tipo de contenido Viaje, que cada usuario crea cuando viaja a un Lugar y que tiene un node reference apuntando a dicho Lugar. La vista que vamos a crear nos permitirá mostrar los lugares que ha visitado cada usuario, un contenido que sin utilizar relationships sería mucho más complejo y laborioso de mostrar.

¡todo se vé más fácil en un video!

Nota importante: Blip.tv no soporta todavía los subtítulos automáticos, por lo que antes de reproducir el video es conveniente que pulseis en CC y seleccionéis Spanish.

recursos

Para poder exportar / importar los tipos de contenido, es necesario tener activado el módulo Content Copy, que viene con CCK.
Es recomendable tener el módulo ImageCache activado para cargar la vista.