MediaWiki  master
MissingExtensionException.php
Go to the documentation of this file.
1 <?php
3 
16 class MissingExtensionException extends Exception {
18  private $isSkin;
20  private $extName = 'unknown';
22  private $path;
24  private $error;
25 
30  public function __construct( $path, $error ) {
31  $this->isSkin = str_ends_with( $path, "/skin.json" );
32  $m = [];
33  preg_match( "!/([^/]*)/[^/]*.json$!", $path, $m );
34  if ( $m ) {
35  $this->extName = $m[1];
36  }
37  $this->path = $path;
38  $this->error = $error;
39 
40  parent::__construct( "Error Loading extension. Unable to open file $path: $error" );
41  }
42 
50  private function renderHtml() {
51  if ( !headers_sent() ) {
52  HttpStatus::header( 500 );
53  header( 'Content-Type: text/html; charset=UTF-8' );
54  }
55 
56  $templateParser = new TemplateParser( null, new EmptyBagOStuff() );
57 
58  try {
59  echo $templateParser->processTemplate(
60  'ExtensionConfigError',
61  [
62  'version' => MW_VERSION,
63  'path' => $this->path,
64  'type' => $this->isSkin ? 'skin' : 'extension',
65  'error' => $this->error,
66  'extName' => $this->extName,
67  'trace' => $this->getTraceAsString(),
68  'mwLogo' => $this->getMWLogo(),
69  ]
70  );
71  } catch ( Exception $e ) {
72  echo 'Error: ' . htmlspecialchars( $e->getMessage() );
73  }
74  }
75 
79  private function renderText() {
80  $type = $this->isSkin ? 'skin' : 'extension';
81  echo "Error: The $this->extName $type cannot be loaded. "
82  . "Check that all of its files are installed properly.\n\n";
83  echo $this->getTraceAsString();
84  echo "\n";
85  }
86 
92  public function render() {
93  if ( wfIsCli() ) {
94  $this->renderText();
95  } else {
96  $this->renderHtml();
97  }
98  // Make sure that the error gets into logs.
99  // This will also stop execution.
100  trigger_error( $this->getMessage(), E_USER_ERROR );
101  }
102 
108  private function getMWLogo() {
109  global $wgResourceBasePath;
110  $suffix = "/resources/assets/mediawiki.png";
111  if ( $wgResourceBasePath !== null ) {
112  // We are early in setup, so we can't rely on this.
113  return $wgResourceBasePath . $suffix;
114  }
115  $path = '/';
116  foreach ( array_filter( explode( '/', $_SERVER['PHP_SELF'] ) ) as $part ) {
117  if ( !preg_match( '/\.php$/', $part ) ) {
118  $path .= "$part/";
119  } else {
120  break;
121  }
122  }
123 
124  return $path . $suffix;
125  }
126 }
const MW_VERSION
The running version of MediaWiki.
Definition: Defines.php:36
$templateParser
A BagOStuff object with no objects in it.
static header( $code)
Output an HTTP status code header.
Definition: HttpStatus.php:96
Thrown when ExtensionRegistry cannot open the extension.json or skin.json file.
render()
Output an error response and exit.
$wgResourceBasePath
Config variable stub for the ResourceBasePath setting, for use by phpdoc and IDEs.