是否可以强制模块的更新挂钩运行?


18

我是Date iCal模块的作者,而我正在使用的新的主要版本(3.x)需要针对安装了2.x的用户进行两部分式的架构更新。我已经编写了进行这些更改的更新挂钩,但是如果我的用户之一无法运行数据库更新脚本,他们将收到与他们的iCal feed导入程序有关的错误消息。

正确的解决方案是让他们运行更新脚本...但是,如果他们只是进入并手动更改其导入器以摆脱该消息,则其导入器将永久损坏(因为架构更新的第二部分不会已执行)。

那么,有什么方法可以向尚未运行更新的用户显示消息?还是以某种方式在3.x安装在2.x之上时第一次强制执行更新挂钩?


2
我想您可以variable_set()在更新函数中执行一个设置,该函数在成功运行时设置一个变量,您可以在a内部查看该变量_preprocess_page(),但每次都在查看它,因此不确定性能如何友好。
Jimajamma

Answers:


4

扩展了Jimajamma的评论:

variable_set()在您的更新函数中执行一个操作,该操作会在变量成功运行时设置一个变量,您可以在_preprocess_page()内部查看

并且仅在浏览管理区域并且安装的版本为3.0(3.1、3.2,请取消检查是否停止支持旧版本作为升级路径),而不是在每次页面加载时都进行此检查。

另外,利用hook_requirements在状态报告页面上提供反馈:

检查安装要求并进行状态报告。
(...)
“运行时”阶段不仅限于纯粹的安装要求,还可以用于更一般的状态信息,例如维护任务和安全性问题。


15

强制更新模块的方法很少。

  1. 直接调用更新函数。

    $sandbox = [];
    module_load_include('install', 'FOO');
    FOO_update_7001($sandbox);
  2. 将架构版本重置为关注点,然后照常再次运行更新。

    drupal_set_installed_schema_version('module_name', '7000');

    或重置为仅重新运行最新的更新架构:

    drupal_set_installed_schema_version('foo', drupal_get_installed_schema_version('foo') - 1);

    笔记:

    • 可以将其放置在中hook_install,因此在更新过程中将执行所有后续的更新挂钩。
    • 为了在安装文件之外使用此功能,您必须首先包含Drupal install.inc和模块的安装文件,例如

      require_once DRUPAL_ROOT . '/includes/install.inc';
      module_load_include('install', 'foo');
    • 考虑添加ini_set('max_execution_time', 0);更长的安装更新以防止PHP超时。
  3. 使用drush。查找以下几个示例:

    • drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
    • drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb

1
哦,很好,我不知道drupal_set_installed_schema_version()。这对于调试更新挂钩非常方便!
coredumperror

1
因此,将其放入其中的主要问题hook_install()是运行长时间的批处理(沙盒装)更新。在理想情况下,应该有一种update.php与重新启动PHP线程相同的方式来触发更新,以防止超时。蚂蚁的想法该怎么做?
Alex Skrypnyk '02

@ Alex.Designworks您可以ini_set('max_execution_time', 0);在触发更新之前添加。
kenorb '17

1

(改写为答案)

您可以“从系统选择SELECT schema_version”来检测是否已执行更新。如果不是,则拒绝运行(带有错误消息)。


请改写您的答案,并尝试给出一个用法示例。
ЕлинЙ.

忽略此评论。
2013年

恐怕无法使用,因为所讨论的功能是另一个模块的插件,并且我不能阻止该模块让用户惹恼他们的进口商。
2013年

您无法检查要监视更新的模块的架构版本吗?
user18099 2013年

0

我同意上述建议-我唯一的补充就是也要调查“触发器和操作”-似乎您需要一个操作(通知用户或运行更新),以便在触发触发器(用户检查管理页面等)时发生。有关使用示例,请参见“示例”模块,其中包含操作和触发器示例代码。:)


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.