/** * Конструктор */ function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } /** * Создаём объект Smarty */ $this->smarty = new Open_Smarty(); /** * Передаём Smarty ссылки на экземпляры объектов, для удобства их использования изнутри * Использовать функцию Smarty assign_by_ref не надо, т.к. мы и так имеем дело со ссылками на объекты, иначе получится двойная ссылка */ $C = Open_Config::getInstance(); $this->smarty->assign('config', $C); $this->smarty->assign('input', Open_Input::getInstance()); $this->smarty->assign('router', Open_Router::getInstance()); $this->smarty->assign('text', Open_Text::getInstance()); $this->smarty->assign('view', $this); /** * Устанавливаем значения по умолчанию */ $config = $C->get(array('headers', 'default_title', 'js', 'css', 'default_body')); $this->setHeaders($config['headers']); $this->setTitle($config['default_title']); $this->setJs($config['js']); $this->setCss($config['css']); $this->setBody($config['default_body']); }
/** * Конструктор */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $config = Open_Config::getInstance()->get('auth', array('table', 'identity_field', 'credential_field', 'treatment_callback')); $this->table = $config['table']; $this->identityField = $config['identity_field']; $this->credentialField = $config['credential_field']; $this->treatmentCallback = $config['treatment_callback']; }
/** * Конструктор */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $this->config = Open_Config::getInstance(); $this->input = Open_Input::getInstance(); $this->router = Open_Router::getInstance(); $this->text = Open_Text::getInstance(); $this->view = Open_View::getInstance(); $this->setArguments($this->router->getArguments()); }
/** * Конструктор * */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $this->config = Open_Config::getInstance()->get('db'); /** * Если установлен параметр автоматического соединения с БД, то соединяемся */ if ($this->config['auto_connect'] === TRUE) { $this->connect(); } }
/** * Конструктор */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $config = Open_Config::getInstance()->get('acl', array('roles', 'hierarchy', 'resources', 'allow', 'deny', 'complete_access_role')); $this->roles = $config['roles']; $this->hierarchy = $config['hierarchy']; $this->resources = $config['resources']; $this->allow = $config['allow']; $this->deny = $config['deny']; $this->complete_access_role = $config['complete_access_role']; }
/** * Конструктор */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $C = Open_Config::getInstance(); $I = Open_Input::getInstance(); /** * Открываем сессию * Имя куки зависит от названия приложения, текущего ip пользователя и агента пользователя * Соответственно сменив ip или используя другой агент откроется и другая сессия * Выполняется "хитрое" преобразование, чтобы никто не догадался :-) * Об этом никто не должен знать */ session_name(strrev(md5(str_rot13($C->get('application_name') . $I->ip() . $I->server('HTTP_USER_AGENT')) & !md5($I->ip())))); session_start(); //session_regenerate_id(TRUE); }
/** * Конструктор */ protected function __construct() { parent::__construct(); if (DEBUG) { Open_Benchmark::getInstance()->mark(__CLASS__ . '_start'); } $C = Open_Config::getInstance(); $this->config = $C->get('text'); /** * Установка рабочей локали, если она всё ещё не указана * Локаль устанавливается на этапе роутинга */ if (self::$locale === FALSE) { self::locale($C->get('default_locale')); } /** * Установка домена по умолчанию */ self::domain($this->config['default_domain']); }
/** * Получить путь БЕЗ локали в начале * * @return string */ public function pathNoLocale() { if ($this->pathNoLocale === FALSE) { $locales = array_keys(Open_Config::getInstance()->get('locales')); $this->pathNoLocale = preg_replace('#^/(' . implode('|', $locales) . ')#i', '', $this->path()); } return $this->pathNoLocale; }
/** * Функция для вставки постраничной навигации * * Параметры: * * 1. Обязательные * * 1.1. Для всех шаблонов * 1.1.1. link - ссылка для навигации, где подстрока [:nav:] заменяется на параметр навигации (e.g. страницу, номер объекта) * 1.1.2. amount - количество объектов по которым производится навигация * 1.1.3. span - количество объектов выводимых на одной странице * 1.1.4. current - текущий параметр навигации (e.g. текущая страница, номер объекта) * * 1.2. Шаблон first * * 2. Необязательные * * 2.1. Для всех шаблонов * 2.1.1. pattern - шаблон постраничной навигации. По умолчанию берётся значение 'default_pagination_pattern' из конфига * 2.1.2. class - имя класса для <div> навигации. По умолчанию будет присвоен класс 'pagination-'. $params['pattern'] * * 2.2. Шаблон first * 2.2.1. around - страниц рядом с текущей * 2.2.2. gaps - максимальное количество промежутков * 2.2.3. threshold - порог промежутка * 2.2.4. gap - обозначение промежутка, по умолчанию строка '…', что есть многоточие * * @param array $params * @param object $smarty * @return string */ function smarty_function_pagination($params, &$smarty) { /** * Проверка все ли необходимые аргументы переданы */ if (!isset($params['link']) || empty($params['link'])) { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Parameter <b>%s</b> for Smarty function <b>pagination</b> is not set'), 'link'), E_USER_ERROR); } else { if (!isset($params['amount']) || empty($params['amount'])) { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Parameter <b>%s</b> for Smarty function <b>pagination</b> is not set'), 'amount'), E_USER_ERROR); } else { if (!isset($params['span']) || empty($params['span'])) { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Parameter <b>%s</b> for Smarty function <b>pagination</b> is not set'), 'span'), E_USER_ERROR); } else { if (!isset($params['current']) || empty($params['current'])) { trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Parameter <b>%s</b> for Smarty function <b>pagination</b> is not set'), 'current'), E_USER_ERROR); } } } } /** * Если шаблон не передан, берём значение по умолчанию из конфига */ if (!isset($params['pattern']) || empty($params['pattern'])) { $params['pattern'] = Open_Config::getInstance()->get('default_pagination_pattern'); } /** * Если класс ещё не объявлен, подключается исходный файл */ if (!class_exists('Open_Pagination')) { require_once CORE_PATH . 'Open/Pagination' . EXT; } /** * Выполнение действий для выбранного шаблона */ switch ($params['pattern']) { case Open_Pagination::FIRST: /** * Установка значений по умолчанию, если необходимо */ $params['around'] = isset($params['around']) ? $params['around'] : Open_Pagination::FIRST_DEFAULT_AROUND; $params['gaps'] = isset($params['gaps']) ? $params['gaps'] : Open_Pagination::FIRST_DEFAULT_GAPS; $params['threshold'] = isset($params['threshold']) ? $params['threshold'] : Open_Pagination::FIRST_DEFAULT_THRESHOLD; /** * Получение массива с вычисленными значениями */ $params['pagination'] = Open_Pagination::getInstance()->patternFirst($params['amount'], $params['span'], $params['current'], $params['around'], $params['gaps'], $params['threshold']); break; default: trigger_error(sprintf(Open_Text::getInstance()->dget('errors', 'Pagination pattern <b>%s</b> is not available'), $params['pattern']), E_USER_ERROR); break; } /** * Получение значения переменной params из Smarty * Устанавливается своё значение */ $paramsBackup = $smarty->get_template_vars('params'); $smarty->assign('params', $params); /** * Отключение кеширования */ $previousCaching = $smarty->caching; $smarty->caching = FALSE; /** * Получение шаблона */ $result = $smarty->fetch('Open/Pagination/' . $params['pattern'] . TPLEXT); /** * Возврат значения кеширования */ $smarty->caching = $previousCaching; /** * Восстановление значения переменной params */ $smarty->assign('params', $paramsBackup); return $result; }
/** * Показать 404-ю * * @param string $message Текст ошибки */ function trigger404($message = FALSE) { if ($message === FALSE) { $message = Open_Text::getInstance()->dget('errors', Open_Config::getInstance()->get('default_404_message')); } triggerError($message, E_404); }
/** * Callback функция для preg_replace_callback * С определением текущей кодировки * * @param array $match * @return string */ private static function xss_html_entity_decode($match) { return html_entity_decode($match[0], ENT_COMPAT, strtoupper(Open_Config::getInstance()->get('charset'))); }
/** * Перенаправление на URL * Если передан полный URL с хостом, то перенаправление чётко на него * Если передан URL без хоста, то к нему добавляется текущая локаль (если её нет) и текущий хост * * @param string $url */ public function redirect($url) { if (!parse_url($url, PHP_URL_HOST)) { $I = Open_Input::getInstance(); $locales = array_keys(Open_Config::getInstance()->get('locales')); if (!preg_match('#^/(' . implode('|', $locales) . ')#i', $url)) { $url = $I->locale() . $url; } $url = $I->base() . $url; } header('Location: ' . $url); exit(0); }
/** * Установить соединение с БД * Если параметр профиль не передан, то подключение осуществляется по профилю по умолчанию * * @param string $profile По какому профилю подключиться * @return bool Успех операции */ public function connect($profile = FALSE) { $C = Open_Config::getInstance(); /** * Если профиль не передан, то берём профиль по умолчанию */ if ($profile === FALSE) { $profile = $this->config['default_profile']; } /** * Если соединение по этому профилю уже существует, то возвращаем успех операции */ if (isset($this->links[$profile])) { return TRUE; } /** * Если выбранного профиля в конфиге не существует, то возвращаем провал операции */ if (!isset($this->config['profiles'][$profile])) { triggerError(sprintf(Open_Text::getInstance()->dget('errors', 'Profile <b>%s</b> for DB does not exist in config'), $profile), E_DB); return FALSE; } else { $P = $this->config['profiles'][$profile]; } /** * Сохраняем текущий профиль */ $this->setProfile($profile); /** * Соединяемся с базой с учётом выбранного метода - connect или pconnect */ $this->links[$profile] = $P['pconnect'] ? @mysql_pconnect($P['host'], $P['user'], $P['password']) : @mysql_connect($P['host'], $P['user'], $P['password']) or triggerError("<i>" . Open_Text::getInstance()->dget('errors', 'Unable to connect to the server') . " - <b>" . $P['host'] . "</b> !<br><b>#" . mysql_errno() . "</b> - " . mysql_error() . "</i><br />", E_DB); /** * Устанавливаем три переменные сеанса * character_set_client * character_set_connection * character_set_result * Для корректной работы с кодировкой */ $this->query("SET NAMES '" . strtoupper(preg_replace('#[^a-z0-9]#i', '', $C->get('charset'))) . "'"); /** * Выбираем рабочую базу */ mysql_select_db($P['db'], $this->links[$profile]) or triggerError("<i>" . Open_Text::getInstance()->dget('errors', 'Unable to select DB') . " - <b>" . $P['host'] . "</b> !<br><b>#" . mysql_errno($this->links[$profile]) . "</b> - " . mysql_error($this->links[$profile]) . "</i><br />", E_DB); return TRUE; }