X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecialpage%2FSpecialPageFactory.php;h=48bcb77867d4c0abefbf6005fc4e14a45faeb630;hb=d0a40e9a780f5ad5c147fbd2315a24ff32a22b65;hp=0138cf9c912a0a717a53d304ad99de1d0828c8c5;hpb=25d7b71a1b75ebf0060cfc1a4d54815c673e3f62;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 0138cf9c91..48bcb77867 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -114,6 +114,7 @@ class SpecialPageFactory { // Media reports and uploads 'Listfiles' => 'SpecialListFiles', 'Filepath' => 'SpecialFilepath', + 'MediaStatistics' => 'MediaStatisticsPage', 'MIMEsearch' => 'MIMEsearchPage', 'FileDuplicateSearch' => 'FileDuplicateSearchPage', 'Upload' => 'SpecialUpload', @@ -176,11 +177,41 @@ class SpecialPageFactory { private static $aliases; /** - * Get the special page list + * Reset the internal list of special pages. Useful when changing $wgSpecialPages after + * the internal list has already been initialized, e.g. during testing. + */ + public static function resetList() { + self::$list = null; + self::$aliases = null; + } + + /** + * Returns a list of canonical special page names. + * May be used to iterate over all registered special pages. + * + * @return string[] + */ + public static function getNames() { + return array_keys( self::getPageList() ); + } + + /** + * Get the special page list as an array * + * @deprecated since 1.24, use getNames() instead. * @return array */ - static function getList() { + public static function getList() { + wfDeprecated( __FUNCTION__, '1.24' ); + return self::getPageList(); + } + + /** + * Get the special page list as an array + * + * @return array + */ + private static function getPageList() { global $wgSpecialPages; global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication; global $wgEnableEmail, $wgEnableJavaScriptTest; @@ -237,12 +268,12 @@ class SpecialPageFactory { * contain at least one entry (English fallbacks will be added if necessary). * @return object */ - static function getAliasList() { + private static function getAliasListObject() { if ( !is_object( self::$aliases ) ) { global $wgContLang; $aliases = $wgContLang->getSpecialPageAliases(); - $missingPages = self::getList(); + $missingPages = self::getPageList(); self::$aliases = array(); // Check for $aliases being an array since Language::getSpecialPageAliases can return null @@ -279,8 +310,8 @@ class SpecialPageFactory { $caseFoldedAlias = $wgContLang->caseFold( $bits[0] ); $caseFoldedAlias = str_replace( ' ', '_', $caseFoldedAlias ); - if ( isset( self::getAliasList()->$caseFoldedAlias ) ) { - $name = self::getAliasList()->$caseFoldedAlias; + if ( isset( self::getAliasListObject()->$caseFoldedAlias ) ) { + $name = self::getAliasListObject()->$caseFoldedAlias; } else { return array( null, null ); } @@ -331,7 +362,7 @@ class SpecialPageFactory { public static function exists( $name ) { list( $title, /*...*/ ) = self::resolveAlias( $name ); - $specialPageList = self::getList(); + $specialPageList = self::getPageList(); return isset( $specialPageList[$title] ); } @@ -343,22 +374,39 @@ class SpecialPageFactory { */ public static function getPage( $name ) { list( $realName, /*...*/ ) = self::resolveAlias( $name ); - $specialPageList = self::getList(); + + $specialPageList = self::getPageList(); + if ( isset( $specialPageList[$realName] ) ) { $rec = $specialPageList[$realName]; + if ( is_string( $rec ) ) { $className = $rec; - - return new $className; + $page = new $className; + } elseif ( is_callable( $rec ) ) { + // Use callback to instantiate the special page + $page = call_user_func( $rec ); } elseif ( is_array( $rec ) ) { $className = array_shift( $rec ); // @deprecated, officially since 1.18, unofficially since forever wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " . "define a subclass of SpecialPage instead.", '1.18' ); - $specialPageList[$realName] = MWFunction::newObj( $className, $rec ); + $page = MWFunction::newObj( $className, $rec ); + } elseif ( $rec instanceof SpecialPage ) { + $page = $rec; //XXX: we should deep clone here + } else { + $page = null; + } + + if ( $page instanceof SpecialPage ) { + return $page; + } else { + // It's not a classname, nor a callback, nor a legacy constructor array, + // nor a special page object. Give up. + wfLogWarning( "Cannot instantiate special page $realName: bad spec!" ); + return null; } - return $specialPageList[$realName]; } else { return null; } @@ -378,7 +426,7 @@ class SpecialPageFactory { global $wgUser; $user = $wgUser; } - foreach ( self::getList() as $name => $rec ) { + foreach ( self::getPageList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page ) { // not null $page->setContext( RequestContext::getMain() ); @@ -400,7 +448,7 @@ class SpecialPageFactory { */ public static function getRegularPages() { $pages = array(); - foreach ( self::getList() as $name => $rec ) { + foreach ( self::getPageList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page->isListed() && !$page->isRestricted() ) { $pages[$name] = $page; @@ -423,7 +471,7 @@ class SpecialPageFactory { global $wgUser; $user = $wgUser; } - foreach ( self::getList() as $name => $rec ) { + foreach ( self::getPageList() as $name => $rec ) { $page = self::getPage( $name ); if ( $page->isListed() @@ -532,7 +580,7 @@ class SpecialPageFactory { * @param IContextSource $context * @return string HTML fragment */ - static function capturePath( Title $title, IContextSource $context ) { + public static function capturePath( Title $title, IContextSource $context ) { global $wgOut, $wgTitle, $wgRequest, $wgUser, $wgLang; // Save current globals @@ -569,7 +617,7 @@ class SpecialPageFactory { * @param string|bool $subpage * @return string */ - static function getLocalNameFor( $name, $subpage = false ) { + public static function getLocalNameFor( $name, $subpage = false ) { global $wgContLang; $aliases = $wgContLang->getSpecialPageAliases(); @@ -608,7 +656,7 @@ class SpecialPageFactory { * @param string $alias * @return Title|null Title or null if there is no such alias */ - static function getTitleForAlias( $alias ) { + public static function getTitleForAlias( $alias ) { list( $name, $subpage ) = self::resolveAlias( $alias ); if ( $name != null ) { return SpecialPage::getTitleFor( $name, $subpage );