Source for file BaseException.class.php

Documentation is available at BaseException.class.php

  1. /**
  2.  * Класс BaseException
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author 1m.dm
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkBaseException.class.php.html,v 1.1 2007/09/17 14:32:33 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/DBWorker.class.php';
  12. require_once 'core/framework/Transformer.class.php';
  13. require_once 'core/framework/Response.class.php';
  14. require_once('core/framework/Mail.class.php');
  15. require_once('core/framework/Language.class.php');
  16. /**
  17.  * Базовое исключение.
  18.  *
  19.  * @package energine
  20.  * @subpackage core
  21.  */
  22. class BaseException extends Exception {
  23.  
  24.     /**
  25.      * XSLT-документ для страницы ошибки
  26.      */
  27.     const ERROR_TRANSFORMER = 'error_page.xslt';
  28.  
  29.     /**
  30.      * Критическая ошибка
  31.      */
  32.     const ERR_CRITICAL = 0;
  33.  
  34.     /**
  35.      * Ошибка 404 - страницы не существует
  36.      */
  37.     const ERR_404 = 1;
  38.  
  39.     /**
  40.      * Ошибка 403 - нет прав на просмотр страницы
  41.      */
  42.     const ERR_403 = 2;
  43.  
  44.     /**
  45.      * Ошибка при работе с БД
  46.      */
  47.     const ERR_DB = 3;
  48.  
  49.     /**
  50.      * Ошибка разработчика, где-то что-то неверно написано :)
  51.      */
  52.     const ERR_DEVELOPER = 4;
  53.  
  54.     /**
  55.      * Предупреждение
  56.      */
  57.     const ERR_WARNING = 10;
  58.  
  59.     /**
  60.      * Замечание
  61.      */
  62.     const ERR_NOTICE = 20;
  63.  
  64.     /**
  65.      * Ошибка, связанная с мультиязычностью. Возникает при обработке другой
  66.      * ошибки и отсутствия для неё переводов. Без ERR_LANG возможет уход
  67.      * в рекурсию и полный пиздец.
  68.      *
  69.      * Данная ошибка касается исключительно разработчиков системы.
  70.      *
  71.      * @todo сделать хоть что-нибудь! :)
  72.      */
  73.     const ERR_LANG = 5;
  74.  
  75.     /**
  76.      * Когда режим отладки включен:
  77.      *
  78.      *     1. Можно вывести XML-документ страницы добавив к query-части URI
  79.      *        параметр 'debug'.
  80.      *     2. При обработке системных ошибок выводится максимально подробная
  81.      *        информация о возникшей ошибке.
  82.      *
  83.      * @access private
  84.      * @var boolean флаг режима отладки
  85.      */
  86.     private $isDebugEnabled = true;
  87.  
  88.     /**
  89.      * @access protected
  90.      * @var Response экземпляр объекта Response
  91.      */
  92.     protected $response;
  93.  
  94.     /**
  95.      * @access protected
  96.      * @var boolean флаг режима вывода XML-документа страницы
  97.      * @todo плохое имя
  98.      */
  99.     protected $isXML;
  100.  
  101.     /**
  102.      * @access protected
  103.      * @var DOMDocument 
  104.      */
  105.     protected $doc;
  106.  
  107.     /**
  108.      * @access protected
  109.      * @var mixed дополнительная информация об ошибке
  110.      */
  111.     protected $customMessages = array();
  112.  
  113.     /**
  114.      * Конструктор класса.
  115.      *
  116.      * @access public
  117.      * @param string $message 
  118.      * @param int $code 
  119.      * @param mixed $customMessages 
  120.      * @return void 
  121.      * @todo определиться с $customMessages: это mixed или array?
  122.      */
  123.     public function __construct($message$code self::ERR_CRITICAL$customMessages null{
  124.         SystemConfig::load();
  125.         $this->isDebugEnabled = (bool)SystemConfig::_getConfigValue('site.debug');
  126.  
  127.         $this->response = Response::getInstance();
  128.         $this->isXML = isset($_GET['debug']);
  129.         $this->doc = new DOMDocument('1.0''UTF-8');
  130.         if (isset($customMessages)) {
  131.             if (!is_array($customMessages)) {
  132.                 $this->customMessages = array($customMessages);
  133.             }
  134.             else {
  135.                 $this->customMessages = $customMessages;
  136.             }
  137.         }
  138.  
  139.         if ($code == self::ERR_LANG{
  140.             $message DBWorker::_translate($messageLanguage::getInstance()->getDefault());
  141.         }
  142.         elseif ($code != self::ERR_DB {
  143.             $message DBWorker::_translate($messageLanguage::getInstance()->getCurrent());
  144.         }
  145.  
  146.         parent::__construct($message$code);
  147.     }
  148.  
  149.     /**
  150.      * Возвращает дополнительную информацию об ошибке.
  151.      *
  152.      * @access public
  153.      * @return string 
  154.      * @todo переименовать в getCustomMessages
  155.      */
  156.     public function getCustomMessage({
  157.         return $this->customMessages;
  158.     }
  159.  
  160.     /**
  161.      * Отправляет уведомление о ошибке
  162.      *
  163.      * @return void 
  164.      * @access private
  165.      */
  166.  
  167.     private function sendNotification({
  168.         $mail new Mail();
  169.         $projectName ($fake SystemConfig::_getConfigValue('project.name'))?$fake:$_SERVER['HTTP_HOST'];
  170.         $from SystemConfig::_getConfigValue('mail.from');
  171.         $customMessage = implode("\r\n"$this->getCustomMessage());
  172.  
  173.         $body = sprintf("Project:%s\r\nCode:%s\r\nMessage:%s\r\nCustomMessage:%s\r\n,File:%s\r\nLine:%s\r\nTrace:%s"$projectName$this->getCode()$this->getMessage()$customMessage,$this->getFile()$this->getLine()$this->getTraceAsString());
  174.         $mail->setText($body)
  175.             ->setFrom($from$from)
  176.             ->addTo(SystemConfig::_getConfigValue('mail.feedback'))
  177.             ->setSubject($projectName.' Error Notification:'.$this->getMessage())
  178.             ->send();
  179.     }
  180.     /**
  181.      * Формирует XML-представление ошибки.
  182.      *
  183.      * @access protected
  184.      * @return void 
  185.      */
  186.     protected function build({
  187.         $request Request::getInstance();
  188.  
  189.         $dom_errors $this->doc->createElement('errors');
  190.         $dom_errors->setAttribute('uri'$request->getPath(Request::PATH_WHOLEtrue));
  191.         $dom_errors->setAttribute('base'$request->getBasePath());
  192.         $dom_errors->setAttribute('debug'$this->isDebugEnabled);
  193.  
  194.         $dom_error $this->doc->createElement('error');
  195.         $dom_error->setAttribute('code'$this->getCode());
  196.         $dom_error->setAttribute('file'$this->getFile());
  197.         $dom_error->setAttribute('line'$this->getLine());
  198.  
  199.         $dom_error->appendChild(
  200.             $this->doc->createElement('message'$this->getMessage())
  201.         );
  202.  
  203.         $customMessages $this->getCustomMessage();
  204.         if ($customMessages{
  205.             $dom_customMessages $this->doc->createElement('customMessages');
  206.             if (is_array($customMessages)) {
  207.                 foreach ($customMessages as $customMessage{
  208.                     $dom_customMessages->appendChild(
  209.                         $this->doc->createElement('customMessage'$customMessage)
  210.                     );
  211.                 }
  212.             }
  213.             else {
  214.                 $dom_customMessages->nodeValue $customMessages;
  215.             }
  216.             $dom_error->appendChild($dom_customMessages);
  217.         }
  218.  
  219.         $dom_errors->appendChild($dom_error);
  220.         $this->doc->appendChild($dom_errors);
  221.     }
  222.  
  223.     /**
  224.      * Обрабатывает ошибку путём её вывода :)
  225.      *
  226.      * @access public
  227.      * @return void 
  228.      */
  229.     public function handle({
  230.         if (!in_array($this->getCode()array(self::ERR_403self::ERR_404self::ERR_NOTICEself::ERR_WARNING)) && !$this->isDebugEnabled{
  231.             $this->sendNotification();
  232.         }
  233.  
  234.         $this->build();
  235.  
  236.         if ($this->isDebugEnabled && $this->isXML{
  237.             $this->response->setHeader('Content-Type''text/xml; charset=UTF-8');
  238.             $result $this->doc->saveXML();
  239.         }
  240.         else {
  241.             $this->response->setHeader('Content-Type''text/html; charset=UTF-8');
  242.             $transformer new Transformer;
  243.             $result $transformer->transform($this->docself::ERROR_TRANSFORMER);
  244.         }
  245.  
  246.         $this->response->write($result);
  247.         $this->response->commit();
  248.     }
  249. }

Documentation generated on Mon, 17 Sep 2007 13:25:17 +0300 by phpDocumentor 1.4.0a2