Julio 15, 2013
enzo
Cuando hacemos desarrollo de módulos contribuidos o no y agregamos nuevas funcionalidades que afecta la estructura de tablas creadas por nuestros módulos, lo mas tentador es correr un script de SQL para realizar los cambios en nuestros sistemas de producción. Aunque esto en la practica es efectivo, suele traer problemas porque no llevamos en nuestro código un trasiego de los cambios de hechos a las tablas.
Afortunadamente Drupal nos permite realizar esto usando funciones que se ejecutan en el proceso de update que se puede realizar con Drush o accediendo a la URL example.com/update.php.
A continuación aplicar estas actualización.
- Como definir un update.
Para hacer esta modificación debemos implementar el hook hook_update_N() y esta implementación debe quedar en el archivo .install de nuestro módulo.
Además de hacer el remplazo nombre de hook por el nombre del módulo debemos definir el valor de N , en este ejemplo crearemos una función llamada MIMODULO_update_7250 y veamos la explicación del numero
- 7: Compatibilidad con versión de Drupal 7 (usar 8 para drupal 8)
- 2. Compatibilidad con release del modulo 7.x-2*
- 50. Secuencia de función de update dentro del release.
1.1 Agregar un campo a una tabla.
Ahora veamos la implementación
/**
* Change field session_name to increase length to 64.
*/
function MIMODULO_update_7250() {
db_add_field('adb', 'role_permissions', array('type' => 'text', 'not null' => FALSE, 'size' => 'medium'));
return t('Added role_permissions column to adb table.');
}
El comentario de esta función es muy importante, porque sera el mensaje que se le presentara al administrador del sitio sobre las acción que ejecutara el update.
Para agregar un campo al schema (tabla) adb se utilizara la función db_add_field al cual se le pasa el nombre de la tabla, el nombre del campo y su definición. Para finalizar solo enviamos un mensaje indicando que operaciones se realizaron.
1.2 Modificar un campo de una tabla
Para realizar esta operación declararemos otra función de update, como se puede apreciar en el siguiente listado de código.
/**
* Change field session_name to increase length to 64.
*/
function MIMODULO_update_7251() {
db_change_field('adb', 'session_name', 'session_name',
array('type' => 'varchar', 'not null' => TRUE, 'length' => 64, 'description' => 'Session variable name to get the value' ),
array())
;
return t('Changed session_name column part of adb table.');
}
En este caso se uso la función db_change_field a la cual debemos enviar el nombre de schema (tabla), nombre del campo, nuevo nombre del campo y la definición del campo para definir que propiedades se deben cambiar. También se definió un mensaje para presentar al usuario.
Cuando se cambiar un campo es necesario reconstruir los indices creados para este campo.
Espero que haya sido de su agrado.