/** * Renders an error template. * * @throws \Exception * @return null */ public function actionRenderError() { $error = craft()->errorHandler->getError(); $code = (string) $error['code']; if (craft()->request->isSiteRequest()) { $prefix = craft()->config->get('errorTemplatePrefix'); if (craft()->templates->doesTemplateExist($prefix . $code)) { $template = $prefix . $code; } else { if ($code == 503 && craft()->templates->doesTemplateExist($prefix . 'offline')) { $template = $prefix . 'offline'; } else { if (craft()->templates->doesTemplateExist($prefix . 'error')) { $template = $prefix . 'error'; } } } } if (!isset($template)) { craft()->templates->setTemplateMode(TemplateMode::CP); if (craft()->templates->doesTemplateExist($code)) { $template = $code; } else { $template = 'error'; } } try { $variables = array_merge($error); // Escape any inner-word underscores, which Markdown mistakes for italics // TODO: This won't be necessary in 3.0 thanks to Parsedown $variables['message'] = preg_replace('/(?<=[a-zA-Z])_(?=[a-zA-Z])/', '\\_', $variables['message']); // If this is a PHP error and html_errors (http://php.net/manual/en/errorfunc.configuration.php#ini.html-errors) // is enabled, then allow the HTML not get encoded if (strncmp($variables['type'], 'PHP ', 4) === 0 && AppHelper::getPhpConfigValueAsBool('html_errors')) { $variables['message'] = TemplateHelper::getRaw($variables['message']); } $this->renderTemplate($template, $variables); } catch (\Exception $e) { if (YII_DEBUG) { throw $e; } else { // Just output the error message echo str_replace(array('“', '”', '‘', '’'), array('"', '"', '\'', '\''), $e->getMessage()); } } }