1

我目前正在尝试在我的 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 中找不到类“F”

有没有什么办法解决这一问题?

4

1 回答 1

1

您链接到的TabView 扩展似乎取决于Wikia Nirvana 框架,特别是WikiaSuperFactory 类(“F”类是其虚拟子类)。通过该框架,它从Wikia JSSnippets 扩展实例化一个JSSnippets对象。

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


具体来说,查看 JSSnippets 类文档(参见上面的链接),addToStack()调用的作用是告诉浏览器异步加载两个链接的 JS 文件,然后,一旦文件加载完毕,TabView.init()使用命名参数调用 JS 函数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>";

附言。TabView.js文件说它“[d]取决于 skins/oasis/js/tab.js”。我在 Wikia 的存储库中找不到任何具有该名称的文件,但有一个skins /oasis/js/tab s .js,您可能还需要将其复制到TabView/js子目录中并与 mustache.js 一起添加到模块定义中。

于 2013-05-20T17:21:21.900 回答