Hook_update_N para procesos durante el despliegue o actualización de un proyecto

En el post anterior veíamos como se podía usar hook_update_N para actualizar la creación de alias de urls cuando se actualizaba/desplegaba un nuevo proyecto. En este post vamos a ver otros códigos que pueden ser también igualmente interesantes, son snipets que he encontrado por la red, y en algunos casos he usado o modificado para diferentes proyectos.

De Drupal.org he encontrado los siguientes snipets que es interesante tener localizados.



En mymodule.install definimos la función de actualización

<?php
/**
 * Add new field to field data and revision tables.
 * $spec es el nuevo campo que queremos agregar a la tabla. 
 */
function mymodule_update_7100(&$sandbox) {
 
$spec = array(
   
'type' => 'varchar',
   
'description' => "New Col",
   
'length' => 20,
   
'not null' => FALSE,
  );
 
$data_table_name = 'field_data_field_myfield';
 
$revision_table_name = 'field_revision_field_myfield';
 
$field_name = 'field_myfield_newfield';
 
db_add_field($data_table_name, $field_name, $spec);
 
db_add_field($revision_table_name, $field_name, $spec);
}
?>



Creacción de una nueva tabla, la función en mymodule.install

<?php
/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
 
$schema['mytable2'] = array(
    
// Definimos aquí al tabla usando el schema api.
 
);
 
db_create_table('mytable2', $schema['mytable2']);
}
?>


Agregar varios campos a la vez a una tabla

<?php
/**
 * Add new fields to 'mytable' table.
 */
function MYMODULE_update_7001() {
 
$fields = array(
   
'field_name_1' => array(
     
'description' => 'Field name 1',
     
'type' => 'varchar',
     
'length' => '32',
     
'not null' => FALSE,
     
'default' => '',
    ),
   
'field_name_2'=> array(
     
'description' => 'Field name 2',
     
'type' => 'varchar',
     
'length' => '32',
     
'not null' => FALSE,
     
'default' => '',
    ),
   
'field_name_3' => array(
     
'description' => 'Field name 3',
     
'type' => 'varchar',
     
'length' => '128',
     
'not null' => FALSE,
     
'default' => '',
    ),
  );
  foreach (
$fields as $key => $field)  {
    if (!
db_field_exists('mytable', $key)) {
     
db_add_field('mytable', $key, $field);
    }
  }
}
?>


Modificar el peso de un módulo

<?php
function mymodule_update_7100() {
 
db_update('system')
      ->
expression('weight', ':weight', array(':weight' => 5))
      ->
condition('name', 'mymodule')
      ->
condition('type', 'module')
      ->
execute();
}
?>


Borrar campos de una tabla
http://dropbucket.org/node/668


<?php
/**
* Implements hook_update_N().
*
* Based on 6.x-era code from Fox,
* http://drupal.foxinbox.org/drupal/code-snippits/remove-fieldsgroup-code
*/
function module_name_update_7001() {
 
$fields_to_delete = array(
   
'field_cost',
   
'field_construction_budget',
   
'field_construction_cost',
   
'field_total_budget',
    );
  foreach (
$fields_to_delete as $field_name) {
   
field_delete_field($field_name);
   
watchdog(
     
'module_name',
     
'Deleted the :field_name field from all content type instances.',
      array(
':field_name' => $field_name));
  }

  /**
   * The fields aren't really deleted until the purge function runs, ordinarily
   * during cron.  Count the number of fields we need to purge, and add five in
   * case a few other miscellaneous fields are in there somehow.
   */
 
field_purge_batch(count($fields_to_delete) + 5);

  // THEN, in case of field type change, revert the feature
 
features_revert(array('module_name' => array('field')));
}
?>



Revertir una feature

<?php
/**
 * Implementes hook_update_N()
 */
function mymodule_update_7001();{
 
features_revert(array('feauters_names'));
}
?>


Activar un módulo
http://befused.com/drupal/site-deployment-module


<?php
/**
 * 1st Deployment: enable contact, book; disable devel, coder; enable garland;
 */
function mymodule_update_7001() {
 
module_enable(array('contact', 'book'));
 
module_disable(array('devel', 'coder'));
 
theme_enable(array('garland'));
}

?>



Limpiar cache

<?php
/**
 * Implementes Hook_update_N()
 */
function mymodule_update_N(){
cache_clear_all();
}
?>

A la hora de actualizar tenemos dos opciones, por un lado podemos usar el script de update.php y por otro lado podemos usar el comando de Drush updb. Recordad que todo aquello que lo ejecutemos por Hook_Update_N se queda en el control de versiones y es más fácil controlar que hemos hecho.

Un saludo.

Oskar

pd: algunos enlaces con scripts intersantes:

http://www.metaltoad.com/blog/how-write-drupal-update-scripts
http://drupal.stackexchange.com/questions/111717/change-field-type-with-hook-update-n-for-a-module
http://drupal.stackexchange.com/questions/32986/change-database-column-type-in-hook-update-n