【问题标题】:Installing TabView extension in a MediaWiki site在 MediaWiki 站点中安装 TabView 扩展
【发布时间】:2013-05-14 16:26:07
【问题描述】:

我目前正在尝试在我的 MediaWiki 网站上安装 TabView 扩展。我从this page 下载了 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”

有没有办法解决这个问题?

【问题讨论】:

    标签: php mediawiki


    【解决方案1】:

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

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


    具体来说,查看 JSSnippets 类文档(参见上面的链接),addToStack() 调用的作用是告诉浏览器异步加载两个链接的 JS 文件,然后,一旦文件加载完毕,调用 JS 函数 @ 987654332@ 带有命名参数 idselected(作为通用对象的属性传递,如在 JSON 中)。

    用标准的MediaWiki ResourceLoader 做同样的事情应该不会太难。首先,我们需要定义一个 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>";
    

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

    【讨论】:

    • 对于迟到的回复非常抱歉,非常感谢您提供非常详细的答复。我只是想确保应该将以下代码部分添加到 extensions/TabView/TabView.php,对吗? $wgResourceModules['ext.TabView'] = array( 'scripts' =&gt; array( 'js/mustache.js', 'js/tabs.js', 'js/TabView.js' ), 'localBasePath' =&gt; __DIR__, 'remoteExtPath' =&gt; 'TabView', );
    • 还有$opts = array( 'id' =&gt; "flytabs_$id", 'selected' =&gt; $optionsIndex ); $opts = json_encode( $opts ); $js = "mw.loader.using( 'ext.TabView', function () { TabView.init($opts) } );"; $out .= "&lt;script type='text/javascript'&gt;$js&lt;/script&gt;";
    • 我还在扩展/TabView/js 中添加了 mustache.js、tabs.js 和 TabView.js;并将“js/tabs.js”添加到 ResourceLoader 模块,但它仍然不起作用。
    • 嗯,那我不知道怎么了。 :( 是否有任何 PHP 或 JS 错误消息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多