您鏈接的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