【问题标题】:Modify MediaWiki Search Form修改 MediaWiki 搜索表单
【发布时间】:2015-09-08 05:40:05
【问题描述】:

除了编辑Vector.php之外,还有其他方法可以修改页眉中的MediaWiki搜索表单吗?

基本上,我想更改/扩展 HTML 表单的标记并为 Ajax 调用添加一个 JavaScript 侦听器。

很遗憾,我似乎找不到合适的钩子。

【问题讨论】:

    标签: mediawiki mediawiki-extensions mediawiki-templates


    【解决方案1】:

    如果您想更改 HTML,这并不容易。但是要添加 JavaScript 侦听器,您通常不需要直接向要侦听事件的输入添加内容。

    例如,您可以使用 jQuery 向搜索输入添加侦听器。为此,您可以创建一个新扩展(阅读this manual 以快速入门)。在您的扩展中,您创建一个新的资源模块:

    {
        "@comment": "Other configuration options may follow here"
        "ResourceFileModulePaths": {
            "localBasePath": "",
            "remoteSkinPath": "ExampleExt"
        },
        "ResourceModules": {
            "ext.ExampleExt.js": {
                "scripts": [
                    "resources/ext.ExampleExt.js/script.js"
                ]
            }
        },
        "@comment": "Other configuration options may follow here"
    }
    

    现在,您可以添加您在模块中定义的脚本文件:

    ( function ( $ ) {
        $( '#searchInput' ).on( 'change', function () {
            // do whatever you want when the input
            // value changed
        }
    }( jQuery ) );
    

    只要搜索输入的值发生变化,函数中的代码(在 on() 函数的第二个参数中)就会运行。

    现在,您只需要在 MediaWiki 输出页面时加载您的模块。最简单的方法是使用BeforePageDisplay hook

    注册钩子处理程序:

    {
        "@comment": "Other configuration options may follow here"
        "Hooks": {
            "BeforePageDisplay": [
                "ExampleExtHooks::onBeforePageDisplay"
            ],
        },
        "@comment": "Other configuration options may follow here"
    }
    

    处理钩子(在ExampleExtHooks类中,需要创建并添加到Autoload类中):

    public static function onBeforePageDisplay( OutputPage &$output, Skin &$skin ) {
        $output->addModules( array(
            'ext.ExampleExt.js',
        ) );
        return true;
    }
    

    【讨论】:

    • 感谢您为我指明了正确的方向。我的答案见下文。
    【解决方案2】:

    首先,我添加了一个钩子:

    $wgHooks['BeforePageDisplay'][] = 'MyNamespace\Hooks::onBeforePageDisplay';
    

    钩子很简单:

    public static function onBeforePageDisplay( \OutputPage &$out, \Skin &$skin ) {
        $skin->template = '\MyNamespace\Template';
    }
    

    最后,Template 类覆盖了renderNavigation() 方法,它呈现了搜索表单:

    <?php
    
    namespace XtxSearch;
    
    class Template extends \VectorTemplate {
    
        protected function renderNavigation( $elements ) {
            ...
        }
    
    }
    

    【讨论】:

    • 如果用户使用 MonoBook 会怎样?
    • 我将不得不研究 MonoBook。但是,我也希望有一种方法可以覆盖搜索表单的 HTML 输出。
    • 我还是不知道,你为什么要更改 HTML 输出 :)
    • 我想使用一个定制的搜索扩展,从各种来源(wiki、在线商店、其他网站)收集搜索结果。这就是为什么我需要完全控制 HTML。
    猜你喜欢
    • 2014-06-09
    • 2018-05-27
    • 2014-09-17
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多