在MediaWiki站点中安装TabView扩展


Installing TabView extension in a MediaWiki site

我目前正试图在我的MediaWiki网站上安装TabView扩展。我从这个页面下载了php文件,把它放在extensions文件夹中,如下所示:/extensions/TabView/TabView.php

在LocalSettings.php文件中添加以下行:

require_once("$IP/extensions/TabView/TabView.php");

不知何故,当我试图在页面上使用标签时,我得到了这个错误:

致命错误:第107行/var/www/html/camnang.vysajp.org/public/extensions/TabView/TabView.php中找不到Class 'F'

有办法解决这个问题吗?

您链接到的TabView扩展似乎依赖于Wikia Nirvana框架,特别是WikiaSuperFactory类(类"F"是其虚拟子类)。通过这个框架,它实例化了来自Wikia JSSnippets扩展的JSSnippets对象。

简而言之,该扩展的JS端似乎使用了一大堆特定于wikipedia的代码。您可以尝试将所有依赖项添加到wiki中,但使用标准MediaWiki特性复制功能可能更容易。


具体来说,看看JSSnippets类文档(见上面的链接),addToStack()调用的作用是告诉浏览器异步加载两个链接的JS文件,然后,一旦文件加载,调用JS函数TabView.init()与命名参数idselected(作为通用对象的属性传递,就像在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>";

p。TabView.js文件说它"[d]依赖于skins/oasis/js/tab.js"。我在Wikia的repo中找不到任何具有该名称的文件,但是一个skins/oasis/js/tabs.js,您可能还需要将复制到TabView/js子目录中并添加到模块定义中。