配置MW:左侧导航栏

来自Wikioe
Eijux讨论 | 贡献2022年8月22日 (一) 18:07的版本 (创建页面,内容为“category:MediaWiki == 关于 == <span style="color: green; font-size:120%">'''目标:实现“自定义左侧导航栏”功能。'''</span> == 实现 == 在 MediaWiki 的搜索栏中搜索“MediaWiki:Sidebar”,即可修改左侧导航栏,栏格式如下: <pre> *导航栏名称一 **链接一地址|链接一名称 **链接二地址|链接二名称 *导航栏名称二 **链接一地址|链接一名称 **链接二地址|链接二名称 </pre…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索


关于

目标:实现“自定义左侧导航栏”功能。

实现

在 MediaWiki 的搜索栏中搜索“MediaWiki:Sidebar”,即可修改左侧导航栏,栏格式如下:

*导航栏名称一
**链接一地址|链接一名称
**链接二地址|链接二名称

*导航栏名称二
**链接一地址|链接一名称
**链接二地址|链接二名称
  1. *”后为标题,可以是:“MediaWiki 命名空间”的页面(如:“navigation”,即“MediaWiki:Navigation”)、文本内容
    • 不能为:“http 链接”或“MediaWiki 内部链接”。
    • 若其后没有“**”内容,则该标题不显示。
  2. **”后为链接,可以是:“MediaWiki 命名空间”的页面(如:“mainpage”,即“MediaWiki:Mainpage”)、“http 链接”,
    • 不能为:“MediaWiki 内部链接”(“[[xxx]]”格式)。


默认侧边栏只有两级(标题、链接|名称),若要实现多级链接、树形链接,需要需要修改 MediaWiki 的相关代码,或用 Extension 实现。

备注:关于导航项(SEARCH、TOOLBOX、LANGUAGES)

关于 MediaWiki:Sidebar 中默认的导航项(SEARCH、TOOLBOX、LANGUAGES),如下:
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help-mediawiki
* SEARCH
* TOOLBOX
* LANGUAGES 

例如其中“TOOLBOX”,显示结果为:
工具
链入页面
相关更改
上传文件
特殊页面
页面信息

我想要在左侧导航栏通过类似方式(模板???)来自定义导航页:

  • 【2020/09/09 00:40:57】
    起初,我以为是需要在“MediaWiki 命名空间”下安装 Sidebar 的规则编写文件就可以,但尝试一番以失败告终。
    然后,我考虑是不是这些内容和 skin 有关,并在“skins\Vector\includes\VectorTemplate.php”中看到了线索:
    private function buildSidebar() : array {
    		$skin = $this->getSkin();
    		$portals = $skin->buildSidebar();
    		$props = [];
    		$languages = null;
    
    		// Render portals
    		foreach ( $portals as $name => $content ) {
    			if ( $content === false ) {
    				continue;
    			}
    
    			// Numeric strings gets an integer when set as key, cast back - T73639
    			$name = (string)$name;
    
    			switch ( $name ) {
    				case 'SEARCH':
    					break;
    				case 'TOOLBOX':
    					$portal = $this->getMenuData(
    						'tb', $content, self::MENU_TYPE_PORTAL
    					);
    					// Run deprecated hook.
    					// Use SidebarBeforeOutput instead.
    					ob_start();
    					Hooks::run( 'VectorAfterToolbox', [], '1.35' );
    					$props[] = $portal + [
    						'html-hook-vector-after-toolbox' => ob_get_clean(),
    					];
    					break;
    				case 'LANGUAGES':
    					$portal = $this->getMenuData(
    						'lang',
    						$content,
    						self::MENU_TYPE_PORTAL
    					);
    					// The language portal will be added provided either
    					// languages exist or there is a value in html-after-portal
    					// for example to show the add language wikidata link (T252800)
    					if ( count( $content ) || $portal['html-after-portal'] ) {
    						$languages = $portal;
    					}
    					break;
    				default:
    					// Historically some portals have been defined using HTML rather than arrays.
    					// Let's move away from that to a uniform definition.
    					if ( !is_array( $content ) ) {
    						$html = $content;
    						$content = [];
    						wfDeprecated(
    							"`content` field in portal $name must be array."
    								. "Previously it could be a string but this is no longer supported.",
    							'1.35.0'
    						);
    					} else {
    						$html = false;
    					}
    					$portal = $this->getMenuData(
    						$name, $content, self::MENU_TYPE_PORTAL
    					);
    					if ( $html ) {
    						$portal['html-items'] .= $html;
    					}
    					$props[] = $portal;
    					break;
    			}
    		}
            
    		$firstPortal = $props[0] ?? null;
    		if ( $firstPortal ) {
    			$firstPortal[ 'class' ] .= ' portal-first';
    		}
    
    		return [
    			'has-logo' => $this->isLegacy,
    			'html-logo-attributes' => Xml::expandAttributes(
    				Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) + [
    					'class' => 'mw-wiki-logo',
    					'href' => Skin::makeMainPageUrl(),
    				]
    			),
    			'array-portals-rest' => array_slice( $props, 1 ),
    			'data-portals-first' => $firstPortal,
    			'data-portals-languages' => $languages,
    		];
    	}
    
    粗略看了下,自定义导航名称的话当前函数内并没有 Hooks::run( 'VectorAfterToolbox', [], '1.35' ); 类似的代码会执行,不知道函数返回之后的流程,就此搁置,以后再看吧。