Completely remove skin autodiscovery

Also update documentation.

Bug: 65748
Change-Id: I393896281e901de2000c09c0abd16ee2a0f41e2f
This commit is contained in:
Bartosz Dziewoński 2014-05-26 17:41:57 +02:00 committed by Kunal Mehta
parent 07da3a1362
commit 5b11fa4146
3 changed files with 22 additions and 137 deletions

View file

@ -23,6 +23,9 @@ regularly. Below only new and removed languages are listed, as well as
changes to languages because of Bugzilla reports.
=== Other changes in 1.25 ===
* The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been
removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for
migration guide for creators and users of custom skins that relied on it.
== Compatibility ==

View file

@ -53,40 +53,30 @@ server-side source files. This is done by editing some pages on the wiki:
These can also be customised on a per-user basis, by editing
[[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
This feature has led to a wide variety of "user styles" becoming available:
https://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
== Custom skins ==
If you want a different look for your wiki, that gallery is a good place to start.
Several custom skins are available as of 2014.
== Drop-in custom skins ==
https://www.mediawiki.org/wiki/Category:All_skins
If you put a file in MediaWiki's skins directory, ending in .php, the name of
the file will automatically be added as a skin name, and the file will be
expected to contain a class called Skin<name> with the skin class. You can then
make that skin the default by adding to LocalSettings.php:
Installing a skin requires adding its files in a subdirectory under skins/ and
adding an appropriate require_once line to LocalSettings.php, similarly to how
extensions are installed.
$wgDefaultSkin = '<name>';
You can then make that skin the default by adding:
$wgDefaultSkin = '<name>';
You can also disable dropped-in or core skins using:
Or disable it entirely by removing the require_once line. (User settings will
not be lost if it's reenabled later.)
$wgSkipSkins[] = '<name>';
See https://www.mediawiki.org/wiki/Manual:Skinning for more information on
writing new skins.
This technique is used by the more ambitious MediaWiki site operators, to
create complex custom skins for their wikis. It should be preferred over
editing the core Monobook skin directly.
See https://www.mediawiki.org/wiki/Manual:Skinning for more information.
== Extension skins ==
It is now possible (since MediaWiki 1.12) to write a skin as a standard
MediaWiki extension, enabled via LocalSettings.php. This is done by adding
it to $wgValidSkinNames, for example:
$wgValidSkinNames['mycoolskin'] = 'MyCoolSkin';
and then registering a class in $wgAutoloadClasses called SkinMycoolSkin, which
derives from Skin. This technique is apparently not yet used (as of 2008)
outside the DumpHTML extension.
Until MediaWiki 1.25 it used to be possible to just put a <name>.php file in
MediaWiki's skins/ directory, which would be loaded and expected to contain the
Skin<name> class. This way has always been discouraged because of its limitations
(inability to add localisation messages, ResourceLoader modules, etc.) and
awkwardness in managing such skins. For information on migrating skins using
this old method, see <https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery>.

View file

@ -40,13 +40,6 @@ class SkinFactory {
* @var array
*/
private $displayNames = array();
/**
* Map of name => class name without "Skin" prefix, for legacy skins using the autodiscovery
* mechanism
*
* @var array
*/
private $legacySkins = array();
/**
* @var SkinFactory
@ -82,66 +75,6 @@ class SkinFactory {
$this->displayNames[$name] = $displayName;
}
/**
* @return array
*/
private function getLegacySkinNames() {
static $skinsInitialised = false;
if ( !$skinsInitialised || !count( $this->legacySkins ) ) {
# Get a list of available skins
# Build using the regular expression '^(.*).php$'
# Array keys are all lower case, array value keep the case used by filename
#
wfProfileIn( __METHOD__ . '-init' );
global $wgStyleDirectory;
$skinDir = dir( $wgStyleDirectory );
if ( $skinDir !== false && $skinDir !== null ) {
# while code from www.php.net
while ( false !== ( $file = $skinDir->read() ) ) {
// Skip non-PHP files, hidden files, and '.dep' includes
$matches = array();
if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
$aSkin = $matches[1];
// Explicitly disallow loading core skins via the autodiscovery mechanism.
//
// They should be loaded already (in a non-autodicovery way), but old files might still
// exist on the server because our MW version upgrade process is widely documented as
// requiring just copying over all files, without removing old ones.
//
// This is one of the reasons we should have never used autodiscovery in the first
// place. This hack can be safely removed when autodiscovery is gone.
if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) {
wfLogWarning(
"An old copy of the $aSkin skin was found in your skins/ directory. " .
"You should remove it to avoid problems in the future." .
"See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details."
);
continue;
}
wfLogWarning(
"A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " .
"The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " .
"See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this."
);
$this->legacySkins[strtolower( $aSkin )] = $aSkin;
}
}
$skinDir->close();
}
$skinsInitialised = true;
wfProfileOut( __METHOD__ . '-init' );
}
return $this->legacySkins;
}
/**
* Returns an associative array of:
* skin name => human readable name
@ -149,43 +82,7 @@ class SkinFactory {
* @return array
*/
public function getSkinNames() {
return array_merge(
$this->getLegacySkinNames(),
$this->displayNames
);
}
/**
* Get a legacy skin which uses the autodiscovery mechanism.
*
* @param string $name
* @return Skin|bool False if the skin couldn't be constructed
*/
private function getLegacySkin( $name ) {
$skinNames = $this->getLegacySkinNames();
if ( !isset( $skinNames[$name] ) ) {
return false;
}
$skinName = $skinNames[$name];
$className = "Skin{$skinName}";
# Grab the skin class and initialise it.
if ( !class_exists( $className ) ) {
global $wgStyleDirectory;
require_once "{$wgStyleDirectory}/{$skinName}.php";
# Check if we got it
if ( !class_exists( $className ) ) {
# DO NOT die if the class isn't found. This breaks maintenance
# scripts and can cause a user account to be unrecoverable
# except by SQL manipulation if a previously valid skin name
# is no longer valid.
return false;
}
}
$skin = new $className( $name );
return $skin;
return $this->displayNames;
}
/**
@ -197,11 +94,6 @@ class SkinFactory {
*/
public function makeSkin( $name ) {
if ( !isset( $this->factoryFunctions[$name] ) ) {
// Check the legacy autodiscovery method of skin loading
$legacy = $this->getLegacySkin( $name );
if ( $legacy ) {
return $legacy;
}
throw new SkinException( "No registered builder available for $name." );
}
$skin = call_user_func( $this->factoryFunctions[$name], $name );