Answers:
您不应该安装钩子来运行更新。首次安装模块时,无需更新。
在已经安装模块(已创建数据库或变量)的情况下使用更新。在这种情况下,您不想重新安装该模块,因为它将擦除所有数据,而是创建update_N挂钩。Drupal将检测到需要哪些更新,然后将这些更新运行update.php
。在Drupal 6中,它将自动选择要执行的更新,但是您可以更改它,而在Drupal 7中则不能。
Drupal通过保存上一次运行的更新的数量来检测需要哪些更新。这可能是数据库中的更改,这将允许重新运行Drupal 7中的更新。重新运行更新通常不是一个好主意,并且通常会导致错误,并且在某些情况下会破坏您的数据。
始终记得在运行更新之前备份数据库。
挂钩的目的是不同的。
如果在安装模块和更新模块时都需要完成某些任务,则两个钩子中都应包含代码。没有模块可以在安装过程中调用所有更新挂钩,并且当更新功能更新模块中使用的数据库表的架构时,这尤其错误。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 -y updb
。
另请参阅:是否可以强制运行模块的更新挂钩?
hook_install无法在mymod.module
文件中使用。
你必须把hook_install
和hook_uninstall
一个单独的文件mymod.install
我想hook_update_N()
也应该放在mymod.install
问题更新后回答:
从链接报价,请在信息文件中检查您的版本号。
由于我是私下进行开发而不是出于贡献,因此,当我更新模块时,模块的.info文件中的“ VERSION”字段为空白或未更改。我实际上是使用Subversive进行Eclipse PDT,因此我的信息文件版本号从未更新。因此,update.php未调用我的hook_update_6001。