如何使hook_install()运行所有hook_update_n()?
-
16-10-2019 - |
题
如何使hook_install()运行我的模块所有更新?我有mymod.install文件。
我努力了
function mymod_install() {
mymod_update_6001();
}
但这似乎没有做任何事情。如果我有mymod_update_6002(),我仍然会致电6001(),只需调用6002()或在订单6001(),6002()中调用。
我认为当您默认安装模块时,运行所有更新是常识。
解决方案
您不应该让安装挂钩运行更新。当第一次安装模块时,无需更新。
当已安装模块时使用更新(创建了数据库或变量)。在这种情况下,您不想重新安装模块,因为它将擦除所有数据,而是创建Update_n钩子。 Drupal将检测需要哪些更新,这些更新将运行到 update.php
. 。在Drupal 6中,它将自动选择要执行的更新,但是您可以更改它,而Drupal 7则不可能进行更改。
Drupal检测通过保存最后运行更新的数量来检测需要哪些更新。这可能是数据库中的更改,该数据库将允许在Drupal7中重新运行更新。重新设计更新通常是一个坏主意,并且通常会导致错误,在某些情况下可能会弄乱您的数据。
在运行更新之前,请记住要备份数据库。
其他提示
钩子的目的是不同的。
- hook_install() 安装模块时被调用;这意味着该模块以前没有安装,因此不需要更新。
- hook_update_n() 当已经安装模块时调用,需要更新。
如果在安装模块时以及更新模块时需要执行一些任务,则应在两个挂钩中都存在代码。在安装过程中没有任何模块调用所有更新挂钩,当更新功能更新来自模块使用的数据库表的架构时,这尤其是错误的; hook_schema() 应始终返回更新的架构,并使用更新功能更新架构也是错误的。
您编写的代码无效,因为调用一个更新功能之一不会自动执行所有其他更新功能。
从实施中调用更新功能 hook_install()
是错误的,因为从另一个调用更新函数是错误的;如果需要从两个或多个更新函数执行某些代码,则该代码应将代码放在从更新函数中调用的函数中,以及从 hook_install()
, ,如有必要。
仅在新鲜安装模块时才调用安装钩,因此无需任何更新。仅在已安装模块时才执行更新,因此可以应用其他更改。
为了强制更新功能在安装时运行,例如,您可以更改模式版本,例如:
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运行它: drush -y updb
.
也可以看看: 是否有可能强制模块的更新挂钩运行?
hook_install不会与 mymod.module
文件。
你必须放置 hook_install
和 hook_uninstall
在单独的文件中 mymod.install
我猜是 hook_update_N()
也应该放在 mymod.install
问题更新后的答案:
引用 关联, ,请在信息文件中检查您的版本号。
由于我正在私下开发而不是为了贡献,因此我的模块.info文件中的“版本”字段在更新模块时要么空白或不变。实际上,我正在使用颠覆性用于Eclipse PDT,因此我的信息文件版本号从未更新。因此,我的hook_update_6001并未通过update.php调用。