* @copyright This is copyrighted under GNU public license. */ /** Интерфейс intGetMyProperties. * * * Интерфейс оставшийся в наследство от предыдущей попытки реализовать фреймоворк. * Не используется. * * * @package SimpRa * @subpackage Core * @category Core Interfaces * @deprecated * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ interface intGetMyProperties { /** * По сути должна осуществлять доступ к базе данных и получать свойства элемента этого класса. * Не используется * * @param object $db - экземпляр класса, осуществляющего работу с базой данных * @param array @params - массив параметров * @deprecated * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ function getMyProperties($db, $params); } /** Интерфейс AssignerClass. * * * Интерфейс оставшийся в наследство от предыдущей попытки реализовать фреймоворк. * Используется для классов, которые должны уметь присваивать себе значения переменных извне. * * * @package SimpRa * @subpackage Core * @category Core Interfaces * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ interface AssignerClass { /** * Функция для добавления свойства, полученного вне класса, но обязанного в нем присутствовать. * * @param mixed $name - имя переменной * @param mixed $value - ее значение * * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ function _Assign($name, $value); /** * Функция для удаления свойства класса. * * @param mixed $name - имя переменной * * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ function _Unsign($name); /** * Функция для вывода всех переменных, подписанных данным класом. * * @param mixed $name - имя переменной * * @version 0.1.0 alpha * @author Denis Ranneft a.k.a. ImmortaL */ function _ShowSignedValues(); } * @copyright (с) Immortal, 510 * @version 0.5 */ /** Класс ядра приложения. * *
 * 
 * Принимает все основные настройки, а также массивы
 * Отправляет на страницу "сайт на сервисном обслуживании".
 *
 * В случае включенных параметрах выводи - ссылки на логи, дампы массивов $_GET, $_POST и $_SESSION
 * Настройки в файле /app/config/setupsystem.ini.
 * 
 * 
* * @package SimpRa * @subpackage Core * @category Core Classes * @version 0.2.0a * @since 0.1 * @author Denis Ranneft a.k.a. ImmortaL * @copyright (с) Immortal, 2010 */ class Core { /** * Содержит дамп массива $_GET. * @access private * @var string $getdump * @since 0.1.0a */ public $getdump = ''; /** * Содержит дамп массива $_POST * @access private * @var string $postdump * @since 0.1.0a */ private $postdump = ''; /** * Содержит дамп массива $_SESSION. * @access private * @var string $sessiondump * @since 0.1.0a */ private $sessiondump = ''; /** * Содержит настройки ядра. * @access private * @var array $systemarray * @since 0.1.0a */ private $systemarray = array(); /** Пожалуй, один из самых главных конструкторов в приложении. * * Принимает все системные свойства, полученные при помощи класса конфигурации. * * * @access public * @param array $system_array Basic system configuration array. * @uses Config::$system * @since 0.1.0a * @version f0.2 * @author Denis Ranneft a.k.a. ImmortaL */ function __construct($system_array) { $this->systemarray=$system_array; $this->varDumpGet($_GET); $this->varDumpPost($_POST); $this->varDumpSession($_SESSION); if ($this->systemarray['servicemode']=='on' && preg_match('/.+'.'\/admin\/'.'.+/i', $_SERVER['SCRIPT_FILENAME'], $matches)==0) { header ('location: '.$this->systemarray['service_dir'].'under_works.php'); } if ($this->systemarray['debugmode']=='on') { if ($this->systemarray['showGetDump']=='on') { echo($this->getdump); } if ($this->systemarray['showPostDump']=='on') { echo($this->postdump); } if ($this->systemarray['showSessionDump']=='on') { echo($this->sessiondump); } } if ($this->systemarray['showErrors']=='on') { echo 'systemarray['logs_dir']).'system_err_log.xml\'>System errors
'; echo 'systemarray['logs_dir']).'err_log.xml\'>Errors
'; } } /** * Заполняет переменную, содержащую дамп массива $_GET. * * @access private * @param array $get This is an instance of $_GET array. * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function varDumpGet($get) { ob_start(); echo 'GET Array
'; var_dump ($get); echo '
'; $this->getdump = ob_get_contents(); ob_end_clean(); } /** * Заполняет переменную, содержащую дамп массива $_POST. * * @access private * @param array $post - this is an instance of $_POST array * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function varDumpPost($post) { ob_start(); echo 'POST Array
'; var_dump ($post); echo '
'; $this->postdump = ob_get_contents(); ob_end_clean(); } /** * Заполняет переменную, содержащую дамп массива $_SESSION. * * @access private * @param array $session - this is an instance of $_SESSION array * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function varDumpSession($session) { ob_start(); echo 'SESSION Array
'; var_dump ($session); echo '
'; $this->sessiondump = ob_get_contents(); ob_end_clean(); } } /** * Класс-конфигуратор. * *
 * 
 * Получает настройки из файлов /app/config/setupdb.ini /app/config/setupsystem.ini.
 * Также имеет ряд стандартных настроек путей, имеет возможность добавить или удалить
 * переменную в себе. Также может просто вывести их.
 * 
 * 
* * @package SimpRa * @subpackage Core * @category Core Classes * @todo Подумать о смысле внесения стандартных настроек путей в setupsystem.ini * @version 0.2.2a * @since 0.1 * @author Denis Ranneft a.k.a. ImmortaL * @copyright (с) Immortal, 510 */ class Config implements AssignerClass { /** * Статичный объект класса. Используется для реализации шаблона "одиночка" (singletone). * @access public * @static * @var object Config * @since 0.1.0a */ public static $objConfig; /** * Массив содержащий основные настройки приложения. * *
 * Стандартные настройки:
 * $system->root => рут сайта.
 * $system->config_dir => директория конфигурационных файлов.
 * $system->core_dir => директория, где лежат классы ядра
 * $system->mods_dir => директория, где лежат модули.
 * $system->mods_dir => директория, где лежат модели.
 * $system->service_dir => директория, где лежат шаблоны для страниц ошибок и сервисных страниц.
 * 
* * @var array $system * @access public * @since 0.1.0a */ public $system = array(); /** * Собственно конструктор. * *
 * Один из важнейших конструкторов в приложении. Заполняет массивы настроек.
 * Сначала стандартные настройки, затем инициализация процесса получения настроек
 * из сторонних файлов.
 * 
* * @access private * @since 0.1.0a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ private function __construct() { $this->system=array ( 'basehref' => preg_replace(';www\.;', '', $_SERVER['SERVER_NAME']), 'root' => $_SERVER['DOCUMENT_ROOT'], 'config_dir' => DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR, 'core_dir' => DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'core'.DIRECTORY_SEPARATOR, 'controllers_dir' => DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR, 'views_dir' => DIRECTORY_SEPARATOR.'view'.DIRECTORY_SEPARATOR, 'xml_cache_dir' => DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'xml'.DIRECTORY_SEPARATOR, 'html_cache_dir' => DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'html'.DIRECTORY_SEPARATOR, 'mods_dir' => DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'mod'.DIRECTORY_SEPARATOR, 'service_dir' => DIRECTORY_SEPARATOR.'view'.DIRECTORY_SEPARATOR.'service'.DIRECTORY_SEPARATOR, 'logs_dir' => DIRECTORY_SEPARATOR.'logs'.DIRECTORY_SEPARATOR );/* $this->system=array ( 'basehref' => $_SERVER['SERVER_NAME'], 'root' => $_SERVER['DOCUMENT_ROOT'], 'config_dir' => '/'.'includes'.'/'.'config'.'/', 'core_dir' => '/'.'includes'.'/'.'core'.'/', 'controllers_dir' => '/'.'includes'.'/'.'controllers'.'/', 'views_dir' => '/'.'includes'.'/'.'views'.'/', 'mods_dir' => '/'.'includes'.'/'.'mod'.'/', 'service_dir' => '/'.'includes'.'/'.'service'.'/' );*/ /*accepting main settings*/ } /** * Запускает процесс принятия настроек из конфигурационных файлов. * * В случае каких-либо ошибок отлавливает исключения и добавляет критические ошибки. * * Пример использования: * * $Config = & Config::_Factory(); * $Config -> Initialize(); * * * @uses Config::_Assign() для добавления настроек * @uses Config::getDbConfig() для создания конфигурации подключения к БД * @uses Config::getBasicSystemConfig() для создания конфигурации системы * @uses Errors::addCriticalError() в случае возникновения проблем * @access public * @since 0.2.0a * @version f0.5 * @author Denis Ranneft a.k.a. ImmortaL */ public function _Initialize() { try { $this->getBasicSystemConfig(); } catch (Exception $error) { Errors::addCriticalError($error); } /*accepting database settings*/ try { $this->getDbConfig(); } catch (Exception $error) { Errors::addCriticalError($error); } Errors::displayCriticalErrors(); } /** * Функция регистрирует переменную в классе. * * Не предусматривает защиту от перезаписи. * * Пример использования: * * $Config = & Config::_Factory(); * $Config -> _Assign('some_name', 'some_value'); * * * @todo Подумать о защите от перезаписи. * @param mixed $name * @param mixed $value * @access public * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public function _Assign ($name, $value) { $this->$name=$value; } /** * Удаляет переменную. * * Нет нестандартного обработчики ошибки, если переменная не существует. * * Пример использования: * * $Config = & Config::_Factory(); * $Config -> _Unsign('varible_name'); * * * @todo Подумать об обработчике ошибки, если такой переменной нет. * @param string $name * @access public * @author Denis Ranneft a.k.a. ImmortaL * @since 0.1.0a * @version f0.1 */ public function _Unsign($name) { unset ($this->$name); } /** * Функция, выводящая дамп всех переменных, подписанных классом {@link Config Config} * * Пример использования: * * $Config = & Config::_Factory(); * $Config -> _ShowSignedValues(); * * * @access public * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public function _ShowSignedValues() { var_dump($this); } /** * Генерация конфигурации для подключения к базе данных. * *
 * Функция забирает основную конфигурацию для подключения к БД из файла setupdb.php
 * находящегося в /app/config/.
 * Если такого файла нет - создаст исключение.
 * 
* * @return array массив с настройками базы данных. * @access private * @since 0.1.0a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ private function getDbConfig() { $fileName=$this->system['root'].$this->system['config_dir'].'setupdb.php'; if (!file_exists ($fileName)) { $error_message='there is no file setupdb.php or it`s path wrong'; throw new Exception ($error_message, 1); } else { require_once ($this->system['root'].$this->system['config_dir'].'setupdb.php'); $this->_Assign('DB', $dbConfig); } } /** * Генерация основных системных настроек. * *
 * Функция заберет конфигурацию системы из файла setupsystem.php,
 * находящегося в /app/config/.
 * Если файла нет - создаст исключение.
 * 
* * @return array массив с системными настройками. * @access private * @since 0.1.0a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ private function getBasicSystemConfig() { $fileName=$this->system['root'].$this->system['config_dir'].'setupsystem.php'; if (!file_exists ($fileName)) { $error_message='there is no file setupsystem.php or it`s path wrong'; throw new Exception ($error_message, 1); } else { require_once ($this->system['root'].$this->system['config_dir'].'setupsystem.php'); foreach ($systemConfig as $key=>$value) { $this->system[$key]=$value; } } } /** * Фабрика. * * Создает один экземпляр класса. Если объект уже существует - вернет его. * * Пример использования: * * $Config = Config::_Factory(); * * * @access public * @static * @return Config объект с настройками базы данных * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objConfig) self::$objConfig = new Config(); return self::$objConfig; } } /** Класс - обработчик ошибок. * * * Класса ошибок, который генерирует их в процессе инициализация и работы приложения. * * * @package SimpRa * @subpackage Core * @category Core Classes * @since 0.1.5a * @version 0.2 * @author Denis Ranneft a.k.a. ImmortaL */ class Errors { /** * Статичный объект класса. * * Используется для реализации шаблона "одиночка" (singletone) * @access private * @since 0.1.0a * @static */ private static $objErrors; /** * Массив критических ошибок. * @static * @access private * @since 0.1.0a * @var array $critical_errors */ private static $critical_errors=array(); /** * Функция для добавления критической ошибки. * *
 * В случае уже существования оной - не будет добавлять в массив.
 * Также запускает процесс логирования данной ошибки.
 * 
* * Пример использования * * try * { * if (!$var) * { * $error_message = "Ощибка"; * $error_code = 1; * throw new Exception ($error_message, $error_code); * } * } * catch (Exception $error) * { * Errors::addCriticalError ($error); * } * * * @access public * @static * @param object Exception * @uses Logger::_LogSystemError() * @since 0.1.0a * @version f0.3 * @author Denis Ranneft a.k.a. ImmortaL */ public static function addCriticalError ($error) { $error_string=''; $error_exist=false; $error_message=$error->getMessage(); $error_code=$error->getCode(); switch ($error_code) { case '1': case '2': case '3': case '4': $error_full_message='The system error has occured while initializing an application - '.$error_message; Logger::_LogSystemError($error_full_message, $error_code); break; case '5':case '6':case '7':case '8': $error_full_message='The runtime error has occured during application work - '.$error_message; break; } $error_string='
'.$error_full_message.'
'; $error_string.='Error code: '.$error_code.'
'; $error_string.='Error happened in file '.$error->getFile().' '; $error_string.='at line '.$error->getLine().'
'; foreach (self::$critical_errors as $critical_error) { if ($critical_error==$error_string){$error_exist=true;} } if (!$error_exist) { self::$critical_errors[]=$error_string; } } /** * Функция добавляет некритическую ошибку. * * Также запускает процесс логирования данной ошибки. * * Пример использования * * try * { * if (!$var) * { * $error_message = "Ощибка"; * $error_code = 50; * throw new Exception ($error_message, $error_code); * } * } * catch (Exception $error) * { * Errors::addError ($error); * } * * * @access public * @static * @param object Exception * @uses Logger::_LogSystemError() * @since 0.1.5a * @version f0.2 * @author Denis Ranneft a.k.a. ImmortaL */ public static function addError ($error) { $error_string=''; $error_exist=false; $error_message=$error->getMessage(); $error_code=$error->getCode(); switch ($error_code) { case '50': case '51': case '52': case '53': $error_full_message='An error has occured while initializing an application - '.$error_message; Logger::_LogError($error_full_message, $error_code); break; } } /** * Функция выводит на экран критические ошибки и die(). * * Пример использования: * * Errors::displayCriticalErrors(); * * * @access public * @static * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function displayCriticalErrors() { if (count(Errors::$critical_errors)>0) { foreach (Errors::$critical_errors as $error) { $error_string.=$error.'
'; } die($error_string); } } } /** Класс Loader. * * * Класс для автоматической загрузки и проверки различных файлов. * * * @package SimpRa * @subpackage Core * @category Core Classes * @version 0.2.2a * @since 0.1 * @author Denis Ranneft a.k.a. ImmortaL */ class Loader { /** * Статичный объект. Используется для реализации шаблона "одиночка" (singletone) * @static * @access private * @var object Loader * @since 0.1.0a */ private static $objLoader; /** * Массив содержащий пути, где могут находится необходимые файлы. * * @access private * @var array $dirs * @since 0.1.0a */ private $dirs; /** * Путь рута. Используетс для создания реального пути до файла. * * @access private * @var string $root * @since 0.1.0a */ private $root; /** Собственно конструтор. * Создает объект, присваивает ему основные переменные. Инизиализирует процесс добавления директорий в php_include_path. * * @access private * @param array $system_array * @uses Config::$system * @uses Loader::add_include_path() * @since 0.1.0a * @version f0.2 * @author Denis Ranneft a.k.a. ImmortaL */ private function __construct($system_array) { $this->dirs=array ('core_dir' => $system_array['core_dir'], 'controllers_dir' => $system_array['controllers_dir'], 'mods_dir' => $system_array['mods_dir'], 'views_dir' => $system_array['views_dir'] ) ; $this->root=$system_array['root']; $this->add_include_path(); } /** Напрямую добавляет пути в php_include_path. * * @access private * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function add_include_path() { $path=''; foreach ($this->dirs as $dir) { $path.=PATH_SEPARATOR.$this->root.$dir; } set_include_path($path); } /** Основной метод класса, который загружает файлы. * Проверит существует ли файл и запросит его через require_once. * Если файла не существует - создаст исключение. * * @access public * @static * @uses Errors::addCriticalError() * @uses Errors::displayCriticalErrors() * @since 0.1.0a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ static function load($class) { try { $Loader= Loader::_Factory(); $success=false; if (!(strpos($class, 'Model')===false)) { $modelFileName=strtolower(strstrb($class, 'Model')); if (file_exists($Loader->root.$Loader->dirs['mods_dir'].'model.'.$modelFileName.'.php')) { $success=true; $loaded=$Loader->root.$Loader->dirs['mods_dir'].'model.'.$modelFileName.'.php'; } } elseif (!(strpos($class, 'Controller')===false)) { $controllerFileName=strtolower(strstrb($class, 'Controller')); if (file_exists($Loader->root.$Loader->dirs['controllers_dir'].'controller.'.$controllerFileName.'.php')) { $success=true; $loaded=$Loader->root.$Loader->dirs['controllers_dir'].'controller.'.$controllerFileName.'.php'; } } foreach ($Loader->dirs as $dir) { if (file_exists($Loader->root.$dir.'class.'.strtolower($class).'.php')) { //require_once ('class.'.strtolower($class).'.php'); $success=true; $loaded=$Loader->root.$dir.'class.'.strtolower($class).'.php'; } } if ($success==true) { require_once ($loaded); } else { $error = 'Class '.$class.' was not found.'; throw new Exception ($error, 2); } } catch (Exception $error) { Errors::addCriticalError($error); Errors::displayCriticalErrors(); } } /** Фабрика. * * Создает только один объект класса. Если уже существует возвращает его. * * @access public * @static * @return object Loader * @uses Loader::__construct() * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function _Factory() { if(!self::$objLoader) { $Config= & Config::_Factory (); self::$objLoader = new Loader($Config->system); } return self::$objLoader; } /** Проверяет наличие контроллера. * Если такой наличиствует - создает объект и возвращает его. * * @access public * @static * @uses Loader::__Factory() * @param string $controller * @return object Controller * @since 0.1.5a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ public static function checkController($controller) { $Loader = Loader::_Factory(); if (!$controller) { $controller = "indexController"; } $controllerFileName=strtolower(strstrb($controller, 'Controller')); if(file_exists($Loader->root.$Loader->dirs['controllers_dir'].'controller.'.$controllerFileName.'.php')) { return new $controller(); } else { $error_message='there is no Controller '.$controller.''; throw new Exception ($error_message, 50); } } /** Проверяет наличие действия в данном контроллере.. * Если такое существует - возвращает обратно его имя. Если нет возвращает действие по умолчанию - index. * * @access public * @static * @param string $controller * @param string $action * @return string $action * @since 0.1.5a * @version f0.2 * @author Denis Ranneft a.k.a. ImmortaL */ public static function checkAction($controller, $action) { if(($action && !method_exists($controller, $action)) || !$action) { $action = 'show'; } return $action; } /** Проверяет наличие действия в данном контроллере.. * Если такое существует - возвращает обратно его имя. Если нет возвращает действие по умолчанию - index. * * @access public * @static * @param string $locale * @return string $locale * @since 0.2.2a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function checkLocale($locale) { $Loader = Loader::_Factory(); $path = $Loader->root.$Loader->dirs['views_dir'].$locale; if (is_dir($path)) { return $locale; } else { return 'ru_'; } } } /** Класс Logger. * * * Выполняет всю работу по логированию ошибок. * * * @package SimpRa * @subpackage Core * @category Core Classes * @since 0.1 * @version 0.2.0a * @author Denis Ranneft a.k.a. ImmortaL */ class Logger { /** * Статичный объект этого класса. Используется для реализации шаблона "одиночка" (singletone). * @static * @access private * @var object $objLogger * @since 0.1.0a */ private static $objLogger; /** * Хранит путь (без рута) до директории с логами. * @static * @access private * @var string $rootDir * @since 0.1.0a */ private static $logDir=""; /** * Хранит путь рута. Нужно для построения реального пути до директории с логами. * @static * @access private * @var string $rootDir * @since 0.1.0a */ private static $rootDir=""; /** * Имя файла для логирования все ошибок и действий зарегестрированных пользователей. * @static * @access private * @var string $userLog * @since 0.1.0a */ private static $userLog="user_log.xml"; /** * Имя файла для логирования всех возникающих системных ошибок (критических), не позволяющих работать приложению. * @static * @access private * @var string $systemErrLog * @since 0.1.0a */ private static $systemErrLog="system_err_log.xml"; /** * Имя файла для логирования всех ошибок, возникающих во время выполнения приложениия. Некритических. * @static * @access private * @var string $errorLog * @since 0.1.0a */ private static $errorLog="err_log.xml"; /** * Максимальный размер лога. * @static * @access private * @var string $errorLog * @since 0.1.2a */ private static $maxLogSize="10485760"; /** * Собственно коснструктор.. * Устанавливает все директории для логирования, также проверяет их наличие и пытается создать их. * * Если не может создать - выдаёт ошибку и die(). * @access private * @static * @param array $_Dirs * @since 0.1.0a * @version f0.2 * @author Denis Ranneft a.k.a. ImmortaL */ private function __construct($_Dirs=array()) { self::$logDir=$_Dirs["logs_dir"]; self::$rootDir=$_Dirs["root"]; if (! $dir = @opendir(self::$rootDir.self::$logDir)) { if (@mkdir(self::$rootDir.self::$logDir, 0766, true)) { chmod(self::$rootDir.self::$logDir, 0766); } else { die("
The logs directory cannot be created! You have to create it manually on your server via ftp access and set chmod to it equals 766
"); } } } /** Записывает критическую системную ошибка. Если файла нет - пытается создать его. * Если не получилось - выдает ошибку и die(). * * @access public * @static * @param string $string * @param int $code * @uses Logger::_CheckSystemLog() * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function _LogSystemError($string, $code) { Logger::_Factory(); try { Logger::_CheckSystemLog(); } catch (Exception $error) { die("
An error has occured while initializing application - ".$error->getMessage()."
Erorr code: ".$error->getCode()."
The Error happened in File: ".$error->getFile()."  at Line: ".$error->getLine()."
"); } $file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog, "r+"); fseek($file, -12, SEEK_END); $endstring=fgets($file); fseek($file, -12, SEEK_END); fwrite($file, " \r\n ".$string."\r\n ".date("d.m.Y")."\r\n ".date("H:i:s")."\r\n ".$code."\r\n ".$_SERVER["REMOTE_ADDR"]."\r\n \r\n".$endstring); fclose($file); } /** Записывает системную ошибку (некритическую). Если файла нет - пытается создать его. * Если не получилось - выдает ошибку и die(). * * @access public * @static * @param string $string * @param int $code * @uses Logger::_CheckErrorLog() * @since 0.1.5a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function _LogError($string, $code) { Logger::_Factory(); try { Logger::_CheckErrorLog(); } catch (Exception $error) { die("
An error has occured while initializing application - ".$error->getMessage()."
Erorr code: ".$error->getCode()."
The Error happened in File: ".$error->getFile()."  at Line: ".$error->getLine()."
"); } $file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$errorLog, "r+"); fseek($file, -12, SEEK_END); $endstring=fgets($file); fseek($file, -12, SEEK_END); fwrite($file, " \r\n ".$string."\r\n ".date("d.m.Y")."\r\n ".date("H:i:s")."\r\n ".$code."\r\n ".$_SERVER["REMOTE_ADDR"]."\r\n \r\n".$endstring); fclose($file); } /** Делает запись в лог заданном лог-файле. * * @access public * @static * @param string $string * @param int $code * @param string $logname * @uses Logger::_CheckLog() * @since 0.2.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function _Log($string, $code, $logname) { Logger::_Factory(); try { Logger::_CheckLog($logname); } catch (Exception $error) { die("
An error has occured while initializing application - ".$error->getMessage()."
Erorr code: ".$error->getCode()."
The Error happened in File: ".$error->getFile()."  at Line: ".$error->getLine()."
"); } $file=fopen(Logger::$rootDir.Logger::$logDir.$logname.'.xml', "r+"); fseek($file, -12, SEEK_END); $endstring=fgets($file); fseek($file, -12, SEEK_END); fwrite($file, " \r\n \r\n ".date("d.m.Y")."\r\n ".date("H:i:s")."\r\n ".$code."\r\n ".$_SERVER["REMOTE_ADDR"]."\r\n \r\n".$endstring); fclose($file); } /** Фабрика. * Создает один единственный экземпляр класса Logger. Если объект существует - возвращает его. * * @access public * @static * @return object $objLogger * @uses Logger::__construct() * @uses Config::$system * @uses Config::_Factory() * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objLogger) { $Config= & Config::_Factory(); self::$objLogger = new Logger($Config->system); } return self::$objLogger; } /** Проверяет наличие системного лога. * * Если его не существует - пытается создать. Если не получилось - создает исключение. * В случае первышения логом максимального размера убивает его, и создает новый. * @access public * @static * @since 0.1.0a * @version f0.3 * @uses Logger::$maxLogSize * @author Denis Ranneft a.k.a. ImmortaL */ public static function _CheckSystemLog() { if (!file_exists(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog)) { if (!$file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog, "w+")) { throw new Exception("The ".Logger::$systemErrLog." in log directory cannot be created! You have to create it manually on your server via ftp access and set chmod to it equals 766", 3); } else { fwrite($file, "\r\n\r\n\r\n\r\n\r\nSystem Log\r\n\r\n"); fclose($file); } } elseif(filesize(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog) && filesize(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog)>Logger::$maxLogSize) { $file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$systemErrLog, "w+"); fwrite($file, "\r\n\r\n\r\n\r\n\r\nSystem Log\r\n\r\n"); fclose($file); } } /** Проверяет наличие лога ошибок. * * Если его не существует - пытается создать. Если не получилось - создает исключение. * В случае первышения логом максимального размера убивает его, и создает новый. * @access public * @static * @since 0.1.5a * @version f0.1 * @uses Logger::$maxLogSize * @author Denis Ranneft a.k.a. ImmortaL */ public static function _CheckErrorLog() { if (!file_exists(Logger::$rootDir.Logger::$logDir.Logger::$errorLog)) { if (!$file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$errorLog, "w+")) { throw new Exception("The ".Logger::$errorLog." in log directory cannot be created! You have to create it manually on your server via ftp access and set chmod to it equals 766", 3); } else { fwrite($file, "\r\n\r\n\r\n\r\n\r\nSystem Log\r\n\r\n"); fclose($file); } } elseif(filesize(Logger::$rootDir.Logger::$logDir.Logger::$errorLog) && filesize(Logger::$rootDir.Logger::$logDir.Logger::$errorLog)>Logger::$maxLogSize) { $file=fopen(Logger::$rootDir.Logger::$logDir.Logger::$errorLog, "w+"); fwrite($file, "\r\n\r\n\r\n\r\n\r\nSystem Log\r\n\r\n"); fclose($file); } } /** Проверяет наличие лог. * * Если его не существует - пытается создать. Если не получилось - создает исключение. * В случае первышения логом максимального размера убивает его, и создает новый. * @access public * @static * @since 0.2.0a * @version f0.1 * @uses Logger::$maxLogSize * @author Denis Ranneft a.k.a. ImmortaL */ public static function _CheckLog($logname) { if (!file_exists(Logger::$rootDir.Logger::$logDir.$logname.'.xml')) { if (!$file=fopen(Logger::$rootDir.Logger::$logDir.$logname.'.xml', "w+")) { throw new Exception("The ".$logname.'.xml'." in log directory cannot be created! You have to create it manually on your server via ftp access and set chmod to it equals 766", 3); } else { fwrite($file, "\r\n\r\n\r\n\r\n\r\n".$logname." Log\r\n\r\n"); fclose($file); } } elseif(filesize(Logger::$rootDir.Logger::$logDir.$logname.'.xml') && filesize(Logger::$rootDir.Logger::$logDir.$logname.'.xml')>Logger::$maxLogSize) { $file=fopen(Logger::$rootDir.Logger::$logDir.$logname.'.xml', "w+"); fwrite($file, "\r\n\r\n\r\n\r\n\r\n".$logname." Log\r\n\r\n"); fclose($file); } } } /** Класс Router. * * * Парсит URL и разводит в нужном направлении исходя из полученного массива данных. * * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.2.5a * @since 0.2 * @author Denis Ranneft a.k.a. ImmortaL */ class Router { /** Содержит имя контроллера. * * @access public * @static * @var string $_Controller * @since 0.1.0a */ public $_Controller='indexController'; /** Содержит имя действия. * * @access public * @static * @var string $_Action * @since 0.1.0a */ public $_Action=''; /** Содержит имя локали. * * @access public * @static * @var string $_Locale * @since 0.2.5a */ public $_Locale=''; /** Содержит путь (без рута) до сервисной директории. * * @access public * @static * @var string $_ServiceDir * @since 0.1.0a * @todo Надо бы редиректить при помощи роутера, но отображать при помощи {@link View View} */ public static $_ServiceDir=''; /** Содержит параметры запроса, т.е. все, что не относится к контроллеру и действию. * * @access public * @static * @var array $_Params * @since 0.1.0a */ public $_Params = array(); public static $add = ""; /** Хранит запрос. * * @access private * @static * @var string $_Uri * @since 0.1.0a */ private $_Uri = ''; /** Статичный объект. Используется для шаблона "одиночка" (singletone). * * @access private * @static * @var object Router * @since 0.1.0a */ private static $objRouter; /** Собственно конструктор. * * Создает объект. Устанавливает сервисную директорию. Инициализирует процесс парсинга. * * @access private * @param array $system * @uses Config::$system * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function __construct($system=array()) { self::$_ServiceDir=$system['service_dir']; $route = (isset($_GET['route']))?$_GET['route']:''; $this->_ParseURI($route); } /** * Фабрика. * Создает один объект при помощи конструктора. Если объект уже есть - возвращает его. * * @access public * @static * * @return object Router * @version f0.1 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objRouter) { $Config=& Config::_Factory(); self::$objRouter = new Router($Config->system); } return self::$objRouter; } /** * Парист URI, вычленяя из него несколько параметров. *
     * Первый параметр - контроллер. Второй проверяется по принципу - а является ли дейтвием?
      Если не является, то этот параметр заносится как первый параметр.
     *
* @access private * * @param string $_URI * @uses Router::$_Controller * @uses Router::$_Action * @uses Loader::checkAction() * @version f0.8 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ private function _ParseURI($_URI) { $add=''; $_URIArray=explode('/', $_URI); foreach (@$_URIArray as $_ParamKey => $_ParamValue) { if ($_ParamValue) { $this->_Params[$_ParamKey]=$_ParamValue; $add .='_'.$_ParamValue; } } self::$add=$add; $this->_Locale=strtolower(array_shift($_URIArray)).'_'; try { $locale = Loader::checkLocale($this->_Locale); if ($locale !== $this->_Locale) { $this->_Locale = $locale; } array_shift($this->_Params); } catch (Exception $error) { Errors::addError($error); Router::_Redirect($error); } $this->_Controller=strtolower(array_shift($_URIArray)); if ($this->_Controller) {$this->_Controller.="Controller";} try { $controller = Loader::checkController($this->_Controller); $this->_Controller = $controller; array_shift ($this->_Params); } catch(Exception $error) { Errors::addError($error); Router::_Redirect($error); } $this->_Action=strtolower(array_shift($_URIArray)); $action=Loader::checkAction($this->_Controller, $this->_Action); if ($action===$this->_Action){array_shift ($this->_Params);} $this->_Action=$action; } /** * Пытается направить пользователя в правильном направлении. * В первую очередь проверят на наличие контроллера. * Если таковой не имеется - редиректит на страницу 404. * * @access public * @static * * @uses Loader::checkController() * @uses Loader::checkAction() * @uses Errors::addError() * @uses Router::_Redirect() * @version f0.6 * @since 0.1.2a * @author Denis Ranneft a.k.a. ImmortaL */ public static function _Dispatch() { $controller_name=strstrb(get_class(self::$objRouter->_Controller),'Controller'); $action = self::$objRouter->_Action; self::$objRouter->_Controller->$action(array('controller'=>$controller_name, 'action'=>self::$objRouter->_Action, 'locale'=>self::$objRouter->_Locale, 'params' => self::$objRouter->_Params)); unset ($controller_name); unset ($action); } /** * Редиректит пользователя на 404 страницу. Пока что статично. * * @access public * @static * * @param object $error - объект класса Exception * @uses Router::$_ServiceDir * @version f0.1 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function _Redirect($error) { if ($error == 901) { $this->_Controller = "authController"; $controller = Loader::CheckController($this->_Controller); $this->_Controller = $controller; $this->_Action = "login"; } else { $Router = Router::_Factory(); $args['controller']='pages'; $args['action']='show'; $args['locale']=$Router->_Locale; die ('404.errpor'); $View = View::_Factory($args, true); $Model = pagesModel::_Factory($args); $ModelXML = $Model->checkXML('0'); if (!$ModelXML) { $forceRewrite = true; $ModelXML = $Model->getXML(array( 'table' => 'pages', 'page' => 'err404', 'locale' => $args['locale'], 'action' => $args['action'], )); } if (!$View->checkHTML('0', $forceRewrite)) { $View->_FactoryView($ModelXML); } $View->_Render(); } } } /** Класс View. * * * Создает представление. * * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.2.3a * @since 0.2 * @author Denis Ranneft a.k.a. ImmortaL */ class View { /** Статичный объект этого класса. Используется для реализации шаблона "одиночка" (singletone). * * @access private * @static * @var object $objView * @since 0.1.0a */ private static $objView; /** Хранит директории для использования данным классом. * * @access private * @var array $_Dirs * @since 0.1.0a */ private $_Dirs=array(); /** Хранит рут путь, используется для построения полного пути к файлам XSLT стилей. * @access private * @var string $_Root * @since 0.1.0a */ private $_Root=""; /** Хранит название контроллера * @access private * @since 0.1.0a */ private $_Controller=""; /** Хранит название локали * @access private * @var string $_Action * @since 0.1.0a */ private $_Locale=""; /** Хранит название действия * @access private * @var string $_Locale * @since 0.2.2a */ private $_Action=""; /** Хранит трансформированное в HTML XML+XSLT преобразование * @access private * @var string $_Action * @since 0.1.0a */ private $_ConvertedToHTML=""; /** Хранит стандартное время кэша * @access private * @var string $_CacheTime * @since 0.1.5a */ private $_CacheTime; /** Собственно конструктор. * * Создает объект. Устанавливает директории для шаблонов вида, для кэша, для сервисных шаблонов. * * @access private * @param array Config::$system * @version f0.3 * @since 0.2.0a * @author Denis Ranneft a.k.a. ImmortaL */ private function __construct($system_array=array(), $args=array('controller'=>'indexController', 'action'=>'show', 'locale'=>'ru_')) { $this->_Dirs=array ('views_dir' => $system_array['views_dir'], 'xml_cache_dir' => $system_array['xml_cache_dir'], 'html_cache_dir' => $system_array['html_cache_dir'], 'service_dir' => $system_array['service_dir'] ) ; $this->_CacheTime=(int)$system_array['defaultHTMLCacheTime']; $this->_Root=$system_array['root']; $this->_Controller=$args['controller']; $this->_Action=$args['action']; $this->_Locale=$args['locale']; } /** * Фабрика. * Создает один объект при помощи конструктора. Если объект уже есть - возвращает его. * * @access public * @static * * @return object View * * @version f0.2 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public static function _Factory($args=array(), $forcerewrite = false) { if(!self::$objView || $forcerewrite) { $Config= & Config::_Factory (); self::$objView = new View($Config->system, $args); } return self::$objView; } /** * Фабрика представления. * Конвертирует XML+XSLT в HTML и сохраняет в переменную. * * @access public * * @uses View::$_Root - для создания пути * @uses View::$_Dirs - для создания пути * @uses View::$_Controller - для выбора правильной директории шаблона * @uses View::$_Action - для выбора правильного файла * @version f0.4 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function _FactoryView($xml, $templates=array()) { if (!($this->_ConvertedToHTML)) { $xml_object = new DOMDocument ('1.0', 'UTF-8'); $xml_object->resolveExternals = TRUE; $xml_object->substituteEntities = TRUE; //die('
'.htmlspecialchars($xml).'
'); $xml_object->loadXML($xml); $xslt = new XSLTProcessor(); $xsl_object = new DOMDocument(); $xsl_path=$this->_Root.$this->_Dirs['views_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$this->_Controller.DIRECTORY_SEPARATOR.$this->_Action.'.xsl'; $xsl_object->resolveExternals = TRUE; $xsl_object->substituteEntities = TRUE; $xsl_object->load($xsl_path); $xsl_stylesheet = $xsl_object->getElementsByTagName('stylesheet')->item(0); $this->addTemplates($xsl_object, $xsl_stylesheet, $templates); $xsl_object->xinclude(LIBXML_XINCLUDE); //echo('
'.htmlspecialchars($xsl_object->SaveXML()).'
'); $xslt->importStylesheet($xsl_object); ob_start(); echo $xslt->transformToXML($xml_object); $this->_ConvertedToHTML = ob_get_contents(); ob_end_clean(); if ($this->_ConvertedToHTML) try { $this->checkCacheDir(); $this->writeCache(); } catch (Exception $error) { Errors::addError($error); } } } public function addTemplates (&$xsl_object, &$xsl_stylesheet, $templates=array()) { foreach ($templates as $template) { $xsl_add = $xsl_object->createElementNS('http://www.w3.org/2001/XInclude','include'); $xsl_add->setAttribute('href', '../'.$template['dir'].'/'.$template['name'].'.xsl'); $xsl_stylesheet->appendChild($xsl_add); } } public function _FactoryBlock($xml, $template_name, $template_dir) { $xml_object = new DOMDocument ('1.0', 'UTF-8'); $xml_object->loadXML($xml); $xslt = new XSLTProcessor(); $xsl_object = new DOMDocument(); $xsl_path=$this->_Root.$this->_Dirs['views_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$template_dir.DIRECTORY_SEPARATOR.$template_name.'.xsl'; $xsl_object->resolveExternals = TRUE; $xsl_object->substituteEntities = TRUE; $xsl_object->load($xsl_path); $xslt->importStylesheet($xsl_object); ob_start(); echo $xslt->transformToXML($xml_object); $block = ob_get_contents(); ob_end_clean(); $this->_ConvertedToHTML .= $block; return $block; } /** * * Проверяет HTML кэш * * @access public * @return bool * @uses View::$_Root для создания пути * @uses View::$_Dirs для создания пути * @uses View::$_Controller для выбора правильной директории шаблона * @uses View::$_Action для выбора правильного файла * @uses View::$_CacheTime для оценки времени кэша * @uses Router::$add для создания уникального имени файла * @version f0.4 * @since 0.1.5a * @author Denis Ranneft a.k.a. ImmortaL */ public function checkHTML($lifetime='', $forceRewrite=false) { if ($lifetime == '0' || $forceRewrite===true) {return false;} if($lifetime==''){$lifetime=$this->_CacheTime;} $filename = $this->_Root.$this->_Dirs['html_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$this->_Controller.DIRECTORY_SEPARATOR.$this->_Action.Router::$add.'_full.html'; if (is_file($filename) && (microtime(1)-filemtime($filename))<(int)$lifetime) { $html = file_get_contents($filename); $this->_ConvertedToHTML = $html; return true; } else { return false; } } /** * * Проверяет HTML кэш отдельного блока. * * @access public * @return bool * @uses View::$_Root для создания пути * @uses View::$_Dirs для создания пути * @uses View::$_Controller для выбора правильной директории шаблона * @uses View::$_Action для выбора правильного файла * @uses View::$_CacheTime для оценки времени кэша * @uses Router::$add для создания уникального имени файла * @version f0.1 * @since 0.2.2a * @author Denis Ranneft a.k.a. ImmortaL */ public function checkHTMLBlock($blockname, $blockdir, $lifetime='', $forceRewrite=false) { if ($lifetime == '0' || $forceRewrite===true) {return false;} if($lifetime==''){$lifetime=$this->_CacheTime;} $filename = $this->_Root.$this->_Dirs['html_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$blockdir.DIRECTORY_SEPARATOR.$blockname.'.html'; if (is_file($filename) && (microtime(1)-filemtime($filename))<(int)$lifetime) { $html = file_get_contents($filename); $this->_ConvertedToHTML .= $html; return true; } else { return false; } } /** * * Пишет HTML кэш * * @access private * @uses View::$_Root - для создания пути * @uses View::$_Dirs - для создания пути * @uses View::$_Controller - для выбора правильной директории шаблона * @uses View::$_Action - для выбора правильного файла * @version f0.5 * @since 0.1.5a * @author Denis Ranneft a.k.a. ImmortaL */ private function writeCache() { $filename = $this->_Root.$this->_Dirs['html_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$this->_Controller.DIRECTORY_SEPARATOR.$this->_Action.Router::$add.'_full.html'; if (!$file=fopen($filename, "w+")) { throw new Exception("The ".$this->_Action.Router::$add.'.html'." in ".$this->_Dirs['html_cache_dir'].$this->_Controller." directory cannot be created!", 52); } else { fwrite($file, $this->_ConvertedToHTML); fclose($file); } } /** * * Пишет HTML кэш отдельного блока * * @access public * @uses View::$_Root - для создания пути * @uses View::$_Dirs - для создания пути * @uses View::$_Controller - для выбора правильной директории шаблона * @uses View::$_Action - для выбора правильного файла * @version f0.1 * @since 0.2.2a * @author Denis Ranneft a.k.a. ImmortaL */ public function writeCacheBlock($blockname, $blockdir, $block) { $filename = $this->_Root.$this->_Dirs['html_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$blockdir.DIRECTORY_SEPARATOR.$blockname.'.html'; if (!$file=fopen($filename, "w+")) { throw new Exception("The ".$this->_Action.Router::$add.'.html'." in ".$this->_Dirs['html_cache_dir'].$this->_Controller." directory cannot be created!", 52); } else { fwrite($file, $block); fclose($file); } } /** * * Проверяет директорию для HTML кэша * Если нет - пытается создать. Если создать не удает создает исключение. * Приложение работает - кэш не пишется. * * @access private * @uses View::$_Root - для создания пути * @uses View::$_Dirs - для создания пути * @uses View::$_Controller - для выбора правильной директории шаблона * @version f0.2 * @since 0.2.2a * @author Denis Ranneft a.k.a. ImmortaL */ private function checkCacheDir() { $dirname = $this->_Root.$this->_Dirs['html_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$this->_Controller; if (! $dir = @opendir($dirname)) { if (@mkdir($dirname, 0766, true)) { chmod($dirname, 0766); return true; } else { $error_message = "Cannot create $dirname directory. Try to create it manually;"; $error_code = 51; throw new Exception($error_message, $error_code); } } } /** * Отображает полученный HTML * * @access public * * @uses View::$_ConvertedToHTML * @version f0.1 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function _Render() { echo $this->_ConvertedToHTML; } } /** * Базовый класс для моделей. * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.2.1a * @since 0.2 * @author Denis Ranneft a.k.a. ImmortaL * */ abstract Class Model { /** Статичный объект этого класса. Используется для реализации шаблона "одиночка" (singletone). * @access protected * @static * @var object Model * @since 0.1.0a */ protected static $objModel; /** Хранит директории для использования данным классом. * * @access protected * @static * @var array $_Dirs * @since 0.1.0a */ protected $_Dirs=array(); /** Хранит рут путь, используется для построения полного пути к файлам XSLT стилей. * @access protected * @static * @var string $_Root * @since 0.1.0a */ protected $_Root=""; /** Хранит название контроллера * @access protected * @static * @var string $_Controller * @since 0.1.0a */ protected $_Controller=""; /** Хранит название действия * @access protected * @static * @var string $_Action * @since 0.1.0a */ protected $_Action=""; /** Хранит стандартное время кэша * @access protected * @static * @var string $_CacheTime * @since 0.1.5a */ protected $_CacheTime; /** Собственно конструктор. * * Создает объект. Устанавливает директории для шаблонов вида, для кэша, для сервисных шаблонов. * * @access public * @param array $system_array * @param string $controller * @param string $action * @uses Config::$system * @version f0.2 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function __construct($args=array('controller'=>'indexController', 'action'=>'show', 'locale'=>'ru_')) { $Config = Config::_Factory(); $system_array = $Config->system; $this->_Dirs=array ('views_dir' => $system_array['views_dir'], 'xml_cache_dir' => $system_array['xml_cache_dir'], 'html_cache_dir' => $system_array['html_cache_dir'], 'service_dir' => $system_array['service_dir'] ) ; $this->_Root = $system_array['root']; $this->_Controller = $args['controller']; $this->_Action = $args['action']; $this->_Locale = $args['locale']; $this->_CacheTime = $system_array['defaultXMLCacheTime']; } /** * Фабрика. * Создает один объект при помощи конструктора. Если объект уже есть - возвращает его. * * @abstract * @static * * * @version f0.2 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ //abstract static function _Factory($args); /** * Получает XML * Получает его из базы данных. * * @access public * * @return string $xml * @version f0.3 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function getXML($_Params=array()) { $xml = $this->generateXML($_Params); if ($xml!==false) { try { $this ->checkXMLCacheDir(); #$this -> writeXML($xml); } catch (Exception $erorr) { Errors::addError($error); } return $xml; } else { Router::_Redirect("Nothing!"); } } /** * Проверяет наличие XML-кэша * В случае отсутствия кэша возвращает false * * @access public * * @param string $blockname имя записываемого блока * @param string $blockdir папка куда будем писать * @param string $lifetime время жизни кэша * @param bool $full пишем ли полный кэш? * @return string|bool * * @version f0.4 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function checkXML($blockname, $blockdir, $lifetime='', $full=false) { if ($lifetime=='0') return false; $full = ($full)?DIRECTORY_SEPARATOR.'_full'.DIRECTORY_SEPARATOR:''; $add = ($full)?Router::$add:''; if($lifetime==''){$lifetime=$this->_CacheTime;} $filename = $this->_Root.$this->_Dirs['xml_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$blockdir.$full.DIRECTORY_SEPARATOR.$blockname.$add.'.xml'; if (is_file($filename) && (microtime(1)-filemtime($filename))>(int)$lifetime) { $xml = file_get_contents($filename); return $xml; } else { return false; } } /** * Записывает XML-кэш * * * @access public * @param string $blockname имя записываемого блока * @param string $blockdir папка куда будем писать * @param string $xml что будем писать * @param bool $full пишем ли полный кэш? * * @return string|bool * * @version f0.4 * @since 0.1.5a * @author Denis Ranneft a.k.a. ImmortaL */ public function writeXML($blockname, $blockdir, $xml, $full=false) { $full = ($full)?DIRECTORY_SEPARATOR.'_full'.DIRECTORY_SEPARATOR:''; $add = ($full)?Router::$add:''; try { $this->checkXMLCacheDir($blockdir.$full); } catch (Exception $error) { Errors::addError($error); } $filename = $this->_Root.$this->_Dirs['xml_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$blockdir.$full.DIRECTORY_SEPARATOR.$blockname.$add.'.xml'; if (!$file=fopen($filename, "w+")) { throw new Exception("The ".$blockname.'.xml'." in ".$this->_Dirs['xml_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$blockdir." directory cannot be created!", 52); } else { fwrite($file, $xml); fclose($file); } } /** * * Проверяет директорию для XML кэша * Если нет - пытается создать. Если создать не удает создает исключение. * Приложение работает - кэш не пишется. * * @access protected * @uses Model::$_Root - для создания пути * @uses Model::$_Dirs - для создания пути * @uses Model::$_Controller - для выбора правильной директории шаблона * @version f0.3 * @param string $dir директория для проверки * @since 0.2.1a * @author Denis Ranneft a.k.a. ImmortaL */ protected function checkXMLCacheDir($dir = '') { $dir = ($dir=='')?$this->_Controller:$dir; $dirname = $this->_Root.$this->_Dirs['xml_cache_dir'].$this->_Locale.DIRECTORY_SEPARATOR.$dir; //die ($dirname); if (! $dir = @opendir($dirname)) { if (@mkdir($dirname, 0766, true)) { chmod($dirname, 0766); return true; } else { $error_message = "Cannot create $dirname directory. Try to create it manually;"; $error_code = 51; throw new Exception($error_message, $error_code); } } } /** * Для обрезки xml тегов * * @access public * * @return string * * @version f0.1 * @since 0.2.1a * @author Denis Ranneft a.k.a. ImmortaL */ public static function _stripTags($xml) { return preg_replace ('[\<\?.*\?\>]', '', $xml); } } /** Класс DataBase. * * * Осуществляет работу с базой данных. * * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.2.0a * @since 0.3 * @author Denis Ranneft a.k.a. ImmortaL */ class DataBase extends PDO { /** Статичный объект этого класса. Используется для реализации шаблона "одиночка" (singletone). * * @access private * @static * @var object $objDataBase * @since 0.1.0a */ private static $objDataBase; /** Массив настроек для подключения к базе данных. * * @access private * @static * @var object $objDataBase * @since 0.1.0a */ private $DB = array(); /** * Фабрика. * Создает один объект при помощи конструктора. Если объект уже есть - возвращает его. * * @abstract * @static * * @uses PDO * @version f0.2 * @since 0.1.0a * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objDataBase) { $Config = & Config::_Factory (); self::$objDataBase = new DataBase( 'mysql:host='.$Config->DB['DB_HOST'].';dbname='.$Config->DB['DB_NAME'], $Config->DB['DB_USER'], $Config->DB['DB_PASS'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); self::$objDataBase->DB=$Config->DB; } return self::$objDataBase; } /** * Возвращает префикс для таблиц базы данных. * * @abstract * @return DataBase::$DB['DB_PREFIX'] * * @uses PDO * @version f0.1 * @since 0.2.0a * @author Denis Ranneft a.k.a. ImmortaL */ public function getPrefix() { return $this->DB['DB_PREFIX']; } } /** Класс Auth. * * * Осуществляет работу с зарегестрированными пользователями. * * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.1.0a * @since 0.3 * @author Denis Ranneft a.k.a. ImmortaL */ class Auth { private static $objAuth; public $_Basehref = ""; private function __construct($system_array) { $this->_Basehref = $system_array['basehref']; $this->_SessionTime = $system_array['sessionTime']; $this -> getAuthUsers(); } /** * Фабрика. * * Создает один экземпляр класса. Если объект уже существует - вернет его. * * @access public * @static * @return Config объект с настройками базы данных * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objAuth) { $Config = Config::_Factory(); self::$objAuth = new Auth($Config->system); } return self::$objAuth; } /** * Список пользователей. * * Создает авторизованных пользователей. * * @access private * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ private function getAuthUsers() { $db = DataBase::_Factory(); $sql = 'SELECT * FROM '.$db->getPrefix().'users'; $res = $db->query($sql); $this->authUsers = $res -> fetchAll(PDO::FETCH_ASSOC); } /** * Проверка пользователя. * * Если у нас уже установлены куки проверяем, действительно ли они подходят. * * @access public * @return bool * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public function validateUser($hash) { foreach ($this->authUsers as $user) { if ($user['hash']==$hash) { return true; } } return false; } /** * Проверка пользователя. * * Проверяет логин и пароль пользователя, пытающегося осуществить вход в админ. панель. * * @access public * @return bool|string $hash * @since 0.1.0a * @version f0.1 * @author Denis Ranneft a.k.a. ImmortaL */ public function loginUser($username, $password) { $hash = md5($username.$password); foreach ($this->authUsers as $user) { if ($user['hash']==$hash) { return $hash; } } return false; } } /** Класс Document. * * * Работает с xml документом. * * * @package SimpRa * @subpackage Core * @category Core Classes * * @version 0.1.0a * @since 0.3 * @author Denis Ranneft a.k.a. ImmortaL */ class Document { public static $objDocument; private function __construct() { } /** * Фабрика. * * Создает один экземпляр класса. Если объект уже существует - вернет его. * * @access public * @static * @return object DomDocument с стандартным деревом тегов. * @since 0.1.0a * @version f0.4 * @author Denis Ranneft a.k.a. ImmortaL */ public static function &_Factory() { if(!self::$objDocument) { $imp = new DOMImplementation(); $dtd = $imp ->createDocumentType('root', '', $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'dtd'.DIRECTORY_SEPARATOR.'mnemonic.dtd'); self::$objDocument = $imp ->createDocument('', '', $dtd); self::$objDocument -> formatOutput = true; self::$objDocument -> encoding = 'UTF-8'; } return self::$objDocument; } }
Fatal error: Class 'Loader' not found in /var/www/domains/simpra.ru/boot.php on line 7