specialpage.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 576 行 · 第 1/2 页
PHP
576 行
} $pages = array( '' => array(), 'sysop' => array(), 'developer' => array() ); foreach ( self::$mList as $name => $rec ) { $page = self::getPage( $name ); if ( $page->isListed() ) { $pages[$page->getRestriction()][$page->getName()] = $page; } } return $pages; } /** * Execute a special page path. * The path may contain parameters, e.g. Special:Name/Params * Extracts the special page name and call the execute method, passing the parameters * * Returns a title object if the page is redirected, false if there was no such special * page, and true if it was successful. * * @param $title a title object * @param $including output is being captured for use in {{special:whatever}} */ function executePath( &$title, $including = false ) { global $wgOut, $wgTitle; $fname = 'SpecialPage::executePath'; wfProfileIn( $fname ); $bits = split( "/", $title->getDBkey(), 2 ); $name = $bits[0]; if( !isset( $bits[1] ) ) { // bug 2087 $par = NULL; } else { $par = $bits[1]; } $page = SpecialPage::getPage( $name ); if ( is_null( $page ) ) { if ( $including ) { wfProfileOut( $fname ); return false; } else { $redir = SpecialPage::getRedirect( $name ); if ( isset( $redir ) ) { if( $par ) $redir = Title::makeTitle( $redir->getNamespace(), $redir->getText() . '/' . $par ); $params = SpecialPage::getRedirectParams( $name ); if( $params ) { $url = $redir->getFullUrl( $params ); } else { $url = $redir->getFullUrl(); } $wgOut->redirect( $url ); $retVal = $redir; $wgOut->redirect( $url ); $retVal = $redir; } else { $wgOut->setArticleRelated( false ); $wgOut->setRobotpolicy( 'noindex,nofollow' ); $wgOut->setStatusCode( 404 ); $wgOut->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' ); $retVal = false; } } } else { if ( $including && !$page->includable() ) { wfProfileOut( $fname ); return false; } elseif ( !$including ) { if($par !== NULL) { $wgTitle = Title::makeTitle( NS_SPECIAL, $name ); } else { $wgTitle = $title; } } $page->including( $including ); $profName = 'Special:' . $page->getName(); wfProfileIn( $profName ); $page->execute( $par ); wfProfileOut( $profName ); $retVal = true; } wfProfileOut( $fname ); return $retVal; } /** * Just like executePath() except it returns the HTML instead of outputting it * Returns false if there was no such special page, or a title object if it was * a redirect. * @static */ static function capturePath( &$title ) { global $wgOut, $wgTitle; $oldTitle = $wgTitle; $oldOut = $wgOut; $wgOut = new OutputPage; $ret = SpecialPage::executePath( $title, true ); if ( $ret === true ) { $ret = $wgOut->getHTML(); } $wgTitle = $oldTitle; $wgOut = $oldOut; return $ret; } /** * Default constructor for special pages * Derivative classes should call this from their constructor * Note that if the user does not have the required level, an error message will * be displayed by the default execute() method, without the global function ever * being called. * * If you override execute(), you can recover the default behaviour with userCanExecute() * and displayRestrictionError() * * @param string $name Name of the special page, as seen in links and URLs * @param string $restriction Minimum user level required, e.g. "sysop" or "developer". * @param boolean $listed Whether the page is listed in Special:Specialpages * @param string $function Function called by execute(). By default it is constructed from $name * @param string $file File which is included by execute(). It is also constructed from $name by default */ function SpecialPage( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false ) { $this->mName = $name; $this->mRestriction = $restriction; $this->mListed = $listed; $this->mIncludable = $includable; if ( $function == false ) { $this->mFunction = 'wfSpecial'.$name; } else { $this->mFunction = $function; } if ( $file === 'default' ) { $this->mFile = "Special{$name}.php"; } else { $this->mFile = $file; } } /**#@+ * Accessor * * @deprecated */ function getName() { return $this->mName; } function getRestriction() { return $this->mRestriction; } function getFile() { return $this->mFile; } function isListed() { return $this->mListed; } /**#@-*/ /**#@+ * Accessor and mutator */ function name( $x = NULL ) { return wfSetVar( $this->mName, $x ); } function restrictions( $x = NULL) { return wfSetVar( $this->mRestrictions, $x ); } function listed( $x = NULL) { return wfSetVar( $this->mListed, $x ); } function func( $x = NULL) { return wfSetVar( $this->mFunction, $x ); } function file( $x = NULL) { return wfSetVar( $this->mFile, $x ); } function includable( $x = NULL ) { return wfSetVar( $this->mIncludable, $x ); } function including( $x = NULL ) { return wfSetVar( $this->mIncluding, $x ); } /**#@-*/ /** * Checks if the given user (identified by an object) can execute this * special page (as defined by $mRestriction) */ function userCanExecute( &$user ) { if ( $this->mRestriction == "" ) { return true; } else { if ( in_array( $this->mRestriction, $user->getRights() ) ) { return true; } else { return false; } } } /** * Output an error message telling the user what access level they have to have */ function displayRestrictionError() { global $wgOut; $wgOut->permissionRequired( $this->mRestriction ); } /** * Sets headers - this should be called from the execute() method of all derived classes! */ function setHeaders() { global $wgOut; $wgOut->setArticleRelated( false ); $wgOut->setRobotPolicy( "noindex,nofollow" ); $wgOut->setPageTitle( $this->getDescription() ); } /** * Default execute method * Checks user permissions, calls the function given in mFunction */ function execute( $par ) { global $wgUser; $this->setHeaders(); if ( $this->userCanExecute( $wgUser ) ) { $func = $this->mFunction; // only load file if the function does not exist if(!function_exists($func) and $this->mFile) { require_once( $this->mFile ); } if ( wfRunHooks( 'SpecialPageExecuteBeforeHeader', array( &$this, &$par, &$func ) ) ) $this->outputHeader(); if ( ! wfRunHooks( 'SpecialPageExecuteBeforePage', array( &$this, &$par, &$func ) ) ) return; $func( $par, $this ); if ( ! wfRunHooks( 'SpecialPageExecuteAfterPage', array( &$this, &$par, &$func ) ) ) return; } else { $this->displayRestrictionError(); } } function outputHeader() { global $wgOut, $wgContLang; $msg = $wgContLang->lc( $this->name() ) . '-summary'; $out = wfMsg( $msg ); if ( ! wfEmptyMsg( $msg, $out ) and $out !== '' and ! $this->including() ) $wgOut->addWikiText( $out ); } # Returns the name that goes in the <h1> in the special page itself, and also the name that # will be listed in Special:Specialpages # # Derived classes can override this, but usually it is easier to keep the default behaviour. # Messages can be added at run-time, see MessageCache.php function getDescription() { return wfMsg( strtolower( $this->mName ) ); } /** * Get a self-referential title object */ function getTitle() { return Title::makeTitle( NS_SPECIAL, $this->mName ); } /** * Set whether this page is listed in Special:Specialpages, at run-time */ function setListed( $listed ) { return wfSetVar( $this->mListed, $listed ); }}/** * Shortcut to construct a special page which is unlisted by default * @package MediaWiki */class UnlistedSpecialPage extends SpecialPage{ function UnlistedSpecialPage( $name, $restriction = '', $function = false, $file = 'default' ) { SpecialPage::SpecialPage( $name, $restriction, false, $function, $file ); }}/** * Shortcut to construct an includable special page * @package MediaWiki */class IncludableSpecialPage extends SpecialPage{ function IncludableSpecialPage( $name, $restriction = '', $listed = true, $function = false, $file = 'default' ) { SpecialPage::SpecialPage( $name, $restriction, $listed, $function, $file, true ); }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?