【问题标题】:MediaWiki Hook for Installing Extension用于安装扩展的 MediaWiki 挂钩
【发布时间】:2015-08-25 07:45:39
【问题描述】:

我对 MediaWiki 钩子做了一些研究。

据我所知,添加/更新数据库表的唯一钩子是https://www.mediawiki.org/wiki/Manual:Hooks/LoadExtensionSchemaUpdates

但是,我需要一个在安装新扩展时触发的钩子。我该如何做到这一点?我只想执行一次CREATE TABLE 语句 - 在安装扩展程序时。安装扩展不需要更新 MediaWiki,这就是为什么上面的钩子不适合我的需要。

编辑

澄清一下:我正在开发一个需要访问数据库中自定义表的扩展。这就是为什么我需要在安装此扩展程序时执行CREATE TABLE 语句。

【问题讨论】:

    标签: mediawiki


    【解决方案1】:

    首先:正如您所注意到的,没有这样的钩子。您需要通过 cron 作业(如果它是您的服务器)检查已安装的扩展,或者使用 job queue(如果您在扩展中执行此操作)对 wiki 的每 100 个请求进行检查。

    从那里,您有几个选项,具体取决于您是需要捕获每个扩展,还是只捕获其中的大部分:

    1. 检查已注册的扩展程序,例如:
      $registry = ExtensionRegistry::getInstance();
      $extensions = $registry->loaded();
      这将使用 new style 工作扩展程序。对于旧版本,请检查全局变量 $wgExtensionCredits 以获取已注册的扩展。请注意,没有什么可以阻止扩展在未注册的情况下运行。其实这样的扩展还有很多。

    2. Parse LocalSettings.php,并使用正则表达式检查新旧样式扩展加载。很脏,但实际上就是这样,例如维护脚本getConfiguration.php 做到了。您需要检查以下行:
      wfLoadExtension( 'FooBar' );
      和这个:
      wfLoadExtensions( ['Foo', 'Bar'] );
      和这个:
      require_once "$IP/extensions/Foo/Bar.php"; 但是请注意,可以使用其他目录扩展,而且现代皮肤实际上也表现得像扩展。

    3. 如果您需要跟踪某个扩展系列,并且可以确保它们都使用 Composer,则解析 $IP/composer.json 以获取已安装的扩展。

    【讨论】:

    • 谢谢你,里奥!我只需要跟踪一个扩展——我正在开发的扩展。通过将require_once "$IP/extensions/Foo/Bar.php";添加到LocalSettings.php安装扩展后,我想执行CREATE TABLE语句。
    • 然后我会简单地创建一个特殊页面Special:InitializeXXX,并指示用户去那里完成安装。这就是例如Semantic MediaWiki does it(以及许多其他需要更改数据库布局的扩展)
    • 为什么不指示用户运行更新脚本或在浏览器中执行“mw-config”过程?
    • @Florian:我希望扩展安装过程尽可能简单。由于安装扩展不一定会伴随更新 MediaWiki,因此我不能真正使用更新脚本(和 LoadExtensionSchemaUpdates 挂钩)。这就是为什么我倾向于根据@Leo 的评论使用一个特殊页面。
    • @bernland 我不知道,分散数据库设置和扩展安装如何让 wiki 系统管理员更容易安装扩展。常用方法(对于开发人员和 wiki 系统管理员)是将扩展目录上传到 extensions/,将 require_once 行(或 wfLoadExtensions())放入 LocalSettings.php 并运行更新脚本。每个扩展都有自己的特殊页面会使整个 wiki 超载并且总体上更加复杂,即使它只对一个扩展有意义:) ...
    【解决方案2】:

    我做了更多研究 (https://www.mediawiki.org/wiki/Manual:Update.php#Details),发现 LoadExtensionSchemaUpdates 钩子正是我想要的。

    # Schema updates for update.php
    $wgHooks['LoadExtensionSchemaUpdates'][] = 'fnMyHook';
    function fnMyHook( DatabaseUpdater $updater ) {
        $updater->addExtensionTable( 'tablename',
            __DIR__ . '/table.sql' );
        return true;
    }
    

    安装扩展后第一次运行$ php update.php时,脚本会执行CREATE TABLE语句。然后,对于连续执行,更新脚本只记录表已经存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多