Merge "Selenium: replace UserLoginPage with BlankPage where possible"
[lhc/web/wiklou.git] / includes / skins / SkinFallbackTemplate.php
1 <?php
2
3 /**
4 * Skin template for the fallback skin.
5 *
6 * The structure is copied from the example skin (mediawiki/skins/Example).
7 *
8 * @since 1.24
9 * @file
10 */
11
12 use MediaWiki\MediaWikiServices;
13
14 /**
15 * BaseTemplate class for the fallback skin
16 */
17 class SkinFallbackTemplate extends BaseTemplate {
18 /**
19 * @return array
20 */
21 private function findInstalledSkins() {
22 $styleDirectory = $this->config->get( 'StyleDirectory' );
23 // Get all subdirectories which might contains skins
24 $possibleSkins = scandir( $styleDirectory );
25 $possibleSkins = array_filter( $possibleSkins, function ( $maybeDir ) use ( $styleDirectory ) {
26 return $maybeDir !== '.' && $maybeDir !== '..' && is_dir( "$styleDirectory/$maybeDir" );
27 } );
28
29 // Filter out skins that aren't installed
30 $possibleSkins = array_filter( $possibleSkins, function ( $skinDir ) use ( $styleDirectory ) {
31 return is_file( "$styleDirectory/$skinDir/skin.json" )
32 || is_file( "$styleDirectory/$skinDir/$skinDir.php" );
33 } );
34
35 return $possibleSkins;
36 }
37
38 /**
39 * Inform the user why they are seeing this skin.
40 *
41 * @return string
42 */
43 private function buildHelpfulInformationMessage() {
44 $defaultSkin = $this->config->get( 'DefaultSkin' );
45 $installedSkins = $this->findInstalledSkins();
46 $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
47 $enabledSkins = $skinFactory->getSkinNames();
48 $enabledSkins = array_change_key_case( $enabledSkins, CASE_LOWER );
49
50 if ( $installedSkins ) {
51 $skinsInstalledText = [];
52 $skinsInstalledSnippet = [];
53
54 foreach ( $installedSkins as $skin ) {
55 $normalizedKey = strtolower( $skin );
56 $isEnabled = array_key_exists( $normalizedKey, $enabledSkins );
57 if ( $isEnabled ) {
58 $skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-enabled' )
59 ->params( $normalizedKey, $skin )->plain();
60 } else {
61 $skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-disabled' )
62 ->params( $normalizedKey, $skin )->plain();
63 $skinsInstalledSnippet[] = $this->getSnippetForSkin( $skin );
64 }
65 }
66
67 return $this->getMsg( 'default-skin-not-found' )->params(
68 $defaultSkin,
69 implode( "\n", $skinsInstalledText ),
70 implode( "\n", $skinsInstalledSnippet ) )->numParams(
71 count( $skinsInstalledText ),
72 count( $skinsInstalledSnippet )
73 )->parseAsBlock();
74 } else {
75 return $this->getMsg( 'default-skin-not-found-no-skins' )->params(
76 $defaultSkin
77 )->parseAsBlock();
78 }
79 }
80
81 /**
82 * Get the appropriate LocalSettings.php snippet to enable the given skin
83 *
84 * @param string $skin
85 * @return string
86 */
87 private function getSnippetForSkin( $skin ) {
88 global $IP;
89 if ( file_exists( "$IP/skins/$skin/skin.json" ) ) {
90 return "wfLoadSkin( '$skin' );";
91 } else {
92 return "require_once \"\$IP/skins/$skin/$skin.php\";";
93 }
94 }
95
96 /**
97 * Outputs the entire contents of the page. No navigation (other than search box), just the big
98 * warning message and page content.
99 */
100 public function execute() {
101 $this->html( 'headelement' );
102 echo Html::warningBox( $this->buildHelpfulInformationMessage() );
103 ?>
104 <form action="<?php $this->text( 'wgScript' ) ?>">
105 <input type="hidden" name="title" value="<?php $this->text( 'searchtitle' ) ?>" />
106 <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
107 <?php echo $this->makeSearchInput( [ "id" => "searchInput" ] ) ?>
108 <?php echo $this->makeSearchButton( 'go' ) ?>
109 </form>
110
111 <div class="mw-body" role="main">
112 <h1 class="firstHeading"><?php $this->html( 'title' ) ?></h1>
113
114 <div class="mw-body-content">
115 <?php $this->html( 'bodytext' ) ?>
116 <?php $this->html( 'catlinks' ) ?>
117 </div>
118 </div>
119
120 <?php $this->printTrail() ?>
121 </body></html>
122
123 <?php
124 }
125 }