* @copyright: Copyright (c) 2010, Bunzia Alexander
* @version: 1.1
* @license: http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @package HiLo CMS
*/
/**
* Запрет кэширования
*
*/
function sys_header_no_cache(){
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
}
/**
* Добавляем новый формат отображения даты.
* Теперь можно выводить русские названия месяцев указав "м" в строке формата.
* Это аналог "m" для английского языка
*
* @subpackage ПоРемонту.ру
* @var str $format форма вывода времени
* @var int $t timestamp
*/
function sys_date($format,$timestamp){
if ( empty($format) ){
sys_error(ERROR_500);
}
$date = date($format,$timestamp);
$m = date('n',$timestamp);
$en = constant('F_MONTH_SP_'.$m);
return str_replace( 'м',$en,$date);
}
/**
* Таймер, для измерения скорости исполнения кода
*
*/
function sys_timer($end=0){
$end = !empty($end) ? $end : MAIN_TIME_BEGIN;
$time_start = explode(' ', $end);
$time_end = explode(' ', microtime());
return $parse_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start[0])), 3);
}
/**
* Удаляем все последствия экранирования в массиве $value
*
*/
function sys_clear_slashes($value){
return (is_array($value) ? array_map('sys_clear_slashes', $value) : stripslashes($value));
}
/**
* Приводит значение $a к числовому типу, испольузется в купе с array_map для очистки массивов
*
*/
function sys_intval($a){
return intval($a);
}
/**
* Обработка ошибок
*
*/
function sys_error($type,$msg='',$file='',$line=''){
global $MAIN_ERROR,$MAIN_USER;
switch($type){
// для IE6 путь закрыт
case(ERROR_IE6):
sys_header_no_cache();
if ( $MAIN_USER -> is_admin() ){
//$page = new sys_pages('error/404.html');
//$page -> execute();
$t = new PHPTAL( MAIN_SOURCE_PATH.'/tmpl/files/tmpl_ie6.html' );
echo $t -> execute();
exit();
}
break;
// ошибка доступа
case(ERROR_403):
sys_header_no_cache();
header('HTTP/1.1 403 Access Error');
if ( MAIN_DEBUG_MODE ){
$info = debug_backtrace();
$size = sizeof($info);
$result = '';
for($i=($size-1);$i>=0;$i--){
$result.='- '.$info[$i]['file'].'('.$info[$i]['line'].')
';
}
$result .= '
';
echo $result;
echo F_ACCESS_CLOSE;
}else{
//$page = new sys_pages('error/403.html');
//$page -> execute();
$t = new PHPTAL( MAIN_SOURCE_PATH.'/tmpl/files/access_error.html' );
echo $t -> execute();
}
exit();
break;
// критическая ошибка при обработке ajax запроса
case(ERROR_501):
$msg = !empty($msg) ? $msg : E_500_MSG;
if ( false!==MAIN_FATAL_LOG){
$txt = str_replace('{time}',date('h:i',MAIN_TIME), TMPL_FATAL_ERROR_LOG);
$txt = str_replace('{msg}',$msg, $txt);
$txt = str_replace('{request_dump}',var_export($_REQUEST,true), $txt);
$txt = str_replace('{cookie_dump}',var_export($_COOKIE,true), $txt);
//$info = debug_backtrace();
//$txt = str_replace('{debug_dump}',var_export($info,true), $txt);
sys_log(MAIN_FATAL_LOG, $txt);
}
echo $msg;
exit();
break;
// критические ошибки
case(ERROR_500):
$msg = !empty($msg) ? $msg : E_500_MSG;
if ( MAIN_DEBUG_MODE ){
var_dump($_REQUEST);
$info = debug_backtrace();
$size = sizeof($info);
$result = '';
for($i=($size-1);$i>=0;$i--){
$result.='- '.$info[$i]['file'].'('.$info[$i]['line'].')
';
}
$result .= '
';
header('HTTP/1.1 500 Internal Error');
echo "$msg $result";
}else{
// формируем отчёт о фатальной ошибке
if ( false!==MAIN_FATAL_LOG){
$txt = str_replace('{time}',date('h:i',MAIN_TIME), TMPL_FATAL_ERROR_LOG);
$txt = str_replace('{msg}',$msg, $txt);
$txt = str_replace('{request_dump}',var_export($_REQUEST,true), $txt);
$txt = str_replace('{cookie_dump}',var_export($_COOKIE,true), $txt);
$info = debug_backtrace();
$txt = str_replace('{debug_dump}',var_export($info,true), $txt);
sys_log(MAIN_FATAL_LOG, $txt);
}
$t = new PHPTAL( MAIN_SOURCE_PATH.'/tmpl/files/critical_error.html' );
echo $t -> execute();
}
exit();
break;
// просто ошибки программирования
case(ERROR_MESSAGE):
if ( MAIN_DEBUG_MODE ){
echo "$msg ($file: $line )
";
}
if ( false!==MAIN_ERROR_LOG){
$txt = str_replace('{time}',date('h:i',MAIN_TIME), TMPL_ERROR_LOG);
$txt = str_replace('{msg}',"$msg ($file: $line )", $txt);
$txt = str_replace('{request}',$_SERVER['REQUEST_URI'], $txt);
sys_log(MAIN_ERROR_LOG, $txt);
}
//$MAIN_ERROR['error'] = array('msg' =>$msg,'file'=>$file,'line'=>$line );
break;
// закрытый сайт
case(CLOSE_SITE_MSG):
if ( MAIN_DEBUG_MODE){
return FALSE;
}else{
$t = new PHPTAL( MAIN_SOURCE_PATH.'/tmpl/files/maintenance.html' );
echo $t -> execute();
exit();
}
break;
// несуществующа страничка
case(ERROR_404):
case('404'):
if ( MAIN_DEBUG_MODE ){
$info = debug_backtrace();
$size = sizeof($info);
$result = '';
for($i=($size-1);$i>=0;$i--){
$result.='- '.$info[$i]['file'].'('.$info[$i]['line'].')
';
}
$result .= '
';
echo (!empty($msg) ? $msg :F_NOT_FOUND);
echo $result;
}else{
header('HTTP/1.1 404 Not Found');
sys_log(F_NOT_FOUND.':'.$_SERVER['REQUEST_URI'],$file,$line);
$t = new PHPTAL( MAIN_SOURCE_PATH.'/tmpl/msg/404.html' );
echo $t -> execute();
}
exit();
break;
// лог сообщений дебага
case(TIME_MSG):
$MAIN_ERROR[TIME_MSG][]= array($msg['time'],$msg['text'],$file."[ $line ]" );
break;
// лог sql запросов
case(SQL_MSG):
$MAIN_ERROR[SQL_MSG][]= array($msg['time'],$msg['sql'],$file."[ $line ]" );
break;
// знает что
default:
$RC_ERROR[$error_type][]= ''.$msg.'';
break;
}
}
// логируем
function sys_log( $file,$msg){
if (!$handle = fopen($file, 'a')) {
return FALSE;
// die('Файл "'.$file.'" не доступен для записи' );
}
if ( fwrite($handle, $msg) === FALSE) {
return FALSE;
}
fclose($handle);
}
// логирование данных
function sys_data_log(){
if ( false===MAIN_DATA_LOG){
return false;
}
$txt = str_replace('{time}',date('h:i',MAIN_TIME), TMPL_DATA_LOG);
$txt = str_replace('{request_dump}',var_export($_REQUEST,true), $txt);
$txt = str_replace('{cookie_dump}',var_export($_COOKIE,true), $txt);
$txt = str_replace('{files_dump}',var_export($_FILES,true), $txt);
sys_log(MAIN_DATA_LOG,$txt);
return true;
}
// логирование данных
function sys_access_log(){
if ( false===MAIN_ACCESS_LOG){
return false;
}
$txt = str_replace('{time}',date('h:i',MAIN_TIME), TMPL_ACCESS_LOG);
$txt = str_replace('{ip}',MAIN_USER_IP, $txt);
$txt = str_replace('{client}',$_SERVER['HTTP_USER_AGENT'], $txt);
$txt = str_replace('{request}',$_SERVER['REQUEST_URI'], $txt);
sys_log(MAIN_ACCESS_LOG,$txt);
return true;
}
/**
* Перехватываем ошибки php
*
*
*/
function sys_error($errno, $errstr, $errfile, $errline){
$exseptions = array(2048,8);
// не подключился файл
if ( $errno ==2 ){
sys_error(ERROR_MESSAGE,$errno.':'.$errstr, $errfile,$errline);
}elseif( in_array($errno,$exseptions) ){
return false;
}else{
sys_error(ERROR_MESSAGE,$errno.':'.$errstr, $errfile,$errline);
}
}
// получаем ip
function sys_get_ip(){
if ( getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown') ){
$ip = getenv('HTTP_X_FORWARDED_FOR');
$ip = preg_replace('/,.*/', '', $ip);
}elseif (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')){
$ip = getenv('HTTP_CLIENT_IP');
}elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')){
$ip = getenv('REMOTE_ADDR');
}elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')){
$ip = $_SERVER['REMOTE_ADDR'];
}else{
sys_error(ERROR_403);
}
return $ip;
}
/**
* Правиряем правильность e-Mail адреса
* Authors : Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
* : Marcus Bointon (coolbru) coolbru@users.sourceforge.net
*
*/
function sys_is_mail($email) {
if ( function_exists('filter_var') ) {
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
return false;
} else {
return true;
}
}
return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
/*if ( !preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i", $email) ) {
return false;
}
return true;*/
}
function check_img_name($text) {
die('устаревшая функция check_img_name в functions.php');
if ( empty($text) ){
return false;
}
if ( !preg_match('#[0-9]*\.(jpg|jpeg|gif|png)#i',$text)){
return false;
}
return true;
}
// проверяем имя модуля
function sys_check_module_name($text) {
if ( empty($text) ){
return false;
}
$text= preg_replace('#[^a-z0-9_]#i','',$text);
return $text;
}
// проверяем название функции генерирующей страницу
function sys_check_func_name($text) {
die('устаревшая функция sys_check_func_name в functions.php');
return system_check_page_name($text);
}
//функция записи в файл
function system_write_file($file,$data){
die('устаревшая функция system_write_file в functions.php');
}
/**
* Генерируем произвольную строку
*
* @project cms
* @name sys_str_rand
* @param int count Длинна генерируемой строки
* @return strung Произвольная строка
*/
// генерируем случайную строку
function sys_str_rand($count) {
$consonents = "123456789bcdfghjklmnpqrstvwxyz";
$makepass='';
for ($i=0; $i<$count; $i++) {
$makepass .= substr($consonents, mt_rand(0, strlen($consonents)-1), 1);
}
return $makepass;
}
/**
* Генерируем случайное имя файла с расширением $ext для директории $d
*
* @param: string dir Директрия
* @param: string ext Расширение файла
* @param: string rand Случайная последовательность
* @return: strung Имя файла с расширением ext уникальное для директории d
*/
function sys_filename_rand($dir, $ext,$rand=''){
$name = $rand.'_'.MAIN_TIME.'.'.$ext;
return (file_exists($dir.'/'.$name) ) ? sys_filename_rand($dir, $ext, sys_str_rand(4) ) : $name;
}
// отключаем генерацию блоков на странице
function sys_block_disable(){
define('SYSTEM_BLOCKS_GENERATE_OK',true);
}
function sys_blocks_enable(){
global $MAIN_PAGE;
$MAIN_PAGE -> blocks();
}
/**
* Убираем html
*
* @var str $v текст для обработки
* @return str текст с испорченным html
*/
function sys_in_html($v){
return htmlspecialchars($v,ENT_QUOTES);
}
/**
* Экранируем спец-символы для использованием строки в sql-запросе
*
* @var str $v текст для обработки
* @return str текст с экранированными спец-символами
*/
function sys_in_sql($v){
return mysql_real_escape_string($v);
}
// проверяем название page-страницы
function sys_is_page($p_name){
if ( preg_match('#[^a-z0-9-_]#iU',$p_name) ){
return FALSE;
}
return TRUE;
}
// определяем IE6 или нет перед нами
function sys_is_ie6(){
if ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.0') ){
return TRUE;
}else{
return FALSE;
}
}
// генерируем url
function sys_url(){
$ListArg = func_get_args();
$url = $ListArg[0];
unset( $ListArg[0] );
if ( empty($url) ){
sys_error(ERROR_500,"URL template not found");
}
return vsprintf($url,$ListArg);
}
// 301 рекдирект на $url
function sys_redirect($url){
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: $url" );
exit();
}
// записываем файл
function sys_write_file($file,$data){
//chmod($file,'0777');
if( !file_put_contents($file,$data) ){
sys_error('500', sprintf(F_WRITE_ERROR,$file) );
return FALSE;
}
///chmod($file,'0777');
return TRUE;
}
// переводим массив в объект ( нужно для шаблонизатора)
function arr_to_obj($array){
$s = new stdClass;
foreach( $array AS $k=>$v ){
$s -> $k = $v;
}
return $s;
}
// прячем внешние ссылки за редирек, кроме ссылок-исключений
function sys_url_to_redirect($text){
return preg_replace_callback ('#href\s*=\s*(\'|")http://(.*)(\'|")#iUs','inc_url_to_redirect_callback',$text);
}
// очищаем текст от ссылок через редирект
function sys_redirect_to_url($text){
return preg_replace('#'.MAIN_URL.'/redirect\.php\?url=#i','http://',$text);
}
// вспомогательная функция обратного вызова
function inc_url_to_redirect_callback($url){
global $MAIN_PAGE;
if ( preg_match('#'.str_replace(',','|',$MAIN_PAGE -> config("sys_url_list") ).'#iUs',$url[2]) ){
return 'href="http://'.$url[2].'"';
}else{
return 'href="'.MAIN_URL.'/redirect.php?url='.$url[2].'"';
}
}
/**
* Обрезать текст до заданной длины
*
* @var: str $text обрезаемый текст
* @var: int $size Ограничения на максимальную длинну результируещей строки
* @var: int $min_size Ограничения на минимальную длинну результируещей строки
* @return: str
*/
function sys_short_text($text,$size=600,$min_size=30){
$text = preg_replace('# #Us','',$text);
$text = trim(strip_tags($text));
if ( preg_match('#^.{'.$size.','.($size+250).'} #iUs',$text,$txt) ){
$text = $txt[0];
}
return $text;
}
// формируем из $v текст эффективный для морфологического поиска
function sys_clear_text($v){
if ( is_numeric($v) ){
return $v;
}
include_once(MAIN_SOURCE_PATH.'/inc/class.morf.php');
$stemmer = new Lingua_Stem_Ru();
$v = preg_replace("/[^\w\x7F-\xFF\s]/"," ",strip_tags($v));
$v = explode(' ',$v);
foreach ($v as $word)
{
if ( strlen($word)<=2 ){
continue;
}
$min_word=$stemmer->stem_word($word);
if ( strlen($min_word)<3 ){
$min_word.='00';
}elseif ( strlen($min_word)<4 ){
$min_word.='0';
}
$word_array[]=$min_word;
}
return (implode(' ',$word_array));
}
// проверяет, может ли быть $v алиасом
function sys_is_alias($v){
if ( empty($v) ){
return false;
}
if ( preg_match("#[^0-9a-z_-]#i", $v) ) {
return false;
}
return true;
}
function sys_check_safe_dir($v){
if ( preg_match('#[^a-z-0-9/_]#',$v) ){
return false;
}
return true;
}
// переводим utf строку в транслит
function sys_translit($string){
$string = mb_strtolower($string, "utf-8");
// добавлен модификатор u для удаления мусора в utf кодировке
$string = preg_replace('#[^0-9a-zйцукенгшщзхъэждлорпавыфячсмитьбюё]#iu',' ',$string);
$string = trim($string);
$string = preg_replace('# {1,}#','-',$string);
$tr = array(
"а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"e","ж"=>"zh",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"",
"ы"=>"yi","ь"=>"","ю"=>"e","э"=>"e","ю"=>"yu","я"=>"ya"
);
return strtr($string,$tr);
}
// проверяет, может ли быть $v названием файла
function sys_is_file($v){
if ( preg_match('#[^a-z0-9_.]#i',$v) ){
return false;
}
return true;
}
// собираем по всему сайту сообщения
function build_rss(){
/*global $MAIN_DB,$MAIN_PAGE;
$modules = array(
'news_sql_rss' => MAIN_SOURCE_PATH.'/modules/news/inc/class.news.php',
);
$sql = array();
foreach( $modules as $f => $url ){
include_once( $url );
if ( !function_exists($f) ){
sys_error('500');
}
$sql[]= $f() ;
}
$sql = implode(" UNION ALL ",$sql);
$sql .=' ORDER BY time_add DESC LIMIT 0,20';
$res = $MAIN_DB -> query($sql);
$search = array();
while( $row = $MAIN_DB -> fetch_array($res) ){
$row['time_add'] = date("r", $row['time_add']);
$row['url'] = MAIN_URL.$row['url'];
$search[]=arr_to_obj($row);
}
$t = new PHPTAL( false );
$t -> setOutputMode(PHPTAL::XML);
$t -> setSource(TMPL_RSS_MAIN);
$t -> rows = $search;
$t -> site_name = $MAIN_PAGE -> config('sys_site_name');
$t -> time_pub = date("r", MAIN_TIME );
$t -> rss_url = RSS_URL;
$t -> site_url = MAIN_URL;
$t -> site_desc = $MAIN_PAGE -> config('sys_site_desc');
sys_write_file( RSS_PATH, $t -> execute() );
return true;*/
}
function build_map(){
/*global $MAIN_DB,$MAIN_PAGE;
$modules = array(
'news',
'glossary'
);
foreach( $modules as $m ){
$row = array();
$file = MAIN_SOURCE_PATH.'/modules/'.$m.'/cache/map.xml';
if ( !file_exists($file) ){
continue;
}
$row['url'] = MAIN_SOURCE_URL.'/modules/'.$m.'/cache/map.xml';
$row['date'] = date('Y-m-d',filectime($file) );
$search[]=arr_to_obj($row);
}
$t = new PHPTAL( false );
$t -> setOutputMode(PHPTAL::XML);
$t -> setSource(TMPL_MAIN_MAP_XML);
$t -> rows = $search;
sys_write_file( SITEMAP_XML_PATH, $t -> execute() );
return true;*/
}
function ping($url,$title){
$pings = array('http://ping.blogs.yandex.ru/RPC2','http://blogsearch.google.ru/ping/RPC2');
if ( empty($url) || empty($title) ){
sys_error( ERROR_500 );
}
$t = new PHPTAL( false );
$t -> setOutputMode(PHPTAL::XML);
$t -> setSource(TMPL_PING_XML);
$t -> url = $url;
$t -> title = $title;
$data = $t -> execute();
$len = strlen($data);
foreach( $pings as $p ){
$parse = parse_url($p);
$host = $parse['host'];
$port = isset($parse['port'])?$parse['port']:80;
$uri = isset($parse['path'])?$parse['path']:'/';
$fp=fsockopen($host,$port,$errno,$errstr);
if(!$fp){
sys_error(ERROR_MESSAGE, sprintf(F_CANT_OPEN_CONNECT,$host) );
continue;
}
$out = "POST $uri HTTP/1.0\r\n";
$out .= "User-Agent: BlogPing/1.0\r\n";
$out .= "Host: $host\r\n";
$out .= "Content-Type: text/xml\r\n";
$out .= "Content-length: $len\r\n\r\n";
$out .= $data;
fwrite($fp, $out);
// если отладка выключена, то анализ делать не нужно
if ( MAIN_DEBUG_MODE!==true ){
continue;
}
$response = '';
while(!feof($fp) ){
$response.=fgets($fp, 128);
}
fclose($fp);
if( !strstr($response,"Thanks for the ping") ){
sys_error(ERROR_MESSAGE, sprintf(F_BAD_ANSWER,$response) );
continue;
}
}
return true;
}
// пересчитываем байты в подходящие единицы
function byte_to_str($v){
if( $v < 1000 ){
return sprintf(F_BYTE,$v);
}elseif( $v>=1000 && $v< 1000000 ){
return sprintf(F_KB_BYTE,(round($v/1000)) );
}elseif( $v>=1000000 ){
return sprintf(F_MB_BYTE,(round($v/1000000)) );
}
return false;
}
/**
* конверт переносов строки в
*
*
*/
function sys_convert_br($text) {
$find[] = "/(\015\012)|(\015)|(\012)/";
$replace[] = "
";
$text = preg_replace($find, $replace, $text);
return $text;
}
/****************
* Шаблоны для парсера
***************/
// пинг файл для яндекса
define("TMPL_PING_XML",
<<
weblogUpdates.ping
Лучший подарок — это книга
http://clubs.ya.ru/company/rss/posts.xml
EOF
);
/*
// общий файл-мап
define("TMPL_MAIN_MAP_XML",
<<
EOF
);
// шаблон для генерации rss-ленты для модулей
define('TMPL_RSS_MAIN',<<
Название сайта
http://www.goupstate.com/
Описание
ru-ru
Tue, 10 Jun 2003 04:00:00 GMT
http://blogs.law.harvard.edu/tech/rss
10
Название сайта
http://site.ru/source/tmpl/img/logo.png
Ссылка на сайт
295
102
Последние материалы проекта ПоРемонту.ru
-
Название материала
Ссылка на материал
Ссылка на материал
Дата публикации
Модуль
TMPL_RSS_MAIN
);
// шаблон для генерации sitemap для модулей
define("TMPL_MAP_XML",
<<
EOF
);*/
define("TMPL_FATAL_ERROR_LOG",
<<