如何使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_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_installhook_uninstall 在单独的文件中 mymod.install

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


问题更新后的答案:

引用 关联, ,请在信息文件中检查您的版本号。

由于我正在私下开发而不是为了贡献,因此我的模块.info文件中的“版本”字段在更新模块时要么空白或不变。实际上,我正在使用颠覆性用于Eclipse PDT,因此我的信息文件版本号从未更新。因此,我的hook_update_6001并未通过update.php调用。

许可以下: CC-BY-SA归因
scroll top