<?php
/**
* Ant0ha's project
*
* @package
* @author Anton Pisarenko <[email protected]>
* @copyright Copyright (c) 2006 - 2010, Anton Pisarenko
* @license http://ant0ha.ru/license.txt
* @link http://ant0ha.ru
*/
defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');
//---------------------------------------------
/**
* Хелпер основного модуля
*/
class main {
/**
* Конфигурация для модулей
*/
public static function config($config_data, $module, $db) {
foreach($config_data as $key => $value) {
if($key == 'submit') continue;
$sql = "UPDATE #__config SET \n";
$sql .= "`value` = '". mysql_real_escape_string(stripslashes($value)) ."'\n";
$sql .= "WHERE `key` = '". mysql_real_escape_string($key) ."' AND module = '". mysql_real_escape_string($module) ."'";
$db->query($sql);
}
}
/**
* Функция удаления старых файлов в tmp
*/
public static function tmp_clear($ttl = 86400) {
$dir = opendir(ROOT .'tmp/');
while($f = readdir($dir)) {
if($f == '.' || $f == '..' || $f == '.htaccess') continue;
$file = ROOT .'tmp/'. $f;
if(@filemtime($file) < (time() - $ttl)) {
if(is_file($file)) unlink($file);
if(is_dir($file)) self::delete_dir($file);
}
}
}
/**
* Получение папки для файлов
*/
public static function get_dir($item_id) {
return strval(ceil($item_id / 30000));
}
/**
* Конвертирование строки в windows-1251
*/
public static function wtext($text){
return iconv('utf-8', 'windows-1251', $text);
}
/**
* Конвертирование строки в utf-8
*/
public static function utext($text){
return iconv('windows-1251', 'utf-8', $text);
}
/**
* Генерация случайной строки
*/
public static function get_unique_code($length = 0) {
$code = md5(uniqid(rand(), true));
if ($length != 0) return substr($code, 0, $length);
else return $code;
}
/**
* Транслитерация латиницы
*/
public static function translite($str){
$table = array('_'=>' ','a'=>'а','b'=>'б','v'=>'в','g'=>'г','d'=>'д','e'=>'е','yo'=>'ё','zh'=>'ж','z'=>'з','i'=>'и','j'=>'й','k'=>'к','l'=>'л','m'=>'м','n'=>'н','o'=>'о','p'=>'п','r'=>'р','s'=>'с','t'=>'т','u'=>'у','f'=>'ф','h'=>'х','c'=>'ц','ch'=>'ч','sh'=>'ш','sch'=>'щ','q'=>'ь','x'=>'ы','q'=>'ь','ye'=>'э','yu'=>'ю','ya'=>'я',
'A'=>'А','B'=>'Б','V'=>'В','G'=>'Г','D'=>'Д','E'=>'Е','YO'=>'Ё','ZH'=>'Ж','Z'=>'З','I'=>'И','J'=>'Й','K'=>'К','L'=>'Л','M'=>'М','N'=>'Н','O'=>'О','P'=>'П','R'=>'Р','S'=>'С','T'=>'Т','U'=>'У','F'=>'Ф','H'=>'Х','C'=>'Ц','CH'=>'Ч','SH'=>'Ш','SCH'=>'Щ','Q'=>'Ь','X'=>'Ы','YE'=>'Э','YU'=>'Ю','YA'=>'Я');
return $str;
}
/**
* Транслитерация кирилицы
*/
public static function detranslite($str){
$str=strtr($str, array(' '=>'_','а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'yo','ж'=>'zh','з'=>'z','и'=>'i','й'=>'j','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'sch','ь'=>'q','ы'=>'x','э'=>'ye','ю'=>'yu','я'=>'ya',
'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E','Ё'=>'YO','Ж'=>'ZH','З'=>'Z','И'=>'I','Й'=>'J','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F','Х'=>'H','Ц'=>'C','Ч'=>'CH','Ш'=>'SH','Щ'=>'SCH','Ь'=>'Q','Ы'=>'X','Э'=>'YE','Ю'=>'YU','Я'=>'YA')
);
return $str;
}
/**
* Добавление новых правил в роутинг
*/
public static function add_route_rules($block_name, $new_rules) {
$rules = file_get_contents(ROOT .'data_files/route_rules.dat');
$rules = '# '. $block_name .'_begin'. PHP_EOL . $new_rules . PHP_EOL .'# '. $block_name .'_end'. PHP_EOL . $rules;
file_put_contents(ROOT .'data_files/route_rules.dat', $rules);
}
/**
* Запрет действий в демо версии
*/
public static function is_demo() {
if(file_exists(ROOT .'is_demo'))
a_error('В демо версии данное действие запрещено!');
}
/**
* Функция рекурсивного копирования
*/
public static function r_copy($source, $dest) {
# Simple copy for a file
if (is_file($source)) {
return copy($source, $dest);
}
# Make destination directory
if (!is_dir($dest)) {
mkdir($dest);
}
# If the source is a symlink
if (is_link($source)) {
$link_dest = readlink($source);
return symlink($link_dest, $dest);
}
# Loop through the folder
$dir = dir($source);
while (false !== $entry = $dir->read()) {
// Skip pointers
if ($entry == '.' || $entry == '..') {
continue;
}
// Deep copy directories
if ($dest !== "$source/$entry") {
self::r_copy("$source/$entry", "$dest/$entry");
}
}
// Clean up
$dir->close();
return true;
}
/**
* Выполнение событий
*/
public static function events_exec(&$db, $type) {
$dir = opendir(ROOT .'data_files/events');
while($f = readdir($dir)) {
if(strstr($f, $type .'.event')) {
$module = trim(str_replace('.'. $type .'.event', '', $f));
if(!empty($module)) {
a_import('modules/'. $module .'/helpers/'. $module .'_events');
call_user_func(array($module .'_events', $type), &$db);
}
}
}
}
/**
* Добавление события
*/
public static function add_event($module, $place) {
$filename = ROOT .'data_files/'. $module .'.'. $place .'.event';
file_put_contents($filename, '');
chmod($filename, 0777);
}
/**
* Удаление события
*/
public static function delete_event($module) {
$dir = opendir(ROOT .'data_files/events');
while($f = readdir($dir)) {
if(preg_match('~^'. $module .'\.~', $f))
@unlink(ROOT .'data_files/events/'. $f);
}
}
/**
* Подстройка окончания
* @param int, string, string, string
* @using echo end_str(2,'сообщение','сообщения','сообщений');
*/
public static function end_str($count, $k_1, $k_234, $k_many) {
$count = (string)$count;
$num_xx = (int)$count[self::strlen($count)-2].$count[self::strlen($count)-1];
$num_x = (int)$count[self::strlen($count)-1];
if($num_xx<>11 && $num_xx<>12 && $num_xx<>13 && $num_xx<>14) {
if($num_x==1) {
return $k_1;
}
else
if($num_x==2 || $num_x==3 || $num_x==4) {
return $k_234;
}
else {
return $k_many;
}
}
else {
return $k_many;
}
}
/**
* Получение длины строки для utf-8
*/
public static function strlen($str) {
return strlen(self::wtext($str));
}
/**
* substr для utf-8
* @param string $string, int $start [int $lenght]
*/
public static function substr($string, $start, $lenght = NULL) {
return self::utext(substr(self::wtext($string), $start, $lenght));
}
/**
* Обновление файлового счетчика
*/
public static function update_file_counter($file, $number) {
# Получаем текущее число
$old_number = floatval(implode('', file($file)));
# Прибавляем (отбавляем) число
$new_number = $old_number + $number;
# Записываем данные в файл
$fp = fopen ($file, 'w+');
fwrite ($fp, $new_number);
fclose ($fp);
return $new_number;
}
/**
* Обрезание части строки по словам
* @param $string, $int
*/
public static function limit_words($string, $limit) {
$words = explode(' ', $string);
$i = 0;
$string = '';
while($i < $limit && $i < count($words)) {
$string .= $words[$i] .' ';
$i++;
}
return trim($string);
}
/**
* Рекурсивное удаление папки
*/
public static function delete_dir($arg, $clear = FALSE){
$d=opendir($arg);
while($f=readdir($d)) {
if($f!="."&&$f!="..") {
if(is_dir($arg."/".$f))
self::delete_dir($arg."/".$f);
else
@unlink($arg."/".$f);
}
}
if(!$clear) @rmdir($arg);
}
/**
* Formats a numbers as bytes, based on size, and adds the appropriate suffix
*
* @access public
* @param mixed // will be cast as int
* @return string
*/
public static function byte_format($num) {
if ($num >= 1000000000000) {
$num = round($num / 1099511627776, 1);
$unit = 'Tb';
}
elseif ($num >= 1000000000) {
$num = round($num / 1073741824, 1);
$unit = 'Gb';
}
elseif ($num >= 1000000) {
$num = round($num / 1048576, 1);
$unit = 'Mb';
}
elseif ($num >= 1000) {
$num = round($num / 1024, 1);
$unit = 'Kb';
}
else {
$unit = 'b';
return number_format($num).' '.$unit;
}
return number_format($num, 1).' '.$unit;
}
/**
* Простая функция для изменения форматов и размеров изображений
*/
public static function image_resize($infile, $outfile, $neww = 0, $newh = 0, $quality = 90) {
list($oldw, $oldh, $type)= getimagesize($infile);
if($neww == 0) {
$neww = $oldw;
$newh = $oldh;
}
elseif($newh == 0 && $neww > 0) {
$newh = $oldh * $neww / $oldw;
}
switch($type) {
case 1:
$function = 'imagecreatefromgif';
break;
case 2:
$function = 'imagecreatefromjpeg';
break;
case 3:
$function = 'imagecreatefrompng';
break;
default:
a_error('Не удалось определить формат изображения!');
}
$im = $function($infile);
$im1 = imagecreatetruecolor($neww, $newh);
imagecopyresampled($im1, $im, 0, 0, 0, 0, $neww, $newh, imagesx($im), imagesy($im));
# определяем формат получаемого файла
$ext = array_pop(explode('.', $outfile));
switch($ext) {
case 'jpg':
case 'jpeg':
imagejpeg($im1, $outfile, $quality);
break;
case 'gif':
imagegif($im1, $outfile, $quality);
break;
case 'png':
imagepng($im1, $outfile, $quality);
break;
default:
a_error('Не верно указан получаемый файл');
break;
}
imagedestroy($im);
imagedestroy($im1);
}
/**
* Получение названия месяца на русском
*/
public static function get_month_name($month_num, $ucfirst = false, $type = 1) {
$months = array(
1 => array('январь', 'января'),
2 => array('февраль', 'февраля'),
3 => array('март', 'марта'),
4 => array('апрель', 'апреля'),
5 => array('май', 'мая'),
6 => array('июнь', 'июня'),
7 => array('июль', 'июля'),
8 => array('август', 'августа'),
9 => array('сенрябрь', 'сентября'),
10 => array('октябрь', 'октября'),
11 => array('ноябрь', 'ноября'),
12 => array('декабрь', 'декабря')
);
$month_name = $months[intval($month_num)][$type];
return ($ucfirst ? self::utext(ucfirst(self::utext($month_name))) : $month_name);
}
/**
* Замена <p> на <br />
*/
public function tinymce_p_br($content) {
$content = preg_replace('/<p[^>]*>/', '', $content);
$content = str_replace('</p>', '<br />', $content);
if(substr(self::wtext($content), self::strlen($content) - 6) == '<br />') $content = self::utext(substr(self::wtext($content), 0, -6));
return $content;
}
/**
* Проверка данных регуляркой
*/
public static function check_input($value, $type, $mode = 'check'){
$filterinput = array(
"MAIL" => array("^[a-zA-Z0-9_.-]+\@[a-zA-Z0-9_.-]+\.[a-zA-Z]{2,5}$", "[email protected]"),
"LOGIN" => array("^[a-zA-Z0-9]{3,50}$","латинские буквы и цифры, не менее трех символов"),
"PASSWORD" => array("^[a-zA-Z0-9.,!#%*()]{3,20}$","от 3х латинских букв, цифр и знаков: .,!#%*()"),
"INT" => array("^\-?[0-9]*$","только цифры"),
"FLOAT" => array("^\-?[0-9]*\.?[0-9]*$","целаячасть.дробная"),
"IP" => array("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$","XXX.XXX.XXX.XXX"),
"WORD" => array("^[0-9a-z_/]*$","только английские буквы и цифры"),
"ROUTE" => array("^[0-9a-z_-]*$","только английские буквы и цифры"),
"URL" => array("^(https?|HTTPS?|ftp|gopher):\/\/[a-zA-Z0-9_-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{1,7}".// Основное имя сервера
"(\/[a-zA-Z0-9\_\.-]*\/?)*". // Имена возможных подкаталогов и файл
"(\?[a-zA-Z0-9\_]+=[a-zA-Z0-9]+([&][a-zA-Z0-9_]+=[a-zA-Z0-9]+)*)?$"//get параметр
,"http://site.com/path/"),
"TIME" => array("^[0-9]{2}(:[0-9]{2})?(:[0-9]{2})?$","ЧЧ:ММ:СС"),
"DATE" => array("^[0-9]{4}-[0-9]{2}-[0-9]{2}$","ГГГГ-ММ-ДД"),
"DATETIME" => array("^[0-9]{4}-[0-9]{2}-[0-9]{2}([ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}){0,1}$","ГГГГ-ММ-ДД ЧЧ:ММ:СС"),
"NUMPHONE" => array("^\+?[0-9 ()-]{5,20}$","только цифры"),
"SESSION" => array("^[0-9a-zA-Z]*$","правильная сессия"),
"FILE" => array("^[0-9a-zA-Z_.-]*$","только английские буквы и цифры"),
"DOMAIN" => array("^[a-z0-9\.\-]{2,50}$","только английские буквы и цифры")
);
if($mode == 'check')
return preg_match('~'. $filterinput[$type][0] .'~', $value);
elseif($mode == 'format')
return $filterinput[$type][1];
}
/**
* BBcode
*/
public static function bbcode($markup){
$preg = array(
# Text arrtibutes
'~\[b\](.*?)\[\/b\]~si' => '<b>$1</b>',
'~\[i\](.*?)\[\/i\]~si' => '<i>$1</i>',
'~\[u\](.*?)\[\/u\]~si' => '<u>$1</u>',
# цвет текста
'~\[red\](.*?)\[\/red\]~si' => '<font color="red">$1</font>',
'~\[green\](.*?)\[\/green\]~si' => '<font color="green">$1</font>',
'~\[blue\](.*?)\[\/blue\]~si' => '<font color="blue">$1</font>',
# выравнивания
'~\[center\](.*?)\[\/center\]~si' => '<div style="text-align: center">$1</div>',
'~\[left\](.*?)\[\/left\]~si' => '<div style="text-align: left">$1</div>',
'~\[right\](.*?)\[\/right\]~si' => '<div style="text-align: right">$1</div>',
# код
'/\[code\](.*)\[\/code\]/Usie' => "highlight('$1')",
# цитаты
'~\[q\](.*?)\[\/q\]~si' => '<div class="q">$1</div>',
# e-mail
'~\[email\](.*?)\[\/email\]~sei' => "'<a rel=\"noindex\" href=\"mailto:'.str_replace('@', '[dog]','$1').'\">'.str_replace('@', '[dog]','$1').'</a>'",
# ссылки
'~\[url=(.*?)?\](.*?)\[\/url\]~si' => '<a href="$1">$2</a>',
# images
'~\[img\](.*?)\[\/img\]~sei' => "'<img src=\"'. str_replace(\"'\", \"\", $1) .'\" alt=\"\" style=\"max-width: 150px;\" />'",
);
return preg_replace(array_keys($preg), array_values($preg), $markup);
}
}
?>