Drupal 7

Continuamos con el ejemplo de acceso a base de datos en Drupal 7 que comenzamos hace unos días. Puedes consultar la primera parte del artículo para refrescar o si simplemente te la perdiste.

En esta segunda parte vamos a ver cómo:

  • Crear un formulario para que el usuario pueda crear un nuevo registro en nuestra tabla de issues.
  • Usar el mismo formulario para modificar los datos de una incidencia.
  • Eliminar el registro de una incidencia de la tabla.

 

Estamos haciendo unas sesiones de formación en el trabajo con Drupal 7, y nos ha quedado un ejercicio bastante completo que creo que merece la pena publicar por si puede ayudar a alguien mas.

La idea es mostrar cómo podemos crear un módulo en Drupal 7 que cree su propia tabla en la base de datos, y realizar operaciones sobre ella usando la API de acceso a datos de Drupal.

Para este ejemplo vamos a crear un módulo que nos permita gestionar una tabla sencilla de incidencias (Issues). Los objetivos va a ser:

Me ha costado pero por fin he publicado mi primer módulo en Drupal.org. Se llama Related by Terms y básicamente crea un bloque para mostrar contenido relacionado con el nodo que estamos viendo.

Para calcular las relaciones con otros nodos estoy utilizando los términos de taxonomías, de forma que se cuentan las coincidencias en términos del nodo actual, y aparecerán primero en la lista los nodos con mas coincidencias.

El módulo Localization update (l10n_update) de Drupal nos permite mantener las traducciones de nuestro sitio actualizadas automáticamente. Basta con instalarlo:

drush dl l10n_update

drush en -y l10n_update

Y después podremos ejecutar un par de comandos de Drush para actualizar las traducciones:

drush l10n-update-refresh
drush l10n-update --languages=es

El módulo tambien dispone de una pantalla de configuración para hacer lo mismo en admin/build/translate/update

Tratando de importar una copia de base de datos que había creado con drush sql-dump en otro servidor, me he encontrado con este error de MySQL:

ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 767 bytes

El comando que estaba usando era bastante normal:

drush sql-cli <  ../backup.sql

Después de intentar varias opciones, también he llegado a ver este otro error:

ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes.

Usando Drush podemos actualizar nuestro sitio Drupal tranquilamente desde la línea de comandos. El comando es:

drush pm-update

O podemos usar su alias, mas cómodo.

drush up

Drush en este caso va a hacer unas cuantas cosas:

  • Actualizar core de Drupal, descargando los archivos necesarios de la última versión.
  • Actualizar todos los módulos contrib a su ultima versión, descargando sus archivos.
  • Ejecutar los cambios de base de datos pendientes de todos los módulos actualizados.

A partir de aquí, tenemos varias opciones que nos permitirán hacer estas tareas por separado. Vamos a ver las mas comunes.

Podemos modificar los datos de un usuario por codigo usando las funciones de la API de Drupal, user_load y user_save.

$edit = array();
$user = user_load($uid);

$edit['field_nombre_del_campo']['und'][0]['value'] = "nuevo valor que yo quiera";


user_save($user, $edit);

De esta forma realizamos todos los cambios que necesitemos en una estructura aparte ($edit), sin tocar el objeto $user original, lo que nos permitirá realizar cuantas comprobaciones y validaciones necesitemos sobre el valor original de los campos, y realizar todos los cambios al final de una vez.

En la documentación original de la función esta explicado, y teneis unos cuantos comentarios útiles sobre su uso, eso si, en inglés.

https://api.drupal.org/api/function/user_save/7