View file modules/main/helpers/main.php

File size: 15.71Kb
<?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) {
    	$dir = opendir(ROOT .'tmp/');
    	while($f = readdir($dir)) {
    		if($f == '.' || $f == '..') continue;
    		$file = ROOT .'tmp/'. $f;
            if(is_file($file) && (filemtime($file) > (time() - $ttl))) unlink($file);
    	}
	}

	/**
	* Конвертирование строки в 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, $get_table = FALSE){
		$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'=>'Я');

		$str=strtr($str, $table);
		if(!$get_table) return $str;
		return $table;
	}

	/**
	* Транслитерация кирилицы
	*/
	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 parse_mysql_dump($db, $url) {
	    $handle = @fopen($url, "r");
	    $query = "";
	    $errors = array();
	    while(!feof($handle)) {
	        $sql_line = fgets($handle);
	        if (trim($sql_line) != "" && strpos($sql_line, "--") === false) {
	            $query .= $sql_line;
	            if (preg_match("/;[\040]*\$/", $sql_line)) {
	                $result = $db->query($query);
	                $query = "";
	            }
	        }
	    }
	}

	/**
	* Добавление новых правил в .htaccess
	*/
	public static function add_rewrite_rules($rules) {
    	$htaccess = file_get_contents(ROOT .'.htaccess');
    	$htaccess = str_replace('# USER_RULES_BEGIN', '# USER_RULES_BEGIN'. PHP_EOL . $rules, $htaccess);
    	file_put_contents(ROOT .'.htaccess', $htaccess);
	}

	/**
	* Запрет действий в демо версии
	*/
	public static function is_demo() {
		if(file_exists(ROOT .'is_demo'))
			a_error('В демо версии данное действие запрещено!');
	}

	/**
	* Выполнение событий
	*/
	public static function events_exec(&$db, $type) {
    	$events_data = file_get_contents(ROOT .'data_files/events.dat');
    	# Обрезаем начало
    	$events_data = substr($events_data, strpos($events_data, '['. $type .'_start]') + strlen('['. $type .'_start]'));
    	# Обрезаем конец
        $events_data = substr($events_data, 0, strpos($events_data, '['. $type .'_end]'));
		$ex = explode(PHP_EOL, $events_data);
		foreach($ex as $module) {
        	$module = trim($module);
        	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) {
		$events = file_get_contents(ROOT .'data_files/events.dat');
		$events = str_replace('['. $place .'_start]', '['. $place .'_start]'. PHP_EOL . $module, $events);
		file_put_contents(ROOT .'data_files/events.dat', $events);
	}

	/**
	* Удаление события
	*/
	public static function delete_event($module) {
		$events = file_get_contents(ROOT .'data_files/events.dat');
		$events = str_replace(PHP_EOL . $module, '', $events);
		file_put_contents(ROOT .'data_files/events.dat', $events);
	}

	/**
	* Подстройка окончания
	* @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) {
    	$rus=array('й','ц','у','к','е','н','г','ш','щ','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','э','я','ч','с','м','и','т','ь','б','ю',
               'Й','Ц','У','К','Е','Н','Г','Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П','Р','О','Л','Д','Ж','Э','Я','Ч','С','М','И','Т','Ь','Б','Ю');
    	return strlen(str_replace($rus,'0',$str));
	}

	/**
	* substr для utf-8
	* @param string $string, int $start [int $lenght]
	*/
	public static function substr($string, $start, $lenght = NULL) {
		return utext(substr(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 = 100) {
		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);
	}

	/**
	* Замена <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
	          //'~\[s\](.*?)\[\/s\]~si'        => '<del>$1</del>',
	          '~\[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>',
	          //'~\[color=(.*?)\](.*?)\[\/color\]~si'   => '<span style="color:$1">$2</span>',

	          /*
	          //align
	          '~\[leftfloat\](.*?)\[\/leftfloat\]~si' => '<div style="float: left">$1</div>',
	          '~\[rightfloat\](.*?)\[\/rightfloat\]~si' => '<div style="float: right">$1</div>',
	          */
	          '~\[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=language][/code]
	          '~\[code\](.*?)\[\/code\]~si'              => '<pre><code class="no-highlight">$1</code></pre>',

	          // email with indexing prevention & @ replacement
	          '~\[email\](.*?)\[\/email\]~sei'         => "'<a rel=\"noindex\" href=\"mailto:'.str_replace('@', '[dog]','$1').'\">'.str_replace('@', '[dog]','$1').'</a>'",
	          //'~\[email=(.*?)\](.*?)\[\/email\]~sei'   => "'<a rel=\"noindex\" href=\"mailto:'.str_replace('@', '.at.','$1').'\">$2</a>'",

	          // links
	          //'~([^\[url=])http:\/\/([^\s]+)~si'      => ' <a href="http://$2">http://$2</a> ',
              '~\[url=(.*?)?\](.*?)\[\/url\]~si'      => '<a href="$1">$2</a>',
	          // images
	          #'~\[img\](.*?)\[\/img\]~si'             => '<img src="$1" alt="$1"/>',
	          #'~\[img=(.*?)x(.*?)\](.*?)\[\/img\]~si' => '<img src="$3" alt="$3" style="width: $1px; height: $2px"/>',
		);

	  	return preg_replace(array_keys($preg), array_values($preg), $markup);
	}
}
?>