wiki.techinc.nl/includes/skins/SkinFallback.php
Umherirrender 8de3b7d324 Use static closures where safe to use
This is micro-optimization of closure code to avoid binding the closure
to $this where it is not needed.

Created by I25a17fb22b6b669e817317a0f45051ae9c608208

Change-Id: I0ffc6200f6c6693d78a3151cb8cea7dce7c21653
2021-02-11 00:13:52 +00:00

124 lines
3.8 KiB
PHP

<?php
/**
* Skin file for the fallback skin.
*
* @since 1.24
* @file
*/
use MediaWiki\MediaWikiServices;
/**
* SkinTemplate class for the fallback skin
*/
class SkinFallback extends SkinMustache {
public $skinname = 'fallback';
/**
* @param OutputPage $out
*/
public function initPage( OutputPage $out ) {
parent::initPage( $out );
$out->enableClientCache( false );
}
/**
* @return array
*/
private function findInstalledSkins() {
$config = $this->getConfig();
$styleDirectory = $config->get( 'StyleDirectory' );
// Get all subdirectories which might contains skins
$possibleSkins = scandir( $styleDirectory );
$possibleSkins = array_filter( $possibleSkins, static function ( $maybeDir ) use ( $styleDirectory ) {
return $maybeDir !== '.' && $maybeDir !== '..' && is_dir( "$styleDirectory/$maybeDir" );
} );
// Filter out skins that aren't installed
$possibleSkins = array_filter( $possibleSkins, static function ( $skinDir ) use ( $styleDirectory ) {
return is_file( "$styleDirectory/$skinDir/skin.json" )
|| is_file( "$styleDirectory/$skinDir/$skinDir.php" );
} );
return $possibleSkins;
}
/**
* Inform the user why they are seeing this skin.
*
* @return string
*/
private function buildHelpfulInformationMessage() {
$config = $this->getConfig();
$defaultSkin = $config->get( 'DefaultSkin' );
$installedSkins = $this->findInstalledSkins();
$skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
$enabledSkins = $skinFactory->getSkinNames();
$enabledSkins = array_change_key_case( $enabledSkins, CASE_LOWER );
if ( $installedSkins ) {
$skinsInstalledText = [];
$skinsInstalledSnippet = [];
foreach ( $installedSkins as $skinKey ) {
$normalizedKey = strtolower( $skinKey );
$isEnabled = array_key_exists( $normalizedKey, $enabledSkins );
if ( $isEnabled ) {
$skinsInstalledText[] = $this->msg( 'default-skin-not-found-row-enabled' )
->params( $normalizedKey, $skinKey )->plain();
} else {
$skinsInstalledText[] = $this->msg( 'default-skin-not-found-row-disabled' )
->params( $normalizedKey, $skinKey )->plain();
$skinsInstalledSnippet[] = $this->getSnippetForSkin( $skinKey );
}
}
return $this->msg( 'default-skin-not-found' )->params(
$defaultSkin,
implode( "\n", $skinsInstalledText ),
implode( "\n", $skinsInstalledSnippet ) )->numParams(
count( $skinsInstalledText ),
count( $skinsInstalledSnippet )
)->parseAsBlock();
} else {
return $this->msg( 'default-skin-not-found-no-skins' )->params(
$defaultSkin
)->parseAsBlock();
}
}
/**
* Get the appropriate LocalSettings.php snippet to enable the given skin
*
* @param string $skin
* @return string
*/
private static function getSnippetForSkin( $skin ) {
global $IP;
if ( file_exists( "$IP/skins/$skin/skin.json" ) ) {
return "wfLoadSkin( '$skin' );";
} else {
return "require_once \"\$IP/skins/$skin/$skin.php\";";
}
}
/**
* Adds an `html-fallback-warning` template to inform system administrators
* that their mediawiki skin is incorrectly setup.
* It's recommended that skin developers do not add further to date here
* and instead work on improving SkinMustache::getTemplateData where necessary
* to improve flexibility of the data for all skin developers.
* @inheritDoc
* @return array
*/
public function getTemplateData() {
$config = $this->getConfig();
$skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
$data = parent::getTemplateData();
// If the default skin isn't configured correctly, append a warning to the
// subtitle to alert a sysadmin.
if ( !isset( $skinFactory->getSkinNames()[$config->get( 'DefaultSkin' )] ) ) {
$data['html-fallback-warning'] = Html::warningBox( $this->buildHelpfulInformationMessage() );
}
return $data;
}
}