您链接到的TabView 扩展似乎取决于Wikia Nirvana 框架,特别是WikiaSuperFactory 类(“F”类是其虚拟子类)。通过该框架,它从Wikia JSSnippets 扩展实例化一个JSSnippets对象。
简而言之,该扩展的 JS 端似乎利用了一大堆 Wikia 特定的代码。您可以尝试将所有依赖项添加到您的 wiki,但使用标准 MediaWiki 功能复制功能可能更容易。
具体来说,查看 JSSnippets 类文档(参见上面的链接),addToStack()
调用的作用是告诉浏览器异步加载两个链接的 JS 文件,然后,一旦文件加载完毕,TabView.init()
使用命名参数调用 JS 函数id
和selected
(通过作为通用对象的属性,例如在 JSON 中)。
用标准的MediaWiki ResourceLoader做同样的事情应该不会太难。首先,我们需要定义一个 ResourceLoader 模块来加载我们需要的脚本(警告:未经测试的代码!):
$wgResourceModules['ext.TabView'] = array(
'scripts' => array( 'js/mustache.js', 'js/TabView.js' ),
'localBasePath' => __DIR__,
'remoteExtPath' => 'TabView',
);
将其插入到扩展代码顶部附近、函数定义之外的某个位置。您还需要将mustache.js 库复制到TabView/js
子目录。
(我相信像这样将两个 JS 文件一起加载应该可以工作,即使ResourceLoader 的作用域特性也是如此。当然,如果我们有几个使用 mustache.js 库的扩展,那么将其作为一个单独的模块会更加高效和优雅本身,但它需要一个胶水脚本来做类似的事情window.Mustache = Mustache;
。)
在钩子函数中,我们需要告诉 MediaWiki 加载该模块并调用该TabView.init()
函数,如下所示:
$opts = array( 'id' => "flytabs_$id", 'selected' => $optionsIndex );
$opts = json_encode( $opts );
$js = "mw.loader.using( 'ext.TabView', function () { TabView.init($opts) } );";
$out .= "<script type='text/javascript'>$js</script>";
附言。TabView.js文件说它“[d]取决于 skins/oasis/js/tab.js”。我在 Wikia 的存储库中找不到任何具有该名称的文件,但有一个skins /oasis/js/tab s .js,您可能还需要将其复制到TabView/js
子目录中并与 mustache.js 一起添加到模块定义中。