Astuce [D7] hook_update()

Description

Dans Drupal, le hook_update() permet d'exécuter du code PHP à la mise à jour d'un module.

Imaginons par exemple que vous ayez un numéro de version de votre site web, enregistré dans une variable drupal. Lors de la mise à jour de votre site, vous souhaiter incrémenter ce numéro de version.

Il suffit d'utiliser le hook_update(), et lorsque le module sera mis à jour, l'incrémentation sera appliquée automatiquement.

De plus, si vous avez plusieurs hook_update(), il seront tous exécutés un à un, dans l'ordre, lors de la mise à jour. Lors des mises à jour suivantes seuls les nouveaux hooks n'ayant pas encore été exécutés le seront.

Application

Hook

Par convention, ce hook doit être utilisé dans le fichier mon_module.install :

/**
 * Update v1.0.1
 */
function mon_module_update_7101() {
  variable_set('mon_site_version', '1.0.1');
}

Explication :

Le numéro à la fin du hook correspond à la version du module. Le premier chiffre, par convention, désigne la version majeure de drupal utilisée.

Mise à jour du module

Une fois la nouvelle version du module déployée sur votre site, vous devez lancer la mise à jour. Cela peut-être fait en back-office dans la page de gestion des modules, ou mieux, via une commande drush :

drush updb -y

Mises à jours successives

Imaginons que vous ayez passé cette première mise à jour (7101) sur l'un de vos sites (exemple : l'instance de production), et qu'entre temps vous ayez créé deux nouvelles versions du module.

Le fichier mon_module.install devient :

/**
 * Update v1.0.1
 */
function mon_module_update_7101() {
  variable_set('mon_site_version', '1.0.1');
}

/**
 * Update v1.0.2
 */
function mon_module_update_7102() {
  variable_set('mon_site_version', '1.0.2');

  // Autres traitements
}

/**
 * Update v1.0.3
 */
function mon_module_update_7103() {
  variable_set('mon_site_version', '1.0.3');

  // Autres traitements
}

Si vous lancez la mise à jour sur votre instance de production, les fonctions mon_module_update_7102() et mon_module_update_7103() seront exécutées dans cet ordre.

La fonction mon_module_update_7101() elle, ne sera pas exécutée.