如何获取hook_install()以运行所有hook_update_N()?


18

如何获取hook_install()来运行模块的所有更新?我有mymod.install文件。

我试过了

function mymod_install() {
  mymod_update_6001();
}

但它似乎无能为力。如果我有mymod_update_6002(),我仍会调用6001(),只需调用6002()或同时按6001(),6002()的顺序调用它们。

我认为在默认情况下安装模块时运行所有更新是常识。

Answers:


19

您不应该安装钩子来运行更新。首次安装模块时,无需更新。

在已经安装模块(已创建数据库或变量)的情况下使用更新。在这种情况下,您不想重新安装该模块,因为它将擦除所有数据,而是创建update_N挂钩。Drupal将检测到需要哪些更新,然后将这些更新运行update.php。在Drupal 6中,它将自动选择要执行的更新,但是您可以更改它,而在Drupal 7中则不能。

Drupal通过保存上一次运行的更新的数量来检测需要哪些更新。这可能是数据库中的更改,这将允许重新运行Drupal 7中的更新。重新运行更新通常不是一个好主意,并且通常会导致错误,并且在某些情况下会破坏您的数据。

始终记得在运行更新之前备份数据库。


15

挂钩的目的是不同的。

  • 在安装模块时会调用hook_install();这意味着该模块先前未安装,因此不需要更新。
  • 当已经安装模块时,将调用hook_update_N(),并且需要对其进行更新。

如果在安装模块和更新模块时都需要完成某些任务,则两个钩子中都应包含代码。没有模块可以在安装过程中调用所有更新挂钩,并且当更新功能更新模块中使用的数据库表的架构时,这尤其错误。hook_schema()应该始终返回更新后的架构,并且使用更新函数来更新架构也是错误的。

您编写的代码不起作用,因为调用其中一个更新函数不会自动执行所有其他更新函数。
从实现中调用更新功能hook_install()是错误的,因为从另一个调用更新功能是错误的。如果需要从两个或多个更新函数执行某些代码,则应将该代码放在从更新函数hook_install()(如有必要)中调用的函数中。


5

仅在全新安装模块时才调用安装挂钩,因此不需要任何更新。仅当模块已安装时才执行更新,因此它可以应用其他更改。

要强制更新功能在安装时运行,您必须更改架构版本,例如:

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

或从匆忙中运行它:drush -y updb

另请参阅:是否可以强制运行模块的更新挂钩?


1

hook_install无法在mymod.module文件中使用。

你必须把hook_installhook_uninstall一个单独的文件mymod.install

我想hook_update_N()也应该放在mymod.install


问题更新后回答:

链接报价,请在信息文件中检查您的版本号。

由于我是私下进行开发而不是出于贡献,因此,当我更新模块时,模块的.info文件中的“ VERSION”字段为空白或未更改。我实际上是使用Subversive进行Eclipse PDT,因此我的信息文件版本号从未更新。因此,update.php未调用我的hook_update_6001。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.