summaryrefslogtreecommitdiff
path: root/includes/skins/SkinFallbackTemplate.php
blob: 1c5f3a6fc498f62b606269a7d241f9c2649d4e1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php

/**
 * Skin template for the fallback skin.
 *
 * The structure is copied from the example skin (mediawiki/skins/Example).
 *
 * @since 1.24
 * @file
 */

/**
 * BaseTemplate class for the fallback skin
 */
class SkinFallbackTemplate extends BaseTemplate {
	/**
	 * @return array
	 */
	private function findInstalledSkins() {
		$styleDirectory = $this->config->get( 'StyleDirectory' );
		// Get all subdirectories which might contains skins
		$possibleSkins = scandir( $styleDirectory );
		$possibleSkins = array_filter( $possibleSkins, function ( $maybeDir ) use ( $styleDirectory ) {
			return $maybeDir !== '.' && $maybeDir !== '..' && is_dir( "$styleDirectory/$maybeDir" );
		} );

		// Filter out skins that aren't installed
		$possibleSkins = array_filter( $possibleSkins, 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() {
		$defaultSkin = $this->config->get( 'DefaultSkin' );
		$installedSkins = $this->findInstalledSkins();
		$enabledSkins = SkinFactory::getDefaultInstance()->getSkinNames();
		$enabledSkins = array_change_key_case( $enabledSkins, CASE_LOWER );

		if ( $installedSkins ) {
			$skinsInstalledText = array();
			$skinsInstalledSnippet = array();

			foreach ( $installedSkins as $skin ) {
				$normalizedKey = strtolower( $skin );
				$isEnabled = array_key_exists( $normalizedKey, $enabledSkins );
				if ( $isEnabled ) {
					$skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-enabled' )
						->params( $normalizedKey, $skin )->plain();
				} else {
					$skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-disabled' )
						->params( $normalizedKey, $skin )->plain();
					$skinsInstalledSnippet[] = $this->getSnippetForSkin( $skin );
				}
			}

			return $this->getMsg( 'default-skin-not-found' )->params(
				$defaultSkin,
				implode( "\n", $skinsInstalledText ),
				implode( "\n", $skinsInstalledSnippet )
			)->parseAsBlock();
		} else {
			return $this->getMsg( '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 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\";";
		}
	}

	/**
	 * Outputs the entire contents of the page. No navigation (other than search box), just the big
	 * warning message and page content.
	 */
	public function execute() {
		$this->html( 'headelement' ) ?>

		<div class="warningbox">
			<?php echo $this->buildHelpfulInformationMessage() ?>
		</div>

		<form action="<?php $this->text( 'wgScript' ) ?>">
			<input type="hidden" name="title" value="<?php $this->text( 'searchtitle' ) ?>" />
			<h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
			<?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ) ?>
			<?php echo $this->makeSearchButton( 'go' ) ?>
		</form>

		<div class="mw-body" role="main">
			<h1 class="firstHeading"><?php $this->html( 'title' ) ?></h1>

			<div class="mw-body-content">
				<?php $this->html( 'bodytext' ) ?>
				<?php $this->html( 'catlinks' ) ?>
			</div>
		</div>

		<?php $this->printTrail() ?>
		</body></html>

	<?php
	}
}