Вход Регистрация
Файл: mc-2.7.0/modules/main/helpers/main.php
Строк: 427
<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <support@mobilecms.pro>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */
defined('IN_SYSTEM') or die('<b>Access error</b>');

class 
main {

    
/**
     * Конфигурация для модулей
     * @param string $module
     */
    
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` = '" mysqli_real_escape_string($db->db_linkstripslashes($value)) . "'n";
            
$sql .= "WHERE `key` = '" mysqli_real_escape_string($db->db_link$key) . "' AND module = '" mysqli_real_escape_string($db->db_link$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' || $f == '.gitignore' || $f == '.htaccess' || $f == '.svn')
                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
     * @param string $text
     */
    
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($code0$length);
        } else {
            return 
$code;
        }
    }

    
/**
     * Транслитерация латиницы
     * @param string $str
     */
    
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 get_filesize($file_path) {
        
$headers get_headers($file_path1);
        if ((!
array_key_exists('Content-Length'$headers))) {
            return 
false;
        }
        return 
$headers['Content-Length'];
    }

    
/**
     * Транслитерация кирилицы
     */
    
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;
    }

    
/**
     * Добавление новых правил в роутинг
     * @param string $block_name
     * @param string $new_rules
     */
    
public static function add_route_rules($block_name$new_rules) {
        
file_put_contents(ROOT 'data_files/route_rules/' $block_name '.rules'$new_rules);
    }

    
/**
     * Удаление правил роутинга
     * @param string $block_name
     */
    
public static function delete_route_rules($block_name) {
        
unlink(ROOT 'data_files/route_rules/' $block_name '.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;
    }

    
/**
     * Выполнение событий
     * @param string $type
     */
    
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);
                }
            }
        }
    }

    
/**
     * Добавление события
     * @param string $module
     * @param string $place
     */
    
public static function add_event($module$place) {
        
$filename ROOT 'data_files/events/' $module '.' $place '.event';
        
file_put_contents($filename'');
        
chmod($filename0777);
    }

    
/**
     * Удаление события
     * @param string $module
     */
    
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 == || $num_x == || $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 integer $limit
     */
    
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);
    }

    
/**
     * Рекурсивное удаление папки
     * @param string $arg
     */
    
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)
            
$num 0;

        if (
$num >= 1000000000000) {
            
$num round($num 10995116277761);
            
$unit 'Tb';
        } elseif (
$num >= 1000000000) {
            
$num round($num 10737418241);
            
$unit 'Gb';
        } elseif (
$num >= 1000000) {
            
$num round($num 10485761);
            
$unit 'Mb';
        } elseif (
$num >= 1000) {
            
$num round($num 10241);
            
$unit 'Kb';
        } else {
            
$unit 'b';
            return 
number_format($num) . ' ' $unit;
        }

        return 
number_format($num1) . ' ' $unit;
    }

    
/**
     * Изменение размера изображений
     *
     * Пропорциональное изменение размера производится в случае,
     * если отсутствует один из параметров высоты или ширины изображения
     *
     * @param string $path_to_file путь к существующему изображению
     * @param string $path_to_save путь для сохранения
     * @param int $width ширина изображения
     * @param int $height высота изображения
     * @param int $quality качество изображения в процентах
     * @return boolean
     */
    
public static function image_resize($path_to_file$path_to_save$width$height 0$quality 100) {
        
// Проверка наличия изображения на сервере
        
if (!file_exists($path_to_file))
            return 
FALSE;

        
// Получение информации о изображении
        
$info getimagesize($path_to_file);

        
// Формат изображения
        
$format strtolower(substr($info['mime'], strpos($info['mime'], '/') + 1));

        
// Выбор функции для изображения
        
$picfunc 'imagecreatefrom' $format;

        
// Старая ширина изображения
        
$old_width $info[0];

        
// Старая высота изображения
        
$old_height $info[1];

        
// Вычисление горизонтального соотношения
        
$horizontal $width $old_width;

        
// Вычисление вертикального соотношения
        
$vertical $height $old_height;

        
// Пропорциональное вычисление параметров
        
if ($height == 0) {
            
$vertical $horizontal;
            
$height $vertical $old_height;
        } elseif (
$width == 0) {
            
$horizontal $vertical;
            
$width $horizontal $old_width;
        }

        
// Формирование размера изображения
        
$ratio min($horizontal$vertical);

        
// Необходимость пропорционального изменения
        
if ($horizontal == $ratio) {
            
$use_horizontal TRUE;
        } else {
            
$use_horizontal FALSE;
        }

        
$new_width $use_horizontal $width floor($old_width $ratio);
        
$new_height = !$use_horizontal $height floor($old_height $ratio);
        
$new_left $use_horizontal floor(($width $new_width) / 2);
        
$new_top = !$use_horizontal floor(($height $new_height) / 2);

        
$pic_to_src $picfunc($path_to_file);

        
// Создание изображения в памяти
        
$pic_to_save imagecreatetruecolor($width$height);

        
// Заполнение цветом
        
$white imagecolorallocate($pic_to_save0xFF0xFF0xFF);
        
imagefill($pic_to_save00$white);

        
// Нанесение старого изображения на новое
        
imagecopyresampled($pic_to_save$pic_to_src$new_left$new_top00$new_width$new_height$old_width$old_height);

        
// Определение формата изображения на выходе
        
$ext array_pop(explode('.'$path_to_save));

        switch (
$ext) {
            case 
'jpg':
            case 
'jpeg':
                
imagejpeg($pic_to_save$path_to_save$quality);
                break;

            case 
'gif':
                
imagegif($pic_to_save$path_to_save);
                break;

            case 
'png':
                
imagepng($pic_to_save$path_to_save);
                break;

            default:
                return 
FALSE;
                break;
        }

        
// Очистка памяти
        
imagedestroy($pic_to_src);
        
imagedestroy($pic_to_save);

        return 
TRUE;
    }

    
/**
     * Получение названия месяца на русском
     */
    
public static function get_month_name($month_num$ucfirst false$type 1) {
        
$months = array(
            
=> array('январь''января'),
            
=> array('февраль''февраля'),
            
=> array('март''марта'),
            
=> array('апрель''апреля'),
            
=> array('май''мая'),
            
=> array('июнь''июня'),
            
=> array('июль''июля'),
            
=> array('август''августа'),
            
=> 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 />
     * @return string
     */
    
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;
    }

    
/**
     * Проверка данных регуляркой
     * @param string $type
     */
    
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}$""xxx@yyy.zz"),
            
"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]/si' => "highlight('$1')",
            
# цитаты
            
'/[q](.*?)[/q]/si' => '<div class="q">$1</div>',
            
# e-mail
            
'/[email](.*?)[/email]/si' => "'<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]/si' => "<img src="$1" alt="" style="max-width150px;" />",
        );

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

    
/**
     * Простая функция для отправки E-mail
     *
     * @param string $from адрес отправителя
     * @param string $to адрес получателя
     * @param string $title тема письма
     * @param string $message сообщение
     * @return mixed
     */
    
public function send_mail($from$to$title$message) {
        
mail($to'=?utf-8?B?' base64_encode($title) . '?='$message"From: $from <$from>nContent-Type: text; charset=utf-8") or die('Не удалось отправить письмо на E-mail.');
    }

    
/**
     * Форматирование времени для вывода
     *
     * @param int $time
     * @return string
     */
    
public function display_time($time NULL) {
        if (!
$time)
            
$time time();

        
// Получение даты
        
$data date('d.m.Y'$time);

        
// Получение времени
        
$time date('H:i'$time);

        
// Сегодня
        
if ($data == date('d.m.Y'))
            return 
'Сегодня в ' $time;

        
// Вчера
        
if ($data == date('d.m.Y'time() - 3600 24))
            return 
'Вчера в ' $time;

        return 
$data ' в ' $time;
    }

}

?>
Онлайн: 1
Реклама