/*!
@file startup.php
@brief Инициализация функционирования CMS сайта
@details Инициализация функционирования CMS сайта (определение констант, подключение к БД, вспомогательные функции, отладка БД)
*/
include('debug.php');
if(version_compare(phpversion(), '5.1.0', '<') == true) die('Ошибка: Версия PHP не соответствует необходимой (слишком старая)');
//die('Выполняются регламентные работы. Ориентировочное время окончания 21:00 МСК. Приносим извинения за доставленные неудобства.');
//----------------------------------------------------
// Настройки:
// 1. ARG_STYLE - Стиль передачи аргументов
//Стили передачи аргументов
//0 - передаем аргументы в виде /controller/action?arg1=val1&arg2=val2...
//1 - передаем аргументы в виде /controller/action/val1/val2..
define('ARG_STYLE', 0);
//----------------------------------------------------
// Константы:
// 1. Разделитель дирректории
define('DIRSEP', DIRECTORY_SEPARATOR);
// 2. Путь до сайта (относительно корня)
$site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;
define('SITE_PATH', $site_path);
// 3. Адрес сайта
define('SITE_URL', isset($_SERVER['HTTPS']) ? 'https://' . $_SERVER['SERVER_NAME'].'/' : 'http://' . $_SERVER['SERVER_NAME'].'/');
// 4. Версионирование скриптов (для автоочистки в кэше браузеров)
define('VERSION_SITE', 260903);
// 5. Сервер с файлами
define('FILE_SERVER_URL', 'http://192.168.0.130');
// 6. Загрузка классов "на лету"
function __autoload($class_name)
{
$filename = strtolower($class_name) . '.php';
$file = SITE_PATH . 'classes' . DIRSEP . $filename;
if(file_exists($file) == false) return false;
include ($file);
}
// 7. Выполнение событий для каждой страницы - попытка подключиться к БД, генерация и валидация cookie для корзины
$registry = new Registry;
start();
// 8. Путь к хранилищу изображений контента
define('SITE_IMG_CONTENT_PATH_URL', '/img/content/');
// 9. Путь к хранилищу изображений баннера
define('SITE_IMG_BANNER_PATH_URL', '/img/info/');
// 10. Тип документов для библиотек EPLAN
define('TYPE_DOC_EPLAN', 16);
// 11. Тип документов для библиотек EPLAN
define('TYPE_DOC_CATALOGUE', 29);
// 12. Страна сайта
define('SITE_ZONE', 'ru');
/*!
@brief Нормализация кодировки БД
@details Нормализация кодировки БД
@param array $array Массив
@param integer $type Тип массива:
0 - одномерный
1 - двумерный массив
@return array $return_array Нормализованный массив
*/
function db_rus($array, $type = 1)
{
return $array;
/*$return_array = Array();
if(!is_array($array)) return $return_array;
if($type == 1)
{
foreach($array as $key => $value)
{
foreach($value as $k => $v) $return_array[$key][iconv("windows-1251", "utf-8", $k)] = $v;
}
}
elseif($type == 0) foreach($array as $key => $value) $return_array[iconv("windows-1251","utf-8",$key)] = $value;
return $return_array;*/
}
/*!
@brief Преобразование денежного формата.
@details Преобразуем к денежному формату:
1) Отсекаем дробную часть, если она равна нулю (132.0000 -> 132) или входной параметр $fract = false
2) Приводим к формату с точностью в 2 знака, если дробная часть не равна нулю (132.1500 -> 132.15)
@param float $money Число, представляющую собой сумму
@param bool $fract Предикат, определяющий отсекать или нет дробную часть, даже если она равна 0 (false - отсекаем дробную часть, true - оставляем дробную часть, даже в случае если она равна 0)
@return string $money строка, преобразованная к денежному формату
*/
function convert_money($money, $fract = false)
{
$fraction = $money - floor($money);
if($fraction > 0 || $fract == true) return number_format($money, 2, ',', ' ');
else return number_format(floor($money), 0, ',', ' ');
}
/*!
@brief Поиск значения в подмассивах
@details Поиск значения в подмассивах
@param integer|string|boolean $needle Искомое значение
@param array $haystack Массив, в котором производится поиск
@param string|integer $column_for_search Поле, по которому производится поиск
@return integer|boolean $current_key Возвращает ключ, по которому можно обратиться к искомому значению, либо возвращает false, если ничего не найдено в подмассивах
*/
function recursive_array_search($needle, $haystack, $column_for_search)
{
foreach($haystack as $key => $value)
{
$current_key=$key;
if(($needle === $value && $current_key == $column_for_search) || (is_array($value) && recursive_array_search($needle, $value, $column_for_search) !== false)) return $current_key;
}
return false;
}
/*!
@brief Замена тегов
@details Замена тегов
@param string $text Текст, в котором надо заменить теги
@param array $tags Массив тегов, которые необходимо вырезать
@return string $text Текст с вырезанными тегами (текст в тегах остается)
*/
function strip_selected_tags($text, $tags = array())
{
$args = func_get_args();
$text = array_shift($args);
$tags = func_num_args() > 2 ? array_diff($args,array($text)) : (array)$tags;
foreach($tags as $tag)
{
while(preg_match('/<'.$tag.'(|\W[^>]*)>(.*)<\/'. $tag .'>/iusU', $text, $found)) $text = str_replace($found[0],$found[2],$text);
}
return preg_replace('/(<('.join('|',$tags).')(|\W.*)\/>)/iusU', '', $text);
}
/*!
@brief Обработка ошибок при работе с БД и выдача дебага пользователю
@details Обработка ошибок при работе с БД и выдача дебага пользователю
*/
function debug_db_error($debug_msg = '')
{
global $registry;
// Генерация уникального GUID с ошибкой
$GUID = sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
$template = new Template($registry);
$registry->set('template', $template);
file_put_contents(SITE_PATH.'/errors_db.txt', 'Произошла ошибка при работе с БД в '.$debug_msg.' | GUID ошибки: '.$GUID.' | Дата: '.date('d.m.Y H:i:s').' | '.'IP:'.$_SERVER['REMOTE_ADDR']."\r\n", FILE_APPEND);
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
$registry['template']->set('GUID', $GUID);
$registry['template']->show('503', 'system');
exit;
}
/*!
@brief Стартовая функция движка
@details Стартовая функция движка (подключение к БД, генерация и валидация cookie для корзины)
*/
function start()
{
global $registry;
try
{
$options = array(PDO::SQLSRV_ATTR_ENCODING=>PDO::SQLSRV_ENCODING_UTF8, "CharacterSet" => "UTF-8");
// $db = new PDO("sqlsrv:Server=192.168.0.44;Database=TradeTest2", 'sa', '7vz54xmm4ev2', $options); // Подключаемся к базе
$db = new PDO("sqlsrv:Server=192.168.0.44;Database=TradeTest2", 'service_web_kipservis_prod', '4z7mevQ7Ip', $options); // Подключаемся к базе
$registry->set('db', $db);
}
catch(PDOException $e)
{
$db = false;
debug_db_error(__FILE__.' - '.__LINE__);
}
}
if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443){
$protocol = 'https://';
}else{
$protocol = 'http://';
}
$url = $protocol.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$urlend = strrpos($url, '?', -1); // Находим и удаляем все параметры (номер страницы, параметры фильтра и тд.)
if($urlend) {
$url = substr($url, 0, $urlend);
}
if(mb_substr($url, -1) == '/'){ // Тут оставляем, если ссылки на сайте не заканчиваются на /, либо удаляем, если заканчиваются на /.
$url = substr($url, 0, -1);
}
?>