您链接的TabView extension似乎取决于Wikia Nirvana framework,特别是在WikiaSuperFactory class(其中类“F”是虚拟子类)。通过该框架,它从Wikia JSSnippets extension实例化了一个JSSnippets对象。
简而言之,该扩展的JS方面似乎利用了一大堆Wikia特定的代码。您可以尝试将所有依赖关系添加到您的wiki中,但使用标准MediaWiki功能复制功能可能更容易。
具体来说,看着JSSnippets类文档(见上面的链接),什么addToStack()
通话所做的就是告诉浏览器异步加载了两个链接的JS文件,然后,一旦文件加载,调用JS函数TabView.init()
,命名参数为id
和selected
(作为通用对象的属性传递,就像在JSON中一样)。
与标准MediaWiki ResourceLoader做同样的事情不应该太难。首先,我们需要定义一个加载我们需要的脚本个资源模块(警告:未经测试的代码):
$wgResourceModules['ext.TabView'] = array(
'scripts' => array('js/mustache.js', 'js/TabView.js'),
'localBasePath' => __DIR__,
'remoteExtPath' => 'TabView',
);
插入这附近的某处扩展代码的顶部,函数定义之外。您还需要将mustache.js library复制到TabView/js
子目录。
(我相信加载两个js文件在一起,就像这应该工作,即使ResourceLoader's scoping peculiarities。当然,如果我们有这样的使用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>";
Ps。 TabView.js file表示它“[d]依靠皮肤/绿洲/ js/tab.js”。我在Wikia的回购库中找不到任何具有该名称的文件,但是 a skins/oasis/js/tabs.js其中可能也需要复制到TabView/js
子目录中并添加到mustache.js旁边的模块定义中。
对于迟到的回复,我非常抱歉,非常感谢您提供非常详细的答案。 我只是想确保下面的代码段都应该被添加到扩展/ TabView的/ TabView.php,是否正确? ('js/mustache.js','js/tabs.js','js/TabView.js'), ' localBasePath'=> __DIR__, 'remoteExtPath'=>'TabView', );' – Arcius
和 '$ opts = array('id'=>“flytabs_ $ id”,'selected'=> $ optionsIndex); $ OPTS = json_encode($ OPTS); $ JS = “mw.loader.using( 'ext.TabView',函数(){TabView.init($ OPTS)});”; $出= “<脚本类型= '文本/ JavaScript的'> $ js的”;' – Arcius
我还添加mustache.js,tabs.js和TabView.js到extenstions/TabView的/ JS;并在ResourceLoader模块中添加了'js/tabs.js',但它仍然不起作用。 – Arcius