¿Cómo hacer que hook_install () ejecute todo hook_update_N ()?

18

¿Cómo puedo obtener hook_install () para ejecutar todas las actualizaciones que tengo para mi módulo? Tengo en él el archivo mymod.install.

Yo he tratado

function mymod_install() {
  mymod_update_6001();
}

pero no parece hacer nada. Si tengo un mymod_update_6002 () todavía llamaría al 6001 (), simplemente llame al 6002 () o llame a ambos en el orden 6001 (), 6002 ().

Pensé que sería lógico ejecutar todas las actualizaciones cuando instaló un módulo de forma predeterminada.

Lucy
fuente

Respuestas:

19

No debería obtener su gancho de instalación para ejecutar actualizaciones. Cuando se instala un módulo por primera vez, no deberían ser necesarias actualizaciones.

Las actualizaciones se utilizan cuando el módulo ya está instalado (se han creado la base de datos o las variables). En ese caso, no desea reinstalar el módulo, ya que borrará todos los datos, en su lugar, crear ganchos update_N. Drupal detectará qué actualizaciones son necesarias y a las que se ejecutará update.php. En Drupal 6, seleccionará automáticamente qué actualizaciones hacer, pero puede cambiarlo, mientras que esto no es posible en Drupal 7.

Drupal detecta qué actualizaciones son necesarias guardando el número de la última actualización ejecutada. Esto puede ser cambios en la base de datos, lo que permitirá volver a ejecutar las actualizaciones en Drupal 7. Volver a ejecutar las actualizaciones suele ser una mala idea y con frecuencia causará errores y, en algunos casos, puede dañar sus datos.

Siempre recuerde hacer una copia de seguridad de su base de datos antes de ejecutar actualizaciones.

googletorp
fuente
15

El propósito de los ganchos es diferente.

  • hook_install () se invoca cuando se instala un módulo; significa que el módulo no se instaló previamente y, por lo tanto, no necesita actualizarse.
  • hook_update_N () se invoca cuando un módulo ya está instalado y debe actualizarse.

Si hay algunas tareas que deben realizarse tanto cuando se instala el módulo como cuando se actualiza el módulo, entonces el código debe estar presente en ambos ganchos. No hay ningún módulo que invoque todos los enlaces de actualización durante la instalación, y eso sería especialmente incorrecto cuando las funciones de actualización actualizan el esquema de las tablas de la base de datos utilizadas desde el módulo; hook_schema () siempre debe devolver el esquema actualizado, y actualizar el esquema también con las funciones de actualización sería incorrecto.

El código que escribió no funciona porque llamar a una de las funciones de actualización no ejecuta automáticamente todas las demás funciones de actualización.
Llamar a las funciones de actualización desde la implementación de hook_install()es incorrecto, ya que es incorrecto llamar a una función de actualización desde otra; Si hay algún código que debe ejecutarse desde dos o más funciones de actualización, entonces ese código debe colocarse en una función que se llama desde las funciones de actualización, y desde hook_install(), si es necesario.

kiamlaluno
fuente
5

El gancho de instalación solo se llama cuando el módulo está recién instalado, por lo que no es necesario realizar ninguna actualización. Las actualizaciones se ejecutan solo cuando el módulo ya está instalado, por lo que puede aplicar cambios adicionales.

Para forzar que las funciones de actualización se ejecuten en la instalación, debe cambiar la versión de su esquema, por ejemplo:

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();
}

O ejecutarlo desde drush: drush -y updb.

Consulte también: ¿Es posible forzar la ejecución del enlace de actualización de su módulo?

kenorb
fuente
1

hook_install no funcionaría en el mymod.modulearchivo.

Tienes que colocar hook_instally hook_uninstallen un archivo separadomymod.install

Supongo que eso hook_update_N()también debería colocarse enmymod.install


Respuesta después de la pregunta actualizada:

Citando desde un enlace , verifique su número de versión en el archivo de información.

Como estoy desarrollando de forma privada y no para contribuir, mi campo 'VERSIÓN' en el archivo .info de mi módulo está en blanco o sin cambios cuando actualizo un módulo. De hecho, estoy usando Subversive para eclipse PDT y, por lo tanto, los números de versión de mis archivos de información nunca se actualizan. Por lo tanto, mi hook_update_6001 NO estaba siendo llamado por update.php.

Shoaib Nawaz
fuente