修改 MediaWiki 搜索表单
Modify MediaWiki Search Form
除了编辑 Vector.php
之外,还有其他方法可以修改页眉中的 MediaWiki 搜索表单吗?
基本上,我想 change/extend HTML 表单的标记并为 Ajax 调用添加一个 JavaScript 侦听器。
不幸的是,我似乎找不到合适的钩子。
如果您想更改 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
class中,需要创建并添加到Autoload classes):
public static function onBeforePageDisplay( OutputPage &$output, Skin &$skin ) {
$output->addModules( array(
'ext.ExampleExt.js',
) );
return true;
}
首先,我添加了一个钩子:
$wgHooks['BeforePageDisplay'][] = 'MyNamespace\Hooks::onBeforePageDisplay';
挂钩非常简单:
public static function onBeforePageDisplay( \OutputPage &$out, \Skin &$skin ) {
$skin->template = '\MyNamespace\Template';
}
最后,Template
class 覆盖 renderNavigation()
方法,它呈现搜索表单:
<?php
namespace XtxSearch;
class Template extends \VectorTemplate {
protected function renderNavigation( $elements ) {
...
}
}
除了编辑 Vector.php
之外,还有其他方法可以修改页眉中的 MediaWiki 搜索表单吗?
基本上,我想 change/extend HTML 表单的标记并为 Ajax 调用添加一个 JavaScript 侦听器。
不幸的是,我似乎找不到合适的钩子。
如果您想更改 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
class中,需要创建并添加到Autoload classes):
public static function onBeforePageDisplay( OutputPage &$output, Skin &$skin ) {
$output->addModules( array(
'ext.ExampleExt.js',
) );
return true;
}
首先,我添加了一个钩子:
$wgHooks['BeforePageDisplay'][] = 'MyNamespace\Hooks::onBeforePageDisplay';
挂钩非常简单:
public static function onBeforePageDisplay( \OutputPage &$out, \Skin &$skin ) {
$skin->template = '\MyNamespace\Template';
}
最后,Template
class 覆盖 renderNavigation()
方法,它呈现搜索表单:
<?php
namespace XtxSearch;
class Template extends \VectorTemplate {
protected function renderNavigation( $elements ) {
...
}
}