Desarrollar un sitio web en Drupal puede ser muy simple (unas páginas dinámicas usando un tema existente), medio-complicado (juntar muchos módulos y generar con ellos páginas con vistas, que no tienen soporte en ningun tema) o increiblemente complejo (desarrollar módulos de interacción entre varias fuentes de datos, con un diseño propio, con un cliente que no tiene claro lo que quiere, colaborando con 4 otras personas para hacer el trabajo más rápido).
En el último caso, cuando acaba el trabajo (si algun día se acaba), no tendrá muchas ganas de volver a hacer la misma cosa. Si es cierto que la ciencia informática permite automatizar las cosas eficientemente, nunca lo permite sin esfuerzos. La pregunta entonces es: a partir de cuando empezamos a poner en marcha un sistema que permita reusar un trabajo anterior con considerables modificaciones para entregar a otro cliente más rápido. En el mundo del software libre, a veces, se juntan las piezas de una forma tan exquisita que esta pregunta pueda ser fácil de contestar: alguién ya hizo el trabajo más importante, solo me falta estudiar un poco el tema y asegurarme que puedo reusar su trabajo de forma óptima.
Esto es lo que ocurre en la actualidad con el módulo Features de Drupal (desarrollado entre otros por los chicos de Development Seed, una empresa de Estados Unidos que tiene trás ella una serie de cumplimientos en el desarrollo y la entrega de módulos y distribuciones Drupal), que permite en resumen recuperar las acciones manuales del site builder, del themer y del desarrollador para la construcción de un sitio dentro de un archivo y exportarlo hacia otro sitio web para despliegue rápido.
Si bien existe el módulo, hay una serie de pasos que deberán conocer para poder usarlo de forma óptima, que se traducen en una serie de herramientas de las cuales deberá disponer.
Las herramientas
- Módulo Drush
- Módulo Diff
- Módulo Ctools
- Módulo Content (para exportar nodos)
- Módulo Boxes (para exportación de bloques de contenido)
- Módulo Strongarm (para exportar variables)
- Módulo Features
- Módulo Views (no es necesario, pero lo usaremos en esta explicación)
- Módulo Admin Menu (no es necesario, pero nos ayudará a ganar tiempo)
- Sistema de control de versiones (SVN, Git, Mercurial, …)
- Servidor de features (para tener un lugar donde almacenar estas funcionalidades y de donde compartirlas)
Como proceder
Lo mejor (y explicaremos porqué a continuación) es iniciar el desarrollo de su sitio *con* el módulo Features instalado. Esto permite tener un seguimiento de los cambios que se hacen en estas funcionalidades a medida que estemos avanzando. Si no lo tiene desde el inicio, todo este historial de cambios que hicimos para arreglar cosas según requerimientos del cliente estará perdido para siempre. En lugar de esto, queremos tener una estructura lista para el desarrollo “sostenible” de nuestro sitio cuando antes.
Paso 1: Instalación de Drupal
Instalar Drupal es un tema que ya debería conocer super bien para poder aprovechar de esta guía. Sino, mejor deje de leer de inmediato y vaya a la página de Drupal.org sobre el tema: http://drupal.org/documentation/install
La versión 6 que instalaremos, aunque no la última versión estable, es todavía la más adecuada en razón de los múltiples módulos que vamos a usar, los cuales no tienen todos una implementación estable en Drupal 7. Descargue la última versión estable de Drupal 6 aquí.
Paso 2: Instalar los módulos
El módulo Drush es una maravilla. Nos hace el trabajo de instalación de módulos mucho más simple si es que tenemos acceso a una línea de comandos. Si tiene, no dude en usarlo. Sino, pues faltará descargar cada uno de los módulos requeridos, subirlos al FTP y activarlos para su sitio. A continuación estamos asumiendo que tiene el módulo Drush y que no teme usarlo.
Descargue el módulo Drush y actívelo para su sitio. De ahí, vaya en la subcarpeta de “sites” que corresponde a su sitio y lanza los comandos siguientes para descargar e instalar los módulos:
$ php5 drush.php dl diff ctools content boxes strongarm features views $ php5 drush.php pm-enable diff ctools content boxes strongarm features views
De ahí podemos conectarnos al sitio nuevamente, y activar a mano (porque son muchos y así es más práctico en este caso) los módulos que faltan (para la demo puede activar todos los submódulos de los que acabamos de instalar y que no tengan dependencias insatisfechas).
Paso 3: Crear funcionalidades
Ahora vamos a tener que crear algo, para que el módulo Features pueda exportarlo. Una de las cosas más simples de hacer (ahora que tenemos el módulo Boxes) es crear un bloque (o mejor dicho una caja – “Box”). Vamos en el menú de administración a Administer -> Site building -> Blocks y le pinchamos “Add box”. Es importante aquí de conocer la diferencia entre un bloque y una caja: una caja se puede editar directamente en la página, y es simplemente una extensión del módulo block. Permite las mismas cosas, pero también permite la edición en línea y (la razón por la cual lo instalamos) exportarse desde el módulo Features.
En la creación de la caja, simplemente le llenamos unos datos y le damos un “nombre máquina”, que es un identificador único en el sistema para este bloque.
Es importante siempre usar la creación de cajas (“Add box”) y no de bloques (“Add block”) desde aquí en adelante, para que todos puedan ser exportados.
De una manera similar, podemos crear elementos de menú. Ellos estarán disponibles luego en la página de creación de Features.
Otro contenido que podemos crear es una vista (“Views”), pero el tema aquí es bien extenso. Asegurese de revisar la documentación de Views o algún tutorial, porque puede demorar bastante tomarlo en manos.
Paso 4: Exportar funcionalidades
En cualquier caso, una vez que tenga contenido creado, dirigese a la pantalla de Features (Administer -> Site building -> Features).
Tomemos un tiempo aquí para reflexionar sobre los Features para saber como llamar nuestra funcionalidad… Un “feature” es una funcionalidad que queremos exportar para reusarla en otro sitio. Si voy a usar Features de forma extensa, podría encontrarme rápidamente con una serie de paquetes “blog” o “galeria” que tendrían el mismo nombre pero montones de micro funcionalidades distintas. Una funcionalidad puede “incluir” varios módulos como dependencia, y estos módulos proveer tipos de contenidos, vistas y temas. Una funcionalidad también puede incluir variables del sistema (desde la tabla variables de Drupal), que definen ciertos parámetros (como por ejemplo una clave para activar un módulo).
Por lo tanto, es importante escoger bien su título. Si va a realizar una funcionalidad propia a un cliente en el sector agrícola, use un prefijo agri_ por ejemplo. Si esta funcionalidad es mayormente visual, use agri_display_ y, si se trata de una galeria de fotos siendo generalmente paisajes, agri_display_landscape_gallery. Si va a compartir estas funcionalidades con otros equipos (de otro idioma) o su empresa tiene sedes en el extranjero, siempre es una buena idea darle un nombre en ingles. La falta de acentos/tildes en el idioma Inglés y la imposibilidad de usarlos para nombres de Features también hace esta lógica más práctica.
Una vez seleccionado el nombre de su funcionalidad y su versión (use los ejemplos proveídos y las convenciones de numeración de los módulos Drupal para dar un número de versión), seleccione los componentes que quiere que incluya: Boxes, Dependencies, Menus, Menu links, Content types, Permissions y Roles son los tipos que se pueden extraer naturalmente para incluirlos en una funcionalidad. Pinchar “Download feature” le generará un archivo comprimido. Descarguelo.
Paso 5: Importar funcionalidades
El archivo comprimido (.tar, no .tar.gz) se encuentra ahora en su escritorio. Tiene que ponerlo en la carpeta sites/[su sitio]/modules/custom/ y descomprimirlo. De ahí, ir a “Administer -> Site building -> Features -> Manage” y aparecerá el módulo agri_display_landscape_gallery (en mi ejemplo). Lo activo con el checkbox y presionando “Save settings”.
Bueno, de ahí no cambia mucho. Es que ya tengo mi bloque y mis elementos de menu, vistas, etc. Al importar la funcionalidad, el sistema detectó que no había nada que hacer (gracias a los identificadores únicos de estas cositas) pero me deja el estado a “Disabled”. Para activarla, selecciono la cajita adelante y guard con “Save settings”.
Importar este Feature en un nuevo sitio me permite obtener directamente mi bloque de prueba, mis menús y otros objetos que exporté. Esta es la primera ventaja del módulo Features.
Paso 6: Seguimiento
Ahora vamos a hacer una cosa que debería hacerles entender de una vez a que sirve todo eso. Vaya editar el bloque (perdón, la caja) y refresque la página de Features. El estado se pone a “Overridden”… El sistema ha detectado que había ocurrido un cambio entre mi activación de la funcionalidad y mi cambio de bloque! Ahora puedo guardar este módulo nuevamente, pero con otra versión, usando la opción “Recreate”. La única cosa que tengo que cambiar ahí (para que se considere una nueva versión de la funcionalidad) es modificar el número de versión.
Si quiero revisar las modificaciones que se hicieron dentro de mi Feature, nada más simple: gracias al módulo Diff que hemos instalado, tengo una pestaña que indica “Review overrides”. Esto me especifica, en lenguaje informático, que cambios fueron registrados en mi sistema desde la última versión. Esto nos da la ventaja dos de Features: puedo ver claramente que cambios se han hecho (incluido los cambios visuales) entre dos versiones de mi sitio.
Si quiero reiniciar todo el contenido de mi sitio para ver que tan bien recrea toda mi estructura gracias a mi Feature, puedo usar el módulo Demo.
Pasos adicionales
En este episodio no cubriré la funcionalidad de actualización por Drush, porque necesitaremos un servidor de Features primero, lo que no tengo listo todavía.
Servidor de Features (incompleto)
Para instalar el servidor de Features, se requieren unos pasos más, pero es práctico reusar lo definido anteriormente porque una gran parte de los requerimientos de los pasos anteriores son requerimientos del servidor de Features:
- Módulo Context
- Módulo Features (instalado anteriormente)
- Módulo CCK (o “Content”)
- Módulo FileField (incluído en módulo CCK, o “Content”)
- Módulo Menu (core)
- Módulo Node (core)
- Módulo Node Reference (incluído en módulo CCK, o “Content”)
- Módulo Number (incluído en módulo CCK, o “Content”)
- Módulo Strongarm (instalado anteriormente)
- Módulo Views (instalado opcionalmente en los pasos anteriores)
- Módulo Chaos Tools (o CTools, instalado anteriormente)
- Módulo Text (incluído en módulo CCK, o “Content”)
- Módulo Option Widgets (incluído en módulo CCK, o “Content”)
Una vez estos y el módulo de Features Server instalados, verá que puede crear 3 nuevos tipos de contenido:
- Distribution (que es un paquete dedicado a hacer un uso específico de todo un sitio Drupal – se supone que contiene todas las funcionalidades necesarias)
- Project (que puede ser Installation profile, Module o Theme y que sirve para paquetes más pequeños de funcionalidades)
- Release (que es una versión específica de un Feature)
En la ausencia de integración con un servidor de versiones, este paso es suficiente para compartir sus Features con otras personas. El servidor tendrá que ser disponible para los demás (URL pública o dirección IP interna), y los demás usuarios podrán descargar actualizaciones de las funcionalidades (o usted podrá descargar actualizaciones desde el servidor de producción). Esto no incluye todavía el URL del servidor que permita quedar informado sobre las nuevas versiones disponibles, pero ya tenemos un paso.
Bibliografía
- http://sf2010.drupal.org/conference/sessions/managing-and-deploying-configuration-exportables-and-features-module es probablemente el vídeo (en Inglés) más completo que podrá encontrar sobre los orígenes del módulo Features, sus principios básicos y como usarlo
- http://drupal.org/node/580026 es un excelente manual (en Inglés) sobre el uso del módulo Features
- http://drupalcode.org/viewvc/drupal/contributions/modules/features/API.txt?revision=1.1.2.5&view=co&pathrev=DRUPAL-6–1 contiene especificaciones de cómo empaquetar una funcionalidad (“feature”) para que sea fácilmente intercambiable con otros
- http://mustardseedmedia.com/podcast/episode43 es un vídeo (en Inglés) que no consulté pero que explica también como usar el módulo Features
- http://developmentseed.org/blog/2009/sep/03/5-minute-feature-server es un excelente artículo en Inglés que me clarificó un poco el tema del Features server: más que nada para saber que URL usar para declarar un servidor de updates para mis Features