web-dev-qa-db-fra.com

Comment obtenir hook_install () pour exécuter tous les hook_update_N ()?

Comment puis-je obtenir hook_install () pour exécuter toutes les mises à jour que j'ai pour mon module? J'ai dedans le fichier mymod.install.

J'ai essayé

function mymod_install() {
  mymod_update_6001();
}

mais il ne semble rien faire. Si j'ai un mymod_update_6002 (), est-ce que j'appellerai toujours 6001 (), il suffit d'appeler 6002 () ou d'appeler les deux dans l'ordre 6001 (), 6002 ().

J'ai pensé qu'il serait judicieux d'exécuter toutes les mises à jour lorsque vous avez installé un module par défaut.

18
Lucy

Vous ne devriez pas obtenir votre hook d'installation pour exécuter les mises à jour. Lorsqu'un module est installé pour la première fois, aucune mise à jour ne devrait être nécessaire.

Les mises à jour sont utilisées lorsque le module est déjà installé (la base de données ou les variables ont été créées). Dans ce cas, vous ne voulez pas réinstaller le module car il effacera toutes les données, au lieu de cela, vous créerez des hooks update_N. Drupal détectera les mises à jour nécessaires et celles-ci seront exécutées en allant à update.php. Dans Drupal 6, il sélectionne automatiquement les mises à jour à faire, mais vous pouvez le changer, ce qui n'est pas possible dans Drupal 7.

Drupal détecte les mises à jour nécessaires en enregistrant le numéro de la dernière mise à jour de l'exécution. Cela peut être des changements dans la base de données, ce qui permettra de relancer les mises à jour dans Drupal 7. La réexécution des mises à jour est généralement une mauvaise idée et provoquera le plus souvent des erreurs et peut dans certains cas gâcher vos données.

N'oubliez pas de sauvegarder votre base de données avant d'exécuter des mises à jour.

19
googletorp

Le but des crochets est différent.

  • hook_install () est invoqué lorsqu'un module est installé; cela signifie que le module n'a pas été installé auparavant et qu'il n'a donc pas besoin d'être mis à jour.
  • hook_update_N () est invoqué lorsqu'un module est déjà installé et doit être mis à jour.

Si certaines tâches doivent être effectuées à la fois lorsque le module est installé et lorsque le module est mis à jour, le code doit être présent dans les deux crochets. Il n'y a pas de module qui appelle tous les hooks de mise à jour pendant l'installation, et ce serait particulièrement faux lorsque les fonctions de mise à jour mettent à jour le schéma des tables de base de données utilisées à partir du module; hook_schema () devrait toujours renvoyer le schéma mis à jour, et la mise à jour du schéma également avec les fonctions de mise à jour serait erronée.

Le code que vous avez écrit ne fonctionne pas car l'appel d'une des fonctions de mise à jour n'exécute pas automatiquement toutes les autres fonctions de mise à jour.
L'appel des fonctions de mise à jour à partir de l'implémentation de hook_install() est incorrect, car il est incorrect d'appeler une fonction de mise à jour à partir d'une autre; s'il y a du code qui doit être exécuté à partir de deux ou plusieurs fonctions de mise à jour, alors ce code doit être placé dans une fonction qui est appelée à partir des fonctions de mise à jour, et à partir de hook_install(), si nécessaire.

15
kiamlaluno

Le hook d'installation n'est appelé que lorsque le module est fraîchement installé, il n'y a donc pas besoin de mises à jour. Les mises à jour sont exécutées uniquement lorsque le module est déjà installé, il peut donc appliquer des modifications supplémentaires.

Pour forcer l'exécution des fonctions de mise à jour lors de l'installation, vous devez modifier la version de votre schéma, par exemple:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

Ou lancez-le depuis drush: drush -y updb.

Voir aussi: Est-il possible de forcer l'exécution du hook de mise à jour de votre module?

5
kenorb

hook_install ne fonctionnerait pas avec dans le fichier mymod.module.

Vous devez placer hook_install Et hook_uninstall Dans un fichier séparé mymod.install

Je suppose que hook_update_N() devrait également être placé dans mymod.install


Réponse après la mise à jour de la question:

Citant d'un lien , veuillez vérifier votre numéro de version dans le fichier d'informations.

Étant donné que je développe en privé et non pour une contribution, mon champ 'VERSION' dans le fichier .info de mon module est soit vierge soit inchangé lorsque je mets à jour un module. J'utilise actuellement Subversive pour Eclipse PDT et donc les numéros de version de mes fichiers d'informations ne sont jamais mis à jour. Ainsi, mon hook_update_6001 n'était PAS appelé par update.php.

1
Shoaib Nawaz