* @link http://netmonsters.ru * @package Majestic * @subpackage app * @since 2010-02-25 * @version SVN: $Id$ * @filesource $URL$ */ class ErrorAction extends Action { /** * @var ErrorException */ public $exception; public function __construct($exception) { $this->exception = $exception; parent::__construct(); } protected function execute() { $this->template = 500; if ($this->exception instanceof Error404Exception) { if ($this->isAjaxActionError()) { if (!headers_sent()) { header('HTTP/1.0 404 Not Found'); die(); } } $this->template = 404; } $this->logError(); $this->sendHTTPCode(); } protected function getTemplate() { return '/actions/' . $this->template; } protected function sendHttpCode() { if (headers_sent()) { return; } switch ($this->template) { case 404: header('HTTP/1.0 404 Not Found'); break; default: header('HTTP/1.0 500 Internal Server Error'); } } protected function logError() { if ($this->template == 500) { $error = 0; $ex = $this->exception; if ($ex instanceof ErrorException) { $error = $ex->getSeverity(); } switch ($error) { case E_NOTICE: $error = 'Notice'; break; case E_WARNING: $error = 'Warning'; break; case E_ERROR: $error = 'Fatal Error'; break; default: $error = 'Unknown Error'; break; } $message = 'PHP ' . $error . ': ' . $ex->getMessage() . ' in ' . $ex->getFile() . ' on line ' . $ex->getLine(); error_log($message); } } /** * Check, if exception was thrown from AjaxAction Class * @return bool */ protected function isAjaxActionError() { $trace = $this->exception->getTrace(); foreach ($trace as $line) { if (isset($line['class']) && $line['class'] === 'AjaxAction') { return true; } } return false; } }