first commit

This commit is contained in:
/usr/bin/nano
2017-04-15 01:34:36 +03:00
commit c715e2a604
5325 changed files with 329700 additions and 0 deletions

28
core/func/changelang.php Executable file
View File

@@ -0,0 +1,28 @@
<?php
/**
* Фукнция для смены языка на нужный
*
* @param $lang - Язык на который нужно произвести смену
* @param $url - Страница на которой нужно произвести смену
*/
function ChangeLang($lang, $url)
{
$url = _StrReplaceFirst("/?q=", "/", $url);
global $g_arrLangs, $g_config;
$lang = in_array($lang, array_keys($g_arrLangs)) ? $lang : LANG;
$siteRoot = SiteRoot();
$uri = _StrReplaceFirst($siteRoot, '', $url);
$dir = SITE_IN_DIR ? (SITE_IN_DIR . '/') : '';
$lang = $lang == DEF_LANG ? '' : ($lang . '/');
$ret = $lang || $uri ? "/{$dir}?q={$lang}{$uri}" : $dir;
$ret = empty($ret) ? '/' : $ret;
return $g_config['useModRewrite'] ?
_StrReplaceFirst("/?q=", "/", strpos($ret, '?') === false ? _StrReplaceFirst('&', '?', $ret) : $ret) :
$ret;
}
?>

113
core/func/ckeditor4.php Executable file
View File

@@ -0,0 +1,113 @@
<?php
/**
* Обработка текста перед сохранением. Действия:
*
* 1) Преобразовать все внешние img ссылки во внутренние (соответственно скопировав все изображения на сервер)
* 2) Удалить лишний мусор, который добавляет CKEditor (например при проверке грамматики).
*
* @author GYL
*/
function CKEditor4PreSave($text, $uploadImgs = true, &$uncopiedImgs = array(), $serverName = NULL)
{
global $g_config;
// когда включена проверка орфографии ckeditor добавляет в html много мусора (лишние спаны). Эта штука его убирает.
$text = preg_replace('/<span data-scayt_word="[^"]+" data-scaytid="[0-9]*">([^<]+)<\/span>/', '$1', $text);
$text = preg_replace('/<span data-scaytid="[0-9]*" data-scayt_word="[^"]+">([^<]+)<\/span>/', '$1', $text);
if (empty($serverName) && isset($_SERVER['SERVER_NAME'])) // на всякий случай преобразуем все ссылки вида http://наш_сайт/img/1.png в /img/1.png
{
$serverName = $_SERVER['SERVER_NAME'];
}
else
{
trigger_error("Invalid server name", E_USER_ERROR);
}
require_once BASEPATH . 'lib/simple_html_dom.php';
$html = str_get_html($text);
if ($html == NULL) return "";
foreach ($html->find("img") as $img)
{
$img->removeAttribute("data-cke-saved-src");
$src = $img->src;
$alt = $img->alt;
$style = $img->style;
$parsed = parse_url($src);
$params = array();
if (isset($parsed['query']))
{
foreach (explode('&', $parsed['query']) as $elem)
{
if (strpos($elem, '=') !== false)
{
$elem = explode('=', $elem);
$params[$elem[0]] = isset($elem[1]) ? $elem[1] : NULL;
}
}
}
$isLocal = empty($parsed["host"]) || (!empty($parsed["host"]) && $parsed["host"] == $serverName); // если нет имени сервера или оно равно имени нашего сервера
if ($isLocal && strpos($parsed["path"], "/upl/ckeditor_files/") === 0) // http://oursite.ru/upl/ckeditor_files/abc.jpg -> /upl/ckeditor_files/abc.jpg
{
$src = "/upl/ckeditor_files/" . basename($src);
}
else if ($isLocal && !empty($params["file"]) && strpos($parsed["path"], "/dev/ckeditor_preview/") === 0) // http://oursite.ru/dev/ckeditor_preview?file=abc.jpg -> /upl/ckeditor_files/abc.jpg
{
$src = "/upl/ckeditor_files/" . $params["file"];
}
else if ($isLocal && !empty($params["file"]) && strpos($params["path"], "dev/ckeditor_preview") === 0) // http://oursite.ru/?q=dev/ckeditor_preview?file=abc.jpg -> /upl/ckeditor_files/abc.jpg
{
$src = "/upl/ckeditor_files/" . $params["file"];
}
else if ($uploadImgs && pathinfo($src, PATHINFO_EXTENSION) == "webp" && !function_exists("imagecreatefromwebp")) // small hack
{
// do nothing
}
else if ($uploadImgs)
{
$info = @getimagesize($src);
$ext = @image_type_to_extension($info[2], false);
if (empty($ext)) $ext = @pathinfo(@basename($src), PATHINFO_EXTENSION);
if (!empty($ext))
{
$ext = strtolower($ext);
$name = md5(uniqid(mt_rand())) . "." . $ext;
$path = BASEPATH . 'upl/ckeditor_files/' . $name;
FileSys::MakeDir(BASEPATH . 'upl/ckeditor_files/');
//xmp(get_loaded_extensions());
if (copy($src, $path))
{
// Уменьшаем размер файла путем ресайза картинки
$wImg = WideImage::load($path);
$wImg->resizeDown($g_config['ckeditor4']['resize_down_width'],
$g_config['ckeditor4']['resize_down_height'])->saveToFile($path);
$src = '/upl/ckeditor_files/' . $name;
}
else
{
$uncopiedImgs[] = $src;
}
}
else
{
$uncopiedImgs[] = $src;
}
}
$img->src = $src;
}
return $html->save();
}
?>

50
core/func/debug.php Executable file
View File

@@ -0,0 +1,50 @@
<?php
/**
* Функции используемые при дебаге кода
*
* @author Zmi
*/
// Запись в стандартный лог движка
function ToLog($msg, $path = '')
{
global $g_config;
$path = empty($path) ? $g_config['logPath'] : $path;
$logger = FileLogger::Create($path);
$logger->Message($msg);
}
function Xmp($a)
{
printf("<xmp>%s</xmp>", print_r($a, true));
}
function VarDump($var)
{
$ret = '';
if (is_bool($var))
{
$ret = ($var) ? 'true' : 'false';
}
elseif (is_scalar($var))
{
$ret = htmlspecialchars($var);
}
elseif (is_null($var))
{
$ret = 'NULL';
}
else
{
ob_start();
var_dump($var);
$data = ob_get_clean();
$data = preg_replace('/=>\n\s+/', ' => ', $data);
$data = htmlspecialchars($data);
$ret = '<pre>' . $data . '</pre>';
}
return $ret;
}
?>

375
core/func/main.php Executable file
View File

@@ -0,0 +1,375 @@
<?php
/**
* Главные ф-ии
*
* @author Zmi
*/
// Параметры какие защиты отключать
define('M_HTML_FILTER_OFF', 2); // Выкл. защиту от HTML текста
define('M_XSS_FILTER_OFF', 4); // Выкл. защиту от XSS вставок
define('M_DELETE_PARAM', 'micron_not_use_this_param__98gmkhgKfdg');
// Производит замену только 1-го вхождения подстроки в строку
function _StrReplaceFirst($search, $replace, $subject)
{
$ret = $subject;
$pos = strpos($subject, $search);
if ($pos !== false)
{
$ret = substr_replace($subject, $replace, $pos, strlen($search));
}
return $ret;
}
/**
* Загрузка компонента
*
* Производит подключение файлов lang/src/tpl
*
* @global array $g_lang
* @global array $g_config
* @global string $g_arrLangs
*
* @param string $_micron_file - URI запроса т.е. подключаемый файл или строка вида file_name&par1=a&par2=b
* @param array $_micron_params - массив параметров которые необходимо создать до подключения
*
* @return int - вовзращает кол-во подключенных файлов этого компонента
*/
function IncludeCom($_micron_file, $_micron_params = array())
{
global $g_lang, $g_config, $g_arrLangs;
$_micron_file = GetQuery($_micron_file);
foreach ($_micron_params as $micron_name => $micron_value)
{
$$micron_name = $micron_value;
}
$micron_has = 0;
// Список всех файлов которые требуется полключить
$micron_files = array
(
BASEPATH . 'lang/' . DEF_LANG . "/{$_micron_file}.php",
BASEPATH . 'lang/' . LANG . "/{$_micron_file}.php",
BASEPATH . "src/{$_micron_file}.php",
BASEPATH . "tpl/{$_micron_file}.php"
);
$micron_files = array_unique($micron_files);
// Подключаем все возможные файлы компонента
foreach ($micron_files as $micron_f)
{
if (is_readable($micron_f))
{
$micron_has++;
require $micron_f;
if (isset($GLOBALS['__breakCurrentCom__']) && $GLOBALS['__breakCurrentCom__'])
{
$GLOBALS['__breakCurrentCom__'] = 0;
return $micron_has;
}
}
}
return $micron_has;
}
/**
* Фунция выхода из компонента что бы дальше файлы не подключала
*/
function ExitCom()
{
$GLOBALS['__breakCurrentCom__'] = 1;
}
/**
* Получает строку запроса к движку
*
* Так же данная функция занимается созданием параметров в $_GET если они были переданны в q и созданием константы LANG если ее еще не было
*
* @global array $g_config
* @global array $g_arrLangs - массив языков сайта
*
* @param string $q - строка запроса при ее отсутвии то что было в $_GET[q]
*
* @return string
*/
function GetQuery($q = NULL)
{
global $g_config, $g_arrLangs;
$langs = array_keys($g_arrLangs);
$defPage = $g_config['defaultComponent'];
require_once BASEPATH . 'lib/InputClean.php';
$q = is_null($q) ? (isset($_GET['q']) && !empty($_GET['q']) ? rtrim($_GET['q'], "/") : $defPage) : $q;
$q = _StrReplaceFirst('&', '?', $q);
$parse = parse_url($q);
$q = FileSys::FilenameSecurity($parse['path']);
if (isset($parse['query']))
{
foreach (explode('&', $parse['query']) as $elem)
{
if (strpos($elem, '=') !== false)
{
$elem = explode('=', $elem);
$_GET[$elem[0]] = isset($elem[1]) ? $elem[1] : NULL;
}
}
}
$parts = explode('/', $q);
$lang = isset($parts[0]) && in_array($parts[0], $langs) ? $parts[0] : DEF_LANG;
if (!defined('LANG'))
{
define('LANG', $lang);
}
if (isset($parts[0]) && in_array($parts[0], $langs))
{
$q = implode('/', array_splice($parts, 1));
}
$cleaner = new InputClean($g_config['charset']);
return empty($q) ? $defPage : $cleaner->_clean_input_data($q);
}
function _HtmlClean(&$value)
{
$value = htmlspecialchars($value);
}
// Очищает входные данные
function _Clean($value, $secureFlags)
{
if (!($secureFlags & M_XSS_FILTER_OFF)) // Если не отключена защита от XSS
{
global $g_config;
static $cleaner = NULL;
if (is_null($cleaner))
{
$cleaner = new InputClean($g_config['charset']);
}
$value = $cleaner->_clean_input_data($value);
}
if (!($secureFlags & M_HTML_FILTER_OFF)) // Если не отключена защита от HTML
{
is_array($value) ? array_walk_recursive($value, "_HtmlClean") : _HtmlClean($value);
}
return $value;
}
/**
* Возвращает юрл до корня сайта, нужна для данных (image, js, css ...)
*/
function Root($uri = '')
{
$dir = SITE_IN_DIR ? (SITE_IN_DIR . '/') : '';
return SITE_ROOT . "{$dir}{$uri}";
}
/**
* Путь до корня сайта с подставкой языка, нужна для ссылок
*/
function SiteRoot($uri = '')
{
global $g_config;
$uri = $uri == $g_config['defaultComponent'] ? '' : $uri;
$dir = SITE_IN_DIR ? (SITE_IN_DIR . '/') : '';
$lang = LANG == DEF_LANG ? '' : (LANG . '/');
$ret = $lang || $uri ? "/{$dir}?q={$lang}{$uri}" : "/{$dir}";
$ret = empty($ret) ? '/' : $ret;
$ret = $g_config['useModRewrite'] ?
_StrReplaceFirst('/?q=', '/', _StrReplaceFirst('&', '?', $ret)) :
$ret;
$ret = SITE_ROOT . substr($ret , 1);
// Заменяем начальную страницу в URL а просто корень
$ret = in_array(
$ret,
array(
SITE_ROOT . $g_config['defaultComponent'],
SITE_ROOT . '?q=' . $g_config['defaultComponent']
)
) ?
SITE_ROOT :
$ret;
return $ret;
}
// Возвращает дебаг панель располагаемую внизу страницу
function GetDebug()
{
global $g_config;
$ret = '';
// Выводить дебаг-панель только если это режим отладки и только если страница прошла через главный шаблон
if (DEBUG_MODE && $g_config['isLoadInMainTpl'])
{
ob_start();
IncludeCom('dev/debug_panel');
return ob_get_clean();
}
return $ret;
}
function _PrepareContent($c)
{
global $g_config;
require_once BASEPATH . 'lib/ExtraPacker/Config.php';
require_once BASEPATH . 'lib/ExtraPacker/ExtraPacker.php';
require_once BASEPATH . 'lib/HtmlValidate.php';
$validator = new HtmlValidate($c);
$c = $validator->Get();
$postfix = str_replace ("/", "", strtok($_SERVER["REQUEST_URI"],'?'));
$cfg = $g_config['extrapacker'];
$extraPacker = new ExtraPacker(
array('ExtraPacker_Config', 'GetPathJsFileFromUrl'),
array('ExtraPacker_Config', 'GetPathCssFileFromUrl'),
array('ExtraPacker_Config', 'GetAddrJsPackFile'),
array('ExtraPacker_Config', 'GetAddrCssPackFile'),
NULL,
NULL,
BASEPATH . 'tmp/' . $cfg['dir'] . "/js/$postfix/inf.txt",
BASEPATH . 'tmp/' . $cfg['dir'] . "/js/$postfix/js.js",
BASEPATH . 'tmp/' . $cfg['dir'] . "/css/$postfix/inf.txt",
BASEPATH . 'tmp/' . $cfg['dir'] . "/css/$postfix/css.css",
$cfg['packHtml'],
$cfg['packCss'],
$cfg['packJs'],
$cfg['arrExeptions_js'],
$cfg['arrExeptionsNotAdd_js'],
$cfg['arrExeptions_css'],
$cfg['arrExeptionsNotAdd_css'],
true,
BASEPATH . 'tmp/' . $cfg['dir'] . "/js/$postfix/trans.txt",
BASEPATH . 'tmp/' . $cfg['dir'] . "/css/$postfix/trans.txt",
$cfg['buffering'],
array('ExtraPacker_Config', 'PrepareEachFile'),
array('ExtraPacker_Config', 'PrepareAllCss'),
array('ExtraPacker_Config', 'PrepareAllJs')
);
return $extraPacker->Pack($c) . GetDebug();
}
/**
* Функиця подготовки вывода контента в браузер
*/
function PrepareContent($c)
{
global $g_config;
foreach ($g_config['prepareFunctions'] as $func)
{
$c = call_user_func($func, $c);
}
return $c;
}
/**
* Параметр из $_GET
*/
function Get($name, $def = false, $secureFlags = 0)
{
return isset($_GET[$name]) ? _Clean($_GET[$name], $secureFlags) : $def;
}
/**
* Параметр из $_POST
*/
function Post($name, $def = false, $secureFlags = 0)
{
return isset($_POST[$name]) ? _Clean($_POST[$name], $secureFlags) : $def;
}
/**
* Получение текущей строки запроса к движку (удобно юзать в action для формы если это компоннет)
*/
function GetCurUrl($_pars = '')
{
$pars = '';
$all = $_GET;
foreach (array_filter(explode('&', $_pars)) as $v)
{
if (strpos($v, '=') === false)
{
$all[$v] = NULL;
}
else
{
$t = explode('=', $v);
list($id, $val) = $t;
$all[$id] = urldecode($val);
}
}
foreach ($all as $k => $v)
{
if ($k == 'q') continue;
if ($v == M_DELETE_PARAM) continue;
$pars .= ("{$k}=" . urlencode($v) . "&");
}
$pars = substr($pars, 0, -1) ? ('&' . substr($pars, 0, -1)) : '';
return SiteRoot(GetQuery() . $pars);
}
/**
* Переопределяем функцию автозагрузки классов
*/
function _AutoLoadLib($className)
{
if (is_readable(BASEPATH . "lib/{$className}.php"))
{
require_once BASEPATH . "lib/{$className}.php";
}
if (is_readable(BASEPATH . "model/{$className}.php"))
{
require_once BASEPATH . "model/{$className}.php";
}
}
spl_autoload_register('_AutoLoadLib');
/**
* Функция установки title/desk/kw если страница не главная и не было установлено значений до этого
*/
function AutoTDKW($content)
{
global $g_lang, $g_config;
if ($g_config['autoGetTitle']) // Только если это не главная, ибо там то по любому выставлено
{
if (L('m_title') === L('m_defTitle'))
{
preg_match('~<h1(.*?)>(.*?)</h1>~is', $content, $m);
if (isset($m[2]))
{
$g_lang['m_title'] = strip_tags($m[2]) . L('m_titlePostfix');
}
}
}
}
// Получить параметр из языкового массива
function L($name)
{
global $g_lang;
if (!isset($g_lang[$name]))
{
trigger_error("Unknown lang ($name) variable", E_USER_ERROR);
}
return $g_lang[$name];
}
?>

26
core/func/messages.php Executable file
View File

@@ -0,0 +1,26 @@
<?php
/**
* Стилистически оформленные сообщения
*
* @author Zmi
*/
function Msg($message, $css = 'msg')
{
ob_start();
IncludeCom('dev/msg', array('message' => $message, 'css' => $css));
return ob_get_clean();
}
function MsgOk($message)
{
return Msg($message, 'msg-ok');
}
function MsgErr($message)
{
return Msg($message, 'msg-err');
}
?>

View File

@@ -0,0 +1,22 @@
<?php
function __FilesCmpByDate($f1, $f2)
{
$m1 = filemtime($f1);
$m2 = filemtime($f2);
if ($m1 == $m2)
{
return 0;
}
return ($m1 < $m2) ? 1 : -1;
}
function OrderFilesByDate($list)
{
if (count($list))
{
usort($list, "__FilesCmpByDate");
}
return $list;
}
?>

35
core/func/page_editor.php Executable file
View File

@@ -0,0 +1,35 @@
<?php
/**
* Рекурсивно получить все файлы и папки
*/
function PageEditorGetListFilesDirs($folder, &$allFiles)
{
$fp = is_readable($folder) ? opendir($folder) : false;
if ($fp)
{
$file = readdir($fp);
while ($file !== false)
{
$path = $folder . "/" . $file;
if (is_file($path))
{
if (substr($path, -4) == ".php")
{
$allFiles[] = $folder . "/" . $file;
}
}
elseif ($file != "." && $file != ".." && is_dir($path))
{
$allFiles[] = $folder . "/" . $file . "/";
PageEditorGetListFilesDirs($path, $allFiles);
}
$file = readdir($fp);
}
closedir($fp);
}
}
?>

30
core/func/validation.php Executable file
View File

@@ -0,0 +1,30 @@
<?php
/**
* Функции для валидации данных
*
* @author Zmi
*/
function IsValidEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
function PhoneFilter($phone)
{
return preg_replace("~[^\+\*|^0-9]~is", '', $phone);
}
function IsValidPhone($phone)
{
$phone = PhoneFilter($phone);
return strlen($phone) > 5;
}
function IsValidUrl($url)
{
return filter_var($url, FILTER_VALIDATE_URL) !== false;
}
?>