rendered paste body<?
class Fw{
private static $fatalErNo;
private static $cCfg, $uCfg;
private static $sessionTypes, $sessionTypesDelInEnd;
private static $logState, $logData, $logTmpl;
private static $sMsgData, $sMsgTmpl;
private static $langData;
private static $tmplData;
private static $page, $task, $ajax;
# Инициализация
public function init(){
# названия всех файлов в маленьком регистре
# все классы, объекты классов и константы с заглавной буквы (!) кроме объекта базы данных: $db
# все core и site классы - статические
# все адреса без: "http://", "www.", начальных и последних: "/", "\"
# в PHP использовать пользователський часовой пояс. в БД - только в "UTC"
# группы пользователей: 0 - гость, 50 - зарегестрированный пользователь, 500 - администратор, 1000 - супер администратор
# константы:
# DS - разделитель папок (вместо слешей в не web-адресах)
#
# SiteDir - имя папки сайта
#
# aRootPath - абсолютный корневой адрес CMF
# aSitePath - абсолютный адрес папки сайта
# aRootUrl - абсолютный Web-адрес CMF
# aSiteUrl - абсолютный Web-адрес сайта
#
# aCorePath - абсолютный адрес корневой папки "core"
#
# aRootLibsPath - абсолютный адрес корневой папки "libraries"
# aSiteLibsPath - абсолютный Web-адрес корневой папки "libraries"
#
# aRootLangPath - абсолютный адрес корневой папки "languages"
# aSiteLangPath - абсолютный адрес папки сайта "languages"
#
# aRootComsPath - абсолютный адрес корневой папки "components"
# aRootComsUrl - абсолютный web-адрес корневой папки "components"
# aSiteComsPath - абсолютный адрес папки сайта "components"
# aSiteComsUrl - абсолютный web-адрес папки сайта "components"
#
# aRootTmplsPath - абсолютный адрес корневой папки шаблонов
# aRootTmplsUrl - абсолютный web-адрес корневой папки шаблонов
# aSiteTmplsPath - абсолютный адрес папки сайта шаблонов
# aSiteTmplsUrl - абсолютный web-адрес папки сайта шаблонов
#
# TemplDir - имя папки шаблона сайта
# aTmplPath - абсолютный адрес папки шаблона сайта
# aTmplUrl - абсолютный web-адрес папки шаблона сайта
# rTmplPath - относительный адрес папки шаблона сайта
# rTmplUrl - относительный web-адрес папки шаблона сайта
#
# aRootSysTmplPath - абсолютный адрес корневой папки системного шаблона
# aRootSysTmplUrl - абсолютный web-адрес корневой папки системного шаблона
# rRootSysTmplPath - относительный адрес корневой папки системного шаблона
# rRootSysTmplUrl - относительный web-адрес корневой папки системного шаблона
# aSiteSysTmplPath - абсолютный адрес папки сайта системного шаблона
# aSiteSysTmplUrl - абсолютный web-адрес папки сайта системного шаблона
# rSiteSysTmplPath - относительный адрес папки сайта системного шаблона
# rSiteSysTmplUrl - относительный web-адрес папки сайта системного шаблона
#
# ----------------------------------------------------------------------------
#
# uLang - текущая локаль в верхнем регистре
# lLang - текущая локаль в нижнем регистре
# uDefLang - локаль по умолчанию в верхнем регистре
# lDefLang - локаль по умолчанию в нижнем регистре
# TimeZone - текущий часовой пояс в формате названия временной зоны
# TimeZoneH - текущий часовой пояс в количестве смещения часов от "UTC"
# dPrefix - доменные префикс
# ----- Инициализация переменных ------------------------------------------------------------------------------------------------------------------
# номера фатальных ошибок
self::$fatalErNo = array(
'scfg.site'=>2,
'head.core'=>3,
'msg.core'=>4,
'pathway.core'=>5,
'ctitle.core'=>6,
'content.core'=>7,
'run.site'=>8,
'load.site'=>9,
'tmpl.site'=>10,
'db.lib'=>11
);
# сессия
self::$sessionTypes = array();
self::$sessionTypesDelInEnd = array();
# лог
$_logfm = 'fw.core@init';
self::$logState = 1;
self::$logTmpl = array();
if (!is_array(self::sessionGet('#logData'))){
self::$logData = array();
}else{
self::$logData = self::sessionGet('#logData');
self::sessionDel('#logData');
}
# системные сообщения
self::$sMsgTmpl = array();
if (!is_array(self::sessionGet('#smsgData'))){
self::$sMsgData = array();
}else{
self::$sMsgData = self::sessionGet('#smsgData');
self::sessionDel('#smsgData');
}
# локаль
self::$langData = array();
# шаблоны
self::$tmplData = array();
# ----- Глобальные настройки, Настройки сайта, Константы папок ------------------------------------------------------------------------------------------------------------------
### [CONST] абсолютный корневой адрес CMF
# корень, папка:
$aRootPath = explode(DS, dirname(__FILE__));
unset($aRootPath[count($aRootPath)-1]);
define('aRootPath', implode(DS, $aRootPath));
# сайт, папка:
# объявляется в index-файле
#<== абсолютный корневой адрес CMF
### [CONST] имя папки сайта
$SiteDir = explode(DS, aSitePath);
$SiteDir = $SiteDir[count($SiteDir)-1];
define('SiteDir', $SiteDir);
#<== имя папки сайта
### настройки сайта
include_once aSitePath.DS.'cfg.php';
if (!class_exists('sCfg')) self::fatalEr('scfg.site');
$sCfg = self::get('sCfg');
#<== настройки сайта
### [CONST] абсолютный web-адрес
# корень, web:
$sCfg->rootUrl = 'http://'.self::delInStr($sCfg->rootUrl, 'lrtrim,http,www,rsl');
define('aRootUrl', $sCfg->rootUrl);
# cайт, web:
define('aSiteUrl', aRootUrl.str_replace('\\', '/', str_replace(aRootPath, '', aSitePath)));
#<== абсолютный web-адрес
### [CONST] абсолютный адрес папки "core"
# корень, папка:
define('aCorePath', aRootPath.DS.'core');
#<== абсолютный адрес папки "core"
### [CONST] абсолютный адрес корневой папки "libraries"
# корень, папка:
define('aRootLibsPath', aRootPath.DS.'libraries');
# сайт, папка:
define('aSiteLibsPath', aSitePath.DS.'libraries');
#<== абсолютный адрес корневой папки "libraries"
### [CONST] абсолютный адрес папки "languages"
# корень, папка:
define('aRootLangPath', aRootPath.DS.'languages');
# сайт, папка:
define('aSiteLangPath', aSitePath.DS.'languages');
#<== абсолютный адрес папки "languages"
### [CONST] абсолютный адрес папки "components"
# корень, папка:
define('aRootComsPath', aRootPath.DS.'components');
# корень, web:
define('aRootComsUrl', aRootUrl.'/components');
# сайт, папка:
define('aSiteComsPath', aSitePath.DS.'components');
# сайт, web:
define('aSiteComsUrl', aSiteUrl.'/components');
#<== абсолютный адрес папки "components"
### [CONST] абсолютный адрес папки шаблонов
# корень, папка:
define('aRootTmplsPath', aRootPath.DS.'templates');
# корень, web:
define('aRootTmplsUrl', aRootUrl.'/templates');
# сайт, папка:
define('aSiteTmplsPath', aSitePath.DS.'templates');
# сайт, web:
define('aSiteTmplsUrl', aSiteUrl.'/templates');
#<== абсолютный адрес папки шаблонов сайта
### [CONST] адрес папки шаблона сайта
# сайт, папка, абсолютный:
$tmplDir = self::sCfgGet('tmpl', '', 'default');
if (!file_exists(aSiteTmplsPath.DS.$tmplDir)) self::fatalEr('TemplDir');
define('aTmplPath', aSiteTmplsPath.DS.$tmplDir);
# сайт, web, абсолютный:
define('aTmplUrl', aSiteTmplsUrl.'/'.$tmplDir);
# сайт, папка, относительный:
define('rTmplPath', substr(str_replace(aSitePath, '', aTmplPath), 1));
# сайт, web, относительный:
define('rTmplUrl', substr(str_replace(aSiteUrl, '', aTmplUrl), 1));
#<== адрес папки шаблона сайта
### [CONST] имя папки шаблона сайта
define('TmplDir', $tmplDir);
#<== имя папки шаблона сайта
### [CONST] адрес папки системного шаблона
# корень, папка, абсолютный:
define('aRootSysTmplPath', aRootTmplsPath.DS.'_system');
# корень, web, абсолютный:
define('aRootSysTmplUrl', aRootTmplsUrl.'/_system');
# корень, папка, относительный:
define('rRootSysTmplPath', substr(str_replace(aRootPath, '', aRootSysTmplPath), 1));
# корень, web, относительный:
define('rRootSysTmplUrl', substr(str_replace(aRootUrl, '', aTmplUrl), 1));
# сайт, папка, абсолютный:
define('aSiteSysTmplPath', aSiteTmplsPath.DS.'_system');
# сайт, web, абсолютный:
define('aSiteSysTmplUrl', aSiteTmplsUrl.'/_system');
# сайт, папка, относительный:
define('rSiteSysTmplPath', substr(str_replace(aSitePath, '', aSiteSysTmplPath), 1));
# сайт, web, относительный:
define('rSiteSysTmplUrl', substr(str_replace(aSiteUrl, '', aTmplUrl), 1));
#<== адрес папки системного шаблона
### [CONST] доменные префикс
define('dPrefix', str_replace('.', '_', self::delInStr(aSiteUrl, 'http,www,lrsl')).'_');
#<== доменные префикс
# ----- Настройки ------------------------------------------------------------------------------------------------------------------
### отключение, нафиг-нафиг, магии волшебных-кавычек для GET, POST, данных
# так же в .htaccess (должен быть в папке с каждым index-файлом сайта):
# php_value magic_quotes_gpc off
# php_value precision 45
ini_set('magic_quotes_runtime', 0);
ini_set('magic_quotes_sybase', 0);
#<== отключение, нафиг-нафиг, магии волшебных-кавычек для GET, POST, данных
### лог
self::$logState = self::sCfgGet('logState', '', 1);
#<== лог
### cCfg настройки (дублируется в сессию и куку)
self::get('sCfg');
#<== cCfg настройки
### uCfg настройки (пользовательские. дублируется в сессию и, если незащищенная авторизация, в куку)
self::get('uCfg');
//echo print_r(self::$user, 1);
//unset($_SESSION['user']);
#<== uCfg настройки
// ?? удалить
/*self::$user->id = 2;
self::$user->group = 500;
self::$user->login = 'proxy';
self::$user->pass = 'qwe';*/
//self::$user->firstEnter = 1;
//<== удалить
### локаль
# если не указанно в: Cookie, GET, POST, sCfg, то "en"
$defLang = self::sCfgGet('lang', '', 'en');
$lang = self::getVar('lang', 'get,post', self::cCfgGet('lang'));
if ($lang == '') $lang = $defLang;
define('uLang', strtoupper($lang));
define('lLang', strtolower($lang));
define('uDefLang', strtoupper($defLang));
define('lDefLang', strtolower($defLang));
self::cCfgSet('lang', '', lLang);
#<== локаль
### часовой пояс
# если не указанно в: Cookie, sCfg, то "UTC"
$timeZone = self::cCfgGet('timeZone', '', self::sCfgGet('timeZone', '', 'UTC'));
date_default_timezone_set($timeZone);
define('TimeZone', $timeZone);
define('TimeZoneH', date('P'));
self::cCfgSet('TimeZone', '', TimeZone);
self::cCfgSet('TimeZoneH', '', TimeZoneH);
#<== часовой пояс
### загрузка глобального перевода
self::loadLang($_logfm, 'root@global');
#<== загрузка глобального перевода
### page, task, ajax
self::$page = Fw::getVar('page', 'get,post');
self::$task = Fw::getVar('task', 'get,post');
self::$ajax = Fw::getVar('ajax', 'get,post');
### page, task, ajax
# ----- Библиотеки (сore) ------------------------------------------------------------------------------------------------------------------
### html head (title, favicon, css files, css code, js files, js code)
self::loadCore($_logfm, 'head.php@nolang', 'Head', '', self::$fatalErNo['head.core']);
#<== html head
### сообщения (для всех)
self::loadCore($_logfm, 'msg.php@nolang', 'Msg', '', self::$fatalErNo['msg.core']);
#<== сообщения
### путь по сайту
self::loadCore($_logfm, 'pathway.php@nolang', 'Pathway', '', self::$fatalErNo['pathway.core']);
#<== путь по сайту
### заголовок контента
self::loadCore($_logfm, 'ctitle.php@nolang', 'cTitle', '', self::$fatalErNo['ctitle.core']);
#<== заголовок контента
### компоненты
self::loadCore($_logfm, 'com.php@nolang', 'Com', '', self::$fatalErNo['com.core']);
#<== компоненты
### шаблоны
self::loadCore($_logfm, 'tmpl.php@nolang', 'Tmpl', '', self::$fatalErNo['tmpl.core']);
#<== шаблоны
# --- Библиотеки (site, lib) ------------------------------------------------------------------------------------------------------------------
### выполнение действией
self::loadSite($_logfm, 'run.php@nolang', 'Run', '', self::$fatalErNo['run.site']);
#<== выполнение действией
### загрузка и генерация компонентов
self::loadSite($_logfm, 'load.php@nolang', 'load', '', self::$fatalErNo['load.site']);
#<== загрузка и генерация компонентов
### база данных
self::loadLib($_logfm, 'root', 'db_mysql.php@nolang', 'Db_MySQL@db', array($_logfm, self::sCfgGet('db')), self::$fatalErNo['db.lib']);
#<== база данных
}
# Системные
public function fatalEr($type='', $erNo=NULL){
# фатальная ошибка, вывод сообщения, выход
if ($type != ''){
if ($erNo === NULL){
$erNo = self::$fatalErNo[$type];
if ($erNo == '') $erNo = -1;
}
echo '<span style="font-family: Arial,Tahoma;font-size: 11px;color:#foo;">'.$msg.'</span>';
}
self::sessionDelInEnd();
exit;
}
public function redirect($url=''){
if ($url == '') return false;
$url = 'http://'.self::delInStr($url, 'lrtrim,http,www,rsl');
header('Location: '.$url);
exit;
}
# Настройки
private function _cfgGet($cfgType='', $type1='', $type2='', $defData=''){
$data = '';
if ($cfgType != ''){
$cfg = Fw::get($cfgType);
if (is_object($cfg)){
$data = $cfg->$type1;
if ($data && $type2 !== ''){
if (!is_array($data)) $data = NULL;
else $data = $data[$type2];
}
}
}
if ($data === '' || $data === NULL) $data = $defData;
return $data;
}
private function _cfgSet($cfgType='', $type1='', $type2='', $data=''){
if ($cfgType != ''){
$cfg = Fw::get($cfgType);
if (!is_object($cfg)) $cfg = (object)array();
$param = $cfg->$type1;
if ($type2 !== ''){
if (is_array($param)) $param[$type2] = $data;
elseif(is_object($param)) $param->$type2 = $data;
else $param = array($type2 => $data);
}else{
$param = $data;
}
$cfg->$type1 = $param;
if ($cfgType == 'cCfg' || $cfgType == 'uCfg') self::set($cfgType, $cfg);
}
}
public function sCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('sCfg', $type1, $type2, $defData);
}
public function cCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('сCfg', $type1, $type2, $defData);
}
public function uCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('uCfg', $type1, $type2, $defData);
}
public function cCfgSet($type1='', $type2='', $data=''){
return self::_cfgSet('cCfg', $type1, $type2, $data);
}
public function uCfgSet($type1='', $type2='', $data=''){
return self::_cfgSet('uCfg', $type1, $type2, $data);
}
public function uCfgReset(){
self::set('uCfg', array('id'=>0, 'group'=>0, 'email'=>'', 'login'=>'', 'pass'=>''));
}
# Геттеры, Сеттеры
public function get($type='', $data=NULL){
switch ($type){
case 'sCfg':
return new sCfg();
break;
case 'cCfg':
if (!is_object(self::$cCfg)){
self::$cCfg = $_SESSION['cCfg'];
if (!is_object(self::$cCfg)){
self::$cCfg = json_decode(self::cookieGet('cCfg'));
if (!is_object(self::$cCfg)) self::$cCfg = (object)array();
}
}
return self::$cCfg;
break;
case 'uCfg':
if (!is_object(self::$uCfg)){
self::$uCfg = $_SESSION['cCfg'];
if (!is_object(self::$uCfg)){
self::$uCfg = json_decode(self::cookieGet('cCfg'));
if (!is_object(self::$uCfg)) self::uCfgReset();
}
}
return self::$uCfg;
break;
case 'page':
if (self::$page == '') self::$page = self::sCfgGet('defPage', 'mainpage', 'mainpage');
return self::$page;
break;
case 'task':
return self::$task;
break;
case 'ajax':
return self::$ajax;
break;
case 'defPage':
if ($data == '') return '';
return self::sCfgGet('defPage', $data, 'mainpage');
break;
default:
return false;
}
}
public function set($type='', $data=NULL){
switch ($type){
case 'cCfg':
if ($data === NULL) $data = self::$cCfg;
self::$cCfg = is_object($data)?$data:(is_array($data)?(object)$data:(object)(array)$data);
self::sessionSet('#cCfg', self::$cCfg);
self::cookieSetSc('cCfg', json_encode(self::$cCfg), time()+315360000);
break;
case 'uCfg':
if ($data === NULL) $data = self::$uCfg;
self::$uCfg = is_object($data)?$data:(is_array($data)?(object)$data:(object)(array)$data);
self::sessionSet('#uCfg', self::$uCfg);
self::cookieSetSc('uCfg', json_encode(self::$uCfg), time()+315360000);
break;
case 'page':
self::$page = $data;
break;
case 'task':
self::$task = $data;
break;
case 'ajax':
self::$ajax = $data;
break;
default:
return false;
}
return true;
}
public function getVar($varName='', $type='', $def=NULL){
# получение значенией параметров запроса: GET, POST
$val = '';
if ($varName && $type){
$type = explode(',', strtolower($type));
for($i=0, $e=count($type); $i<$e; $i++){
switch ($type[$i]){
case 'cookie':
$val = self::getCookie($varName);
break;
case 'get':
$val = $_GET[$varName];
break;
case 'post':
$val = $_POST[$varName];
break;
}
if ($val != '') break;
}
}
if ($val == '' && $def !== NULL) $val = $def;
return $val;
}
# Шифрование
public function code($level=0, $string='', $salt=''){
if ($string == '') return;
if (!$level) $hash = md5($salt.md5($string.$salt));
else $hash = md5($salt.$hash1);
return $hash;
}
public function decode($string='', $salt=''){
}
# Проверка прав доступа
public function car($group='', $rType='com', $rData='403'){
if ($group == '') return false;
if (self::uCfgGet('group') < $group) $result = false;
$result = true;
if ($rType != ''){
switch ($rType){
case 'com':
Render::restart($rData);
break;
case 'url':
self::redirect($rData);
break;
}
}
}
public function carUser($rType='com', $rData='403'){
self::car(100, $rType, $rData);
}
public function carAdmin($rType='com', $rData='403'){
self::car(500, $rType, $rData);
}
public function carSAdmin($rType='com', $rData='403'){
self::car(1000, $rType, $rData);
}
# Сессия
public function sessionSet($type='', $data='', $addToDelInEnd=0){
$type = trim($type);
if ($type == '') return false;
//$type = str_replace('#', dPrefix, $type);
if ($addToDelInEnd) self::sessionAddToDelInEnd($type);
self::$sessionTypes[$type] = 1;
$_SESSION[$type] = $data;
}
public function sessionAddToDelInEnd($type=''){
$type = trim($type);
self::$sessionTypesDelInEnd[$type] = 1;
}
public function sessionGet($type='', $def=NULL){
$type = trim($type);
if ($type == '') return false;
//$type = str_replace('#', dPrefix, $type);
$val = $_SESSION[$type];
if ($val == '') $val = $def;
return $val;
}
public function sessionDel($type=''){
unset($_SESSION[trim($type)]);
}
public function sessionDelAll(){
foreach(self::$sessionTypes as $key => $val) unset($_SESSION[$key]);
}
public function sessionDelInEnd(){
foreach(self::$sessionTypesDelInEnd as $key => $val) unset($_SESSION[$key]);
}
# Куки
public function cookieGet($name=NULL, $def=NULL){
if ($name === NULL) return false;
$val = $_COOKIE[dPrefix.$name];
if ($val == '' && $def !== NULL) $val = $def;
return $val;
}
public function cookieSet($name=NULL, $value=NULL, $expire=0, $path=NULL, $domain=NULL, $secure=false, $httponly=false){
if ($name === NULL) return false;
if ($path === NULL) $path = '/';
setCookie(dPrefix.$name, $value, $expire, $path, $domain, $secure, $httponly);
return true;
}
public function cookieSetSc($name=NULL, $value=NULL, $expire=0, $path=NULL, $domain=NULL, $secure=false, $httponly=false){
if (self::uCfgGet('sconnect') || $name === NULL) return false;
return self::cookieSet($name, $value, $expire, $path, $domain, $secure, $httponly);
}
# Лог
public function formatLogVar(&$logAll='', $logAdd=''){
if ($logAll === NULL) return false;
if ($logAll == '' && $logAdd == '') return false;
$logAll = preg_replace('/^@*(.+)@*$/', '$1', $logAll);
$logAdd = preg_replace('/^@*(.+)@*$/', '$1', $logAdd);
if ($logAll == '' && $logAdd != '') $logAll = $logAdd;
$logs = array($logAll, $logAdd);
if ($logAll == $logAdd) $logs[1] = '';
$logAll = '';
for($i=0; $i<2; $i++){
if ($logs[$i] == '') continue;
if ($logAll != '') $logAll .= '►';
$logAll .= str_replace('@', '::', $logs[$i]);
}
if ($logAll == '') $logAll = $logAdd;
}
public function logOff(){
self::$logState = 0;
}
public function logOn(){
self::$logState = 1;
}
public function logAdd($_logfm='', $type='', $msg=''){
//self::formatLogVar($_logfm, 'fw.core@logAdd');
if ($_logfm === NULL) return false;
self::getTextByArray($msg);
$logShowGroup = self::sCfgGet('logShowGroup', '', 500);
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
if (trim($msg) == '') return false;
if ($_logfm != '') $msg = '[<b>'.$_logfm.'</b>] '.$msg;
switch ($type){
case 'er':
case 'error':
$type = 'er';
break;
case 'wr':
case 'warn':
case 'warning':
$type = 'wr';
break;
case 'ok':
$type = 'ok';
break;
case 'i':
case 'inf':
case 'info':
default:
$type = 'inf';
break;
}
self::$logData[] = array($type, $msg);
self::sessionSet('#logData', self::$logData, 1);
return true;
}
private function _logGetItems($type='html'){
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
if ($type == 'array'){
return self::$logData;
}else{
$html = '';
for($i=0, $e=count(self::$logData); $i<$e; $i++){
if (!$i){
self::$logTmpl['item'] = self::getFileContent($_logfm, aRootSysTmplPath.DS.'log.item.core.php');
if (self::$logTmpl['item'] == '') self::$logTmpl['item'] = '<div class="log_%class">%item</div>';
}
self::$logData[$i][1] = str_replace('\\', '#sl', self::$logData[$i][1]);
$item = preg_replace(array('/%class/i', '/%item/i', '/#sl/'), array(self::$logData[$i][0], self::$logData[$i][1], '\\'), self::$logTmpl['item']);
if (trim($item) != '') $html .= $item."\n";
}
return $html;
}
}
public function logGetItemsArray(){
return self::_logGetItems('array');
}
public function logGetItemsHtml(){
return self::_logGetItems('html');
}
public function logGetFullHtml($returnWithoutItems=0){
if (!$returnWithoutItems && !self::logExists()) return '';
$html = self::getFileContent($_logfm, aRootSysTmplPath.DS.'log.wrap.core.php');
if ($html == '') $html = '<div id="log">'.self::logGetItems().'</div>';
return "\n\n".$html."\n\n";
}
public function logExists(){
if (count(self::$logData)) return true;
return false;
}
public function logEchoo($echoWithoutItems=0){
$logShowGroup = self::sCfgGet('logShowGroup', '', 500);
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
echo self::logGetFullHtml($echoWithoutItems);
}
# Системные сообщения
public function sMsgAdd($_logfm='', $msg=''){
self::formatLogVar($_logfm, 'fw.core@sMsgAdd');
self::getTextByArray($msg);
if (is_string($msg) && trim($msg) == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$msg'));
return false;
}
self::$sMsgData[] = $msg;
self::sessionSet('#smsgData', self::$sMsgData, 1);
return true;
}
private function _sMsgGetItems($type='html'){
if ($type == 'array'){
return self::$sMsgData;
}else{
$html = '';
for($i=0, $e=count(self::$sMsgData); $i<$e; $i++){
if (!$i){
self::$sMsgTmpl['item'] = self::getFileContent($_logfm, aRootSysTmplPath.DS.'smsg.item.core.php');
if (self::$sMsgTmpl['item'] == '') self::$sMsgTmpl['item'] = '<div class="smsg_item">%item</div>';
}
$item = str_replace('%item', self::$sMsgData[$i], self::$sMsgTmpl['item']);
if (trim($item) != '') $html .= $item."\n";
}
return $html;
}
}
public function sMsgGetItemsArray(){
return self::_sMsgGetItems('array');
}
public function sMsgGetItemsHtml(){
return self::_sMsgGetItems('html');
}
public function sMsgGetFullHtml($returnWithoutItems=0){
if (!$returnWithoutItems && !self::sMsgExists()) return '';
$html = self::getFileContent($_logfm, aRootSysTmplPath.DS.'smsg.wrap.core.php');
if ($html == '') $html = '<div id="smsg">'.self::sMsgGetItemsHtml().'</div>';
return "\n\n".$html."\n\n";
}
public function sMsgExists(){
if (count(self::sMsgGetItemsArray())) return true;
return false;
}
public function sMsgEchoo($echoWithoutItems=0){
echo self::sMsgGetFullHtml($echoWithoutItems);
}
# Подключение библиотек
public function load($_logfm='', $type='', $path='', $class='', $classCfg='', $fatalEr=0){
# загрузка библиотеки, объявление класса
self::formatLogVar($_logfm, 'fw.core@load');
# адрес библиотеки, языковой файл
$temp = explode('@', preg_replace('/\s+/', '', $path));
switch (count($temp)){
case 0:
self::logAdd($_logfm, 'er', array('root@global', 'wrong path', $path));
return false;
case 1:
break;
case 2:
$langSite = $temp[1];
break;
default:
$langSite = $temp[1];
$langFile = $temp[2];
break;
}
$path = $temp[0];
$path = preg_replace('/(.+?)\.php/i', '$1', $path).'.php';
$path = trim($path);
if ($path == ''){
self::logAdd($_logfm, 'er', array('root@global', 'null path'));
return false;
}
# имя и переменная класса
if ($class != '') $class = explode('@', preg_replace('/\s+/', '', $class));
$className = '';
$classVar = '';
switch (count($class)){
case 1:
$className = $class[0];
break;
case 2:
$className = $class[0];
$classVar = '$'.str_replace('$', '', $class[1]);
break;
}
# удаление переменной класса
$logMsg = '';
if ($classVar) eval('unset('.$classVar.');');
if (file_exists($path)){
# перевод
if ($langSite != 'nolang'){
if ($langSite == ''){
$langSite = 'site';
str_replace(aSitePath, '', $path, $count);
if (!$count) $langSite = 'root';
}
if ($langFile == ''){
if ($type == 'core' || $type == 'lib') $langFile = preg_replace('/^.+\/(.+?)\..+$/', '$1', str_replace(DS, '/', $path));
else $langFile = preg_replace('/^.+\/(.+?)\/.+?\..+$/', '$1', str_replace(DS, '/', $path));
}
self::loadLang($_logfm, $langSite.'@'.$langFile.'.'.$type);
//self::loadLang($langSite.'@'.$langFile.'.'.$type);
}
# подключение библиотеки
include_once($path);
}else{
$logMsg = 'er include file at';
$logMsgCfg = $path;
}
# объявление класса, инициализация класса
if ($logMsg == '' && $className != ''){
if (class_exists($className)){
if ($classVar != ''){
$cfg = '';
if ($classCfg != ''){
if (is_array($classCfg)){
for($i=0, $e=count($classCfg); $i<$e; $i++){
$cfg .= '$classCfg['.$i.']';
if ($i<$e-1) $cfg .= ',';
}
}else{
$cfg = '$classCfg';
}
}
if ($classVar{0} != '$') $classVar = '$'.$classVar;
eval('global '.$classVar.';');
eval($classVar.' = new '.$className.'('.$cfg.');');
}else{
if (method_exists($className, 'init')) eval($className.'::init();');
}
}else{
$logMsg = 'er include class, lib at';
$logMsgCfg = array($className, $path);
}
}
# ошибка
if ($logMsg != ''){
self::logAdd($_logfm, 'er', array('root@global', $logMsg, $logMsgCfg));
if ($fatalEr){
self::sMsgAdd($_logfm, array('root@global', 'fatal er No', $fatalEr));
self::sMsgEchoo();
self::logEchoo();
self::fatalEr();
exit;
}
return false;
}
# результат
return true;
}
public function loadCore($_logfm='', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadCore');
return self::load($_logfm, 'core', aCorePath.DS.$path, $class, $classCfg, $fatalEr);
}
public function loadLib($_logfm='', $site='site', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadLib');
if ($site != 'root' && $site != 'site'){
Fw::logAdd($_logfm, 'er', array('core'.$_lf, 'wrong type', $site));
return false;
}
if ($site == 'root') $path = aRootLibsPath.DS.$path;
else $path = aSiteLibsPath.DS.$path;
return self::load($_logfm, 'lib', $path, $class, $classCfg, $fatalEr);
}
public function loadSite($_logfm='', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadSite');
return self::load($_logfm, 'site', aSitePath.DS.$path, $class, $classCfg, $fatalEr);
}
public function loadTmpl($_logfm=''){
self::formatLogVar($_logfm, 'fw.core@loadTmpl');
$path = aTmplPath.DS.'index.php';
$cfg = Fw::sCfgGet('tmplCfg', '', array());
$cfg = (object)$cfg;
if ($cfg->nolang != '' && $cfg->nolang == 1) $path .= '@nolang';
return self::load($_logfm, 'tmpl', $path, '', '', self::$fatalErNo['tmpl.site']);
}
# Перевод
public function loadLang($_logfm='', $file=''){
# загрузка ini-файла перевода
self::formatLogVar($_logfm, 'fw.core@loadLang');
$temp = explode('@', preg_replace('/\s+/', '', $file));
if (count($temp) <= 1){
$file = $temp[0];
}else{
$site = $temp[0];
$file = $temp[1];
}
if ($site != 'root' && $site != 'site') $site = 'site';
if ($file == ''){
self::logAdd($_logfm, 'er', array('root@global', 'null path'));
return false;
}
$file = strtolower($file);
if ($site == 'site') $langPath = aSiteLangPath;
else $langPath = aRootLangPath;
$path = $langPath.DS.$file.'.'.lLang.'.ini';
if (!file_exists($path)){
$pathLog = $path;
$path = $langPath.DS.$file.'.'.lDefLang.'.ini';
if (!file_exists($path)){
//$pathLog .= ', '.$path;
$path = $langPath.DS.$file.'.en.ini';
if (!file_exists($path)){
//$pathLog .= ', '.$path;
self::logAdd($_logfm, 'wr', array('root@global', 'file not found at', $pathLog));
return false;
}
}
}
self::$langData[$site.'@'.$file] = parse_ini_file($path);
return true;
}
public function getTextByArray(&$array){
if (!is_array($array)) return;
if (count($array) < 2) $array = '';
switch(count($array)){
case 2:
$type = $array[1];
$cfg = '';
case 3:
default:
$type = $array[1];
$cfg = $array[2];
}
$file = $array[0];
$array = self::getText($file, $type, $cfg);
}
public function getText($file='', $type='', $cfg=''){
# чтение текста из ini-файла перевода
$temp = explode('@', preg_replace('/\s+/', '', $file));
if (count($temp) < 2){
$site = 'site';
$file = $temp[0];
}else{
$site = $temp[0];
$file = $temp[1];
}
if ($site != 'root' && $site != 'site') $site = 'site';
if ($file == '' || $type == '') return $type;
$file = $site.'@'.$file;
if (self::$langData[$file] == ''){
$file = 'root@global';
if (self::$langData[$file] == '') return $type;
}
//echo print_r(self::$langData,1);
if (!isset(self::$langData[$file][$type])){
$file = 'root@global';
if (!isset(self::$langData[$file][$type])) return $type;
}
$text = self::$langData[$file][$type];
if (!is_array($cfg)) $cfg = htmlspecialchars($cfg);
else $cfg = array_map('htmlspecialchars', $cfg);
if ($text != ''){
if (!is_array($cfg)) $cfg = array($cfg);
for($i=0,$e=count($cfg); $i<$e; $i++) $cfg[$i] = str_replace('\\', '#sl', $cfg[$i]);
if (count($cfg)) $text = preg_replace(array_fill(0, count($cfg), '/%s/'), $cfg, $text, 1);
$text = preg_replace(array('/%s/', '/\\\n/', '/#sl/'), array('', '<br>', '\\'), $text);
}else{
$text = $type;
}
return $text;
}
# Шаблоны
public function renderTmpl($_logfm='', $name='', $filePath='', $writeIfNull='', $writeIfEr=NULL){
Fw::formatLogVar($_logfm, 'fw.core@renderTmpl');
if ($name == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$name'));
return NULL;
}
return self::$tmplData[$name] = self::getFileContent($_logfm, $filePath, $writeIfNull, $writeIfEr);
}
public function echooTmpl($_logfm='', $name=''){
Fw::formatLogVar($_logfm, 'fw.core@echooTmpl');
if ($name == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$name'));
return NULL;
}
echo self::$tmplData[$name];
}
# Строки
public function delInStr($string='', $cfg=''){
if ($string == '' || $cfg == '') return $string;
$cfg = explode(',', preg_replace('/\s+/', '', strtolower($cfg)));
$pattern = array();
$replace = array();
$regExp = array(
'ltrim'=>array(
'/^\s*(.*?)$/',
'$1'
),
'rtrim'=>array(
'/^(.*?)\s*$/',
'$1'
),
'dtrim'=>array(
'/\s{2,}/',
' '
),
'atrim'=>array(
'/\s+/i',
''
),
'lrtrim'=>array(
'/^\s*(.*?)\s*$/',
'$1'
),
'lsl'=>array(
'/^\s*\/(.*?)$/',
'$1'
),
'rsl'=>array(
'/^(.*?)\/\s*$/',
'$1'
),
'lrsl'=>array(
'/^\s*\/(.*?)\/\s*$/',
'$1'
),
'http'=>array(
'/http:\/\//i',
''
),
'www'=>array(
'/www\./i',
''
)
);
for($i=0, $e=count($cfg); $i<$e; $i++){
$pattern[] = $regExp[$cfg[$i]][0];
$replace[] = $regExp[$cfg[$i]][1];
}
return preg_replace($pattern, $replace, $string);
}
public function checkStr($string='', $min=0, $max=0, $trim=0, $trims=0, $lower=0){
// $trim: 1 - слева, 2 - справа, 3 - слева и справа
// $trims: 1 - двойные, 2 - все
$string = (string)$string;
$pattern = array();
$replace = array();
if ($trims == 2) $trim = 0;
// паттерн удаления пробелов слева, справа, и слева и справа
switch ($trim){
case 1:
$pattern[] = '/^\s*(.+)$/';
$replace[] = '$1';
break;
case 2:
$pattern[] = '/^(.+)\s*$/';
$replace[] = '$1';
break;
case 3:
$pattern[] = '/^\s*(.+)\s*$/';
$replace[] = '$1';
break;
}
// паттерн удаления двойных проблелов
switch ($trims){
case 1:
$pattern[] = '/\s{2}/';
$replace[] = ' ';
break;
case 2:
$pattern[] = '/\s+/';
$replace[] = '';
break;
}
// перевод строки в нижний регистр
if ($lower) $string = strtolower($string);
// удаление пробелов
if (count($pattern)) $string = preg_replace($pattern, $replace, $string);
// проверка колличества символов min, max
if (strlen($string) < $min) return (object)array('er'=>1, 'data'=>$string);
if ($max && strlen($string) > $max) return (object)array('er'=>2, 'data'=>$string);
return (object)array('er'=>0, 'data'=>$string);
}
public function json_encode_cyr($string){
$arr_replace_utf = array('\u0410', '\u0430','\u0411','\u0431','\u0412','\u0432',
'\u0413','\u0433','\u0414','\u0434','\u0415','\u0435','\u0401','\u0451','\u0416',
'\u0436','\u0417','\u0437','\u0418','\u0438','\u0419','\u0439','\u041a','\u043a',
'\u041b','\u043b','\u041c','\u043c','\u041d','\u043d','\u041e','\u043e','\u041f',
'\u043f','\u0420','\u0440','\u0421','\u0441','\u0422','\u0442','\u0423','\u0443',
'\u0424','\u0444','\u0425','\u0445','\u0426','\u0446','\u0427','\u0447','\u0428',
'\u0448','\u0429','\u0449','\u042a','\u044a','\u042b','\u044b','\u042c','\u044c',
'\u042d','\u044d','\u042e','\u044e','\u042f','\u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$string1 = json_encode($string);
$string2 = str_replace($arr_replace_utf, $arr_replace_cyr, $string1);
return $string2;
}
public function htmlEscapeCyr($string=''){
if (trim($string) == '') return $string;
$search = array ("'Ё'", "'А'", "'Б'", "'В'", "'Г'", "'Д'", "'Е'", "'Ж'", "'З'", "'И'", "'Й'", "'К'", "'Л'", "'М'", "'Н'", "'О'", "'П'", "'Р'", "'С'", "'Т'", "'У'", "'Ф'", "'Х'", "'Ц'", "'Ч'", "'Ш'", "'Щ'", "'Ъ'", "'Ы'", "'Ь'", "'Э'", "'Ю'", "'Я'", "'а'", "'б'", "'в'", "'г'", "'д'", "'е'", "'ж'", "'з'", "'и'", "'й'", "'к'", "'л'", "'м'", "'н'", "'о'", "'п'", "'р'", "'с'", "'т'", "'у'", "'ф'", "'х'", "'ц'", "'ч'", "'ш'", "'щ'", "'ъ'", "'ы'", "'ь'", "'э'", "'ю'", "'я'", "'ё'", "'0'e");
$replace = array ('Ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё', '0');
return preg_replace($search, $replace, $string);
}
public function xmlEscape($string=''){
if (trim($string) == '') return $string;
$string = htmlspecialchars($string);
$string = str_replace('?', '?', $string);
$string = preg_replace('/\?/', '?', $string, 1);
return $string;
}
public function getPluralForm($n=0, $form1='', $form2='', $form5=''){
$forms = array($form1, $form2, $form5);
return $n%10 == 1 && $n%100 != 11?$forms[0] : ($n%10 >= 2 && $n%10 <= 4 && ($n%100 < 10 || $n%100 >= 20) ? $forms[1] : $forms[2]);
}
# Даты, время
private function _dateToFromUtc($format='', $data='', $type='dt'){
if ($format == '') return $data;
if ($data == '') return;
if ($data == 'now') $data = date('Y-m-d H:i:s');
switch($type){
case 'd':
$type = 'Y-m-d';
break;
case 't':
$type = 'H:i:s';
break;
case 'dt':
default:
$type = 'Y-m-d H:i:s';
break;
}
if ($format == 'to') return date($type, strtotime($data) - date('Z'));
return date($type, strtotime($data) + date('Z'));
}
public function dateToUtc($data='', $type='dt'){
return self::_dateToFromUtc('to', $data, $type);
}
public function dateFromUtc($data='', $type='dt'){
return self::_dateToFromUtc('from', $data, $type);
}
# Файлы
public function getFileContent($_logfm='', $filePath='', $returnIfNull='', $returnIfEr=NULL){
Fw::formatLogVar($_logfm, 'fw.core@getFileContent');
if (is_file($filePath)){
ob_start();
include $filePath;
$html = ob_get_contents();
ob_end_clean();
if ($html == '') $html = $returnIfNull;
return $html;
}else{
Fw::logAdd($_logfm, 'er', array('root@global', 'file not found at', $filePath));
return $returnIfEr;
}
}
# Разное
public function getArrayUnRnd($count=0, $min=0, $max=0){
$check = array();
$result = array();
if ($min != $max && $min < $max){
while($count){
$rnd = rand($min, $max);
if (!isset($check[$rnd])){
$check[$rnd] = true;
$result[] = $rnd;
$count--;
}
}
}
return $result;
}
}
?><?
class Fw{
private static $fatalErNo;
private static $cCfg, $uCfg;
private static $sessionTypes, $sessionTypesDelInEnd;
private static $logState, $logData, $logTmpl;
private static $sMsgData, $sMsgTmpl;
private static $langData;
private static $tmplData;
private static $page, $task, $ajax;
# Инициализация
public function init(){
# названия всех файлов в маленьком регистре
# все классы, объекты классов и константы с заглавной буквы (!) кроме объекта базы данных: $db
# все core и site классы - статические
# все адреса без: "http://", "www.", начальных и последних: "/", "\"
# в PHP использовать пользователський часовой пояс. в БД - только в "UTC"
# группы пользователей: 0 - гость, 50 - зарегестрированный пользователь, 500 - администратор, 1000 - супер администратор
# константы:
# DS - разделитель папок (вместо слешей в не web-адресах)
#
# SiteDir - имя папки сайта
#
# aRootPath - абсолютный корневой адрес CMF
# aSitePath - абсолютный адрес папки сайта
# aRootUrl - абсолютный Web-адрес CMF
# aSiteUrl - абсолютный Web-адрес сайта
#
# aCorePath - абсолютный адрес корневой папки "core"
#
# aRootLibsPath - абсолютный адрес корневой папки "libraries"
# aSiteLibsPath - абсолютный Web-адрес корневой папки "libraries"
#
# aRootLangPath - абсолютный адрес корневой папки "languages"
# aSiteLangPath - абсолютный адрес папки сайта "languages"
#
# aRootComsPath - абсолютный адрес корневой папки "components"
# aRootComsUrl - абсолютный web-адрес корневой папки "components"
# aSiteComsPath - абсолютный адрес папки сайта "components"
# aSiteComsUrl - абсолютный web-адрес папки сайта "components"
#
# aRootTmplsPath - абсолютный адрес корневой папки шаблонов
# aRootTmplsUrl - абсолютный web-адрес корневой папки шаблонов
# aSiteTmplsPath - абсолютный адрес папки сайта шаблонов
# aSiteTmplsUrl - абсолютный web-адрес папки сайта шаблонов
#
# TemplDir - имя папки шаблона сайта
# aTmplPath - абсолютный адрес папки шаблона сайта
# aTmplUrl - абсолютный web-адрес папки шаблона сайта
# rTmplPath - относительный адрес папки шаблона сайта
# rTmplUrl - относительный web-адрес папки шаблона сайта
#
# aRootSysTmplPath - абсолютный адрес корневой папки системного шаблона
# aRootSysTmplUrl - абсолютный web-адрес корневой папки системного шаблона
# rRootSysTmplPath - относительный адрес корневой папки системного шаблона
# rRootSysTmplUrl - относительный web-адрес корневой папки системного шаблона
# aSiteSysTmplPath - абсолютный адрес папки сайта системного шаблона
# aSiteSysTmplUrl - абсолютный web-адрес папки сайта системного шаблона
# rSiteSysTmplPath - относительный адрес папки сайта системного шаблона
# rSiteSysTmplUrl - относительный web-адрес папки сайта системного шаблона
#
# ----------------------------------------------------------------------------
#
# uLang - текущая локаль в верхнем регистре
# lLang - текущая локаль в нижнем регистре
# uDefLang - локаль по умолчанию в верхнем регистре
# lDefLang - локаль по умолчанию в нижнем регистре
# TimeZone - текущий часовой пояс в формате названия временной зоны
# TimeZoneH - текущий часовой пояс в количестве смещения часов от "UTC"
# dPrefix - доменные префикс
# ----- Инициализация переменных ------------------------------------------------------------------------------------------------------------------
# номера фатальных ошибок
self::$fatalErNo = array(
'scfg.site'=>2,
'head.core'=>3,
'msg.core'=>4,
'pathway.core'=>5,
'ctitle.core'=>6,
'content.core'=>7,
'run.site'=>8,
'load.site'=>9,
'tmpl.site'=>10,
'db.lib'=>11
);
# сессия
self::$sessionTypes = array();
self::$sessionTypesDelInEnd = array();
# лог
$_logfm = 'fw.core@init';
self::$logState = 1;
self::$logTmpl = array();
if (!is_array(self::sessionGet('#logData'))){
self::$logData = array();
}else{
self::$logData = self::sessionGet('#logData');
self::sessionDel('#logData');
}
# системные сообщения
self::$sMsgTmpl = array();
if (!is_array(self::sessionGet('#smsgData'))){
self::$sMsgData = array();
}else{
self::$sMsgData = self::sessionGet('#smsgData');
self::sessionDel('#smsgData');
}
# локаль
self::$langData = array();
# шаблоны
self::$tmplData = array();
# ----- Глобальные настройки, Настройки сайта, Константы папок ------------------------------------------------------------------------------------------------------------------
### [CONST] абсолютный корневой адрес CMF
# корень, папка:
$aRootPath = explode(DS, dirname(__FILE__));
unset($aRootPath[count($aRootPath)-1]);
define('aRootPath', implode(DS, $aRootPath));
# сайт, папка:
# объявляется в index-файле
#<== абсолютный корневой адрес CMF
### [CONST] имя папки сайта
$SiteDir = explode(DS, aSitePath);
$SiteDir = $SiteDir[count($SiteDir)-1];
define('SiteDir', $SiteDir);
#<== имя папки сайта
### настройки сайта
include_once aSitePath.DS.'cfg.php';
if (!class_exists('sCfg')) self::fatalEr('scfg.site');
$sCfg = self::get('sCfg');
#<== настройки сайта
### [CONST] абсолютный web-адрес
# корень, web:
$sCfg->rootUrl = 'http://'.self::delInStr($sCfg->rootUrl, 'lrtrim,http,www,rsl');
define('aRootUrl', $sCfg->rootUrl);
# cайт, web:
define('aSiteUrl', aRootUrl.str_replace('\\', '/', str_replace(aRootPath, '', aSitePath)));
#<== абсолютный web-адрес
### [CONST] абсолютный адрес папки "core"
# корень, папка:
define('aCorePath', aRootPath.DS.'core');
#<== абсолютный адрес папки "core"
### [CONST] абсолютный адрес корневой папки "libraries"
# корень, папка:
define('aRootLibsPath', aRootPath.DS.'libraries');
# сайт, папка:
define('aSiteLibsPath', aSitePath.DS.'libraries');
#<== абсолютный адрес корневой папки "libraries"
### [CONST] абсолютный адрес папки "languages"
# корень, папка:
define('aRootLangPath', aRootPath.DS.'languages');
# сайт, папка:
define('aSiteLangPath', aSitePath.DS.'languages');
#<== абсолютный адрес папки "languages"
### [CONST] абсолютный адрес папки "components"
# корень, папка:
define('aRootComsPath', aRootPath.DS.'components');
# корень, web:
define('aRootComsUrl', aRootUrl.'/components');
# сайт, папка:
define('aSiteComsPath', aSitePath.DS.'components');
# сайт, web:
define('aSiteComsUrl', aSiteUrl.'/components');
#<== абсолютный адрес папки "components"
### [CONST] абсолютный адрес папки шаблонов
# корень, папка:
define('aRootTmplsPath', aRootPath.DS.'templates');
# корень, web:
define('aRootTmplsUrl', aRootUrl.'/templates');
# сайт, папка:
define('aSiteTmplsPath', aSitePath.DS.'templates');
# сайт, web:
define('aSiteTmplsUrl', aSiteUrl.'/templates');
#<== абсолютный адрес папки шаблонов сайта
### [CONST] адрес папки шаблона сайта
# сайт, папка, абсолютный:
$tmplDir = self::sCfgGet('tmpl', '', 'default');
if (!file_exists(aSiteTmplsPath.DS.$tmplDir)) self::fatalEr('TemplDir');
define('aTmplPath', aSiteTmplsPath.DS.$tmplDir);
# сайт, web, абсолютный:
define('aTmplUrl', aSiteTmplsUrl.'/'.$tmplDir);
# сайт, папка, относительный:
define('rTmplPath', substr(str_replace(aSitePath, '', aTmplPath), 1));
# сайт, web, относительный:
define('rTmplUrl', substr(str_replace(aSiteUrl, '', aTmplUrl), 1));
#<== адрес папки шаблона сайта
### [CONST] имя папки шаблона сайта
define('TmplDir', $tmplDir);
#<== имя папки шаблона сайта
### [CONST] адрес папки системного шаблона
# корень, папка, абсолютный:
define('aRootSysTmplPath', aRootTmplsPath.DS.'_system');
# корень, web, абсолютный:
define('aRootSysTmplUrl', aRootTmplsUrl.'/_system');
# корень, папка, относительный:
define('rRootSysTmplPath', substr(str_replace(aRootPath, '', aRootSysTmplPath), 1));
# корень, web, относительный:
define('rRootSysTmplUrl', substr(str_replace(aRootUrl, '', aTmplUrl), 1));
# сайт, папка, абсолютный:
define('aSiteSysTmplPath', aSiteTmplsPath.DS.'_system');
# сайт, web, абсолютный:
define('aSiteSysTmplUrl', aSiteTmplsUrl.'/_system');
# сайт, папка, относительный:
define('rSiteSysTmplPath', substr(str_replace(aSitePath, '', aSiteSysTmplPath), 1));
# сайт, web, относительный:
define('rSiteSysTmplUrl', substr(str_replace(aSiteUrl, '', aTmplUrl), 1));
#<== адрес папки системного шаблона
### [CONST] доменные префикс
define('dPrefix', str_replace('.', '_', self::delInStr(aSiteUrl, 'http,www,lrsl')).'_');
#<== доменные префикс
# ----- Настройки ------------------------------------------------------------------------------------------------------------------
### отключение, нафиг-нафиг, магии волшебных-кавычек для GET, POST, данных
# так же в .htaccess (должен быть в папке с каждым index-файлом сайта):
# php_value magic_quotes_gpc off
# php_value precision 45
ini_set('magic_quotes_runtime', 0);
ini_set('magic_quotes_sybase', 0);
#<== отключение, нафиг-нафиг, магии волшебных-кавычек для GET, POST, данных
### лог
self::$logState = self::sCfgGet('logState', '', 1);
#<== лог
### cCfg настройки (дублируется в сессию и куку)
self::get('sCfg');
#<== cCfg настройки
### uCfg настройки (пользовательские. дублируется в сессию и, если незащищенная авторизация, в куку)
self::get('uCfg');
//echo print_r(self::$user, 1);
//unset($_SESSION['user']);
#<== uCfg настройки
// ?? удалить
/*self::$user->id = 2;
self::$user->group = 500;
self::$user->login = 'proxy';
self::$user->pass = 'qwe';*/
//self::$user->firstEnter = 1;
//<== удалить
### локаль
# если не указанно в: Cookie, GET, POST, sCfg, то "en"
$defLang = self::sCfgGet('lang', '', 'en');
$lang = self::getVar('lang', 'get,post', self::cCfgGet('lang'));
if ($lang == '') $lang = $defLang;
define('uLang', strtoupper($lang));
define('lLang', strtolower($lang));
define('uDefLang', strtoupper($defLang));
define('lDefLang', strtolower($defLang));
self::cCfgSet('lang', '', lLang);
#<== локаль
### часовой пояс
# если не указанно в: Cookie, sCfg, то "UTC"
$timeZone = self::cCfgGet('timeZone', '', self::sCfgGet('timeZone', '', 'UTC'));
date_default_timezone_set($timeZone);
define('TimeZone', $timeZone);
define('TimeZoneH', date('P'));
self::cCfgSet('TimeZone', '', TimeZone);
self::cCfgSet('TimeZoneH', '', TimeZoneH);
#<== часовой пояс
### загрузка глобального перевода
self::loadLang($_logfm, 'root@global');
#<== загрузка глобального перевода
### page, task, ajax
self::$page = Fw::getVar('page', 'get,post');
self::$task = Fw::getVar('task', 'get,post');
self::$ajax = Fw::getVar('ajax', 'get,post');
### page, task, ajax
# ----- Библиотеки (сore) ------------------------------------------------------------------------------------------------------------------
### html head (title, favicon, css files, css code, js files, js code)
self::loadCore($_logfm, 'head.php@nolang', 'Head', '', self::$fatalErNo['head.core']);
#<== html head
### сообщения (для всех)
self::loadCore($_logfm, 'msg.php@nolang', 'Msg', '', self::$fatalErNo['msg.core']);
#<== сообщения
### путь по сайту
self::loadCore($_logfm, 'pathway.php@nolang', 'Pathway', '', self::$fatalErNo['pathway.core']);
#<== путь по сайту
### заголовок контента
self::loadCore($_logfm, 'ctitle.php@nolang', 'cTitle', '', self::$fatalErNo['ctitle.core']);
#<== заголовок контента
### компоненты
self::loadCore($_logfm, 'com.php@nolang', 'Com', '', self::$fatalErNo['com.core']);
#<== компоненты
### шаблоны
self::loadCore($_logfm, 'tmpl.php@nolang', 'Tmpl', '', self::$fatalErNo['tmpl.core']);
#<== шаблоны
# --- Библиотеки (site, lib) ------------------------------------------------------------------------------------------------------------------
### выполнение действией
self::loadSite($_logfm, 'run.php@nolang', 'Run', '', self::$fatalErNo['run.site']);
#<== выполнение действией
### загрузка и генерация компонентов
self::loadSite($_logfm, 'load.php@nolang', 'load', '', self::$fatalErNo['load.site']);
#<== загрузка и генерация компонентов
### база данных
self::loadLib($_logfm, 'root', 'db_mysql.php@nolang', 'Db_MySQL@db', array($_logfm, self::sCfgGet('db')), self::$fatalErNo['db.lib']);
#<== база данных
}
# Системные
public function fatalEr($type='', $erNo=NULL){
# фатальная ошибка, вывод сообщения, выход
if ($type != ''){
if ($erNo === NULL){
$erNo = self::$fatalErNo[$type];
if ($erNo == '') $erNo = -1;
}
echo '<span style="font-family: Arial,Tahoma;font-size: 11px;color:#foo;">'.$msg.'</span>';
}
self::sessionDelInEnd();
exit;
}
public function redirect($url=''){
if ($url == '') return false;
$url = 'http://'.self::delInStr($url, 'lrtrim,http,www,rsl');
header('Location: '.$url);
exit;
}
# Настройки
private function _cfgGet($cfgType='', $type1='', $type2='', $defData=''){
$data = '';
if ($cfgType != ''){
$cfg = Fw::get($cfgType);
if (is_object($cfg)){
$data = $cfg->$type1;
if ($data && $type2 !== ''){
if (!is_array($data)) $data = NULL;
else $data = $data[$type2];
}
}
}
if ($data === '' || $data === NULL) $data = $defData;
return $data;
}
private function _cfgSet($cfgType='', $type1='', $type2='', $data=''){
if ($cfgType != ''){
$cfg = Fw::get($cfgType);
if (!is_object($cfg)) $cfg = (object)array();
$param = $cfg->$type1;
if ($type2 !== ''){
if (is_array($param)) $param[$type2] = $data;
elseif(is_object($param)) $param->$type2 = $data;
else $param = array($type2 => $data);
}else{
$param = $data;
}
$cfg->$type1 = $param;
if ($cfgType == 'cCfg' || $cfgType == 'uCfg') self::set($cfgType, $cfg);
}
}
public function sCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('sCfg', $type1, $type2, $defData);
}
public function cCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('сCfg', $type1, $type2, $defData);
}
public function uCfgGet($type1='', $type2='', $defData=''){
return self::_cfgGet('uCfg', $type1, $type2, $defData);
}
public function cCfgSet($type1='', $type2='', $data=''){
return self::_cfgSet('cCfg', $type1, $type2, $data);
}
public function uCfgSet($type1='', $type2='', $data=''){
return self::_cfgSet('uCfg', $type1, $type2, $data);
}
public function uCfgReset(){
self::set('uCfg', array('id'=>0, 'group'=>0, 'email'=>'', 'login'=>'', 'pass'=>''));
}
# Геттеры, Сеттеры
public function get($type='', $data=NULL){
switch ($type){
case 'sCfg':
return new sCfg();
break;
case 'cCfg':
if (!is_object(self::$cCfg)){
self::$cCfg = $_SESSION['cCfg'];
if (!is_object(self::$cCfg)){
self::$cCfg = json_decode(self::cookieGet('cCfg'));
if (!is_object(self::$cCfg)) self::$cCfg = (object)array();
}
}
return self::$cCfg;
break;
case 'uCfg':
if (!is_object(self::$uCfg)){
self::$uCfg = $_SESSION['cCfg'];
if (!is_object(self::$uCfg)){
self::$uCfg = json_decode(self::cookieGet('cCfg'));
if (!is_object(self::$uCfg)) self::uCfgReset();
}
}
return self::$uCfg;
break;
case 'page':
if (self::$page == '') self::$page = self::sCfgGet('defPage', 'mainpage', 'mainpage');
return self::$page;
break;
case 'task':
return self::$task;
break;
case 'ajax':
return self::$ajax;
break;
case 'defPage':
if ($data == '') return '';
return self::sCfgGet('defPage', $data, 'mainpage');
break;
default:
return false;
}
}
public function set($type='', $data=NULL){
switch ($type){
case 'cCfg':
if ($data === NULL) $data = self::$cCfg;
self::$cCfg = is_object($data)?$data:(is_array($data)?(object)$data:(object)(array)$data);
self::sessionSet('#cCfg', self::$cCfg);
self::cookieSetSc('cCfg', json_encode(self::$cCfg), time()+315360000);
break;
case 'uCfg':
if ($data === NULL) $data = self::$uCfg;
self::$uCfg = is_object($data)?$data:(is_array($data)?(object)$data:(object)(array)$data);
self::sessionSet('#uCfg', self::$uCfg);
self::cookieSetSc('uCfg', json_encode(self::$uCfg), time()+315360000);
break;
case 'page':
self::$page = $data;
break;
case 'task':
self::$task = $data;
break;
case 'ajax':
self::$ajax = $data;
break;
default:
return false;
}
return true;
}
public function getVar($varName='', $type='', $def=NULL){
# получение значенией параметров запроса: GET, POST
$val = '';
if ($varName && $type){
$type = explode(',', strtolower($type));
for($i=0, $e=count($type); $i<$e; $i++){
switch ($type[$i]){
case 'cookie':
$val = self::getCookie($varName);
break;
case 'get':
$val = $_GET[$varName];
break;
case 'post':
$val = $_POST[$varName];
break;
}
if ($val != '') break;
}
}
if ($val == '' && $def !== NULL) $val = $def;
return $val;
}
# Шифрование
public function code($level=0, $string='', $salt=''){
if ($string == '') return;
if (!$level) $hash = md5($salt.md5($string.$salt));
else $hash = md5($salt.$hash1);
return $hash;
}
public function decode($string='', $salt=''){
}
# Проверка прав доступа
public function car($group='', $rType='com', $rData='403'){
if ($group == '') return false;
if (self::uCfgGet('group') < $group) $result = false;
$result = true;
if ($rType != ''){
switch ($rType){
case 'com':
Render::restart($rData);
break;
case 'url':
self::redirect($rData);
break;
}
}
}
public function carUser($rType='com', $rData='403'){
self::car(100, $rType, $rData);
}
public function carAdmin($rType='com', $rData='403'){
self::car(500, $rType, $rData);
}
public function carSAdmin($rType='com', $rData='403'){
self::car(1000, $rType, $rData);
}
# Сессия
public function sessionSet($type='', $data='', $addToDelInEnd=0){
$type = trim($type);
if ($type == '') return false;
//$type = str_replace('#', dPrefix, $type);
if ($addToDelInEnd) self::sessionAddToDelInEnd($type);
self::$sessionTypes[$type] = 1;
$_SESSION[$type] = $data;
}
public function sessionAddToDelInEnd($type=''){
$type = trim($type);
self::$sessionTypesDelInEnd[$type] = 1;
}
public function sessionGet($type='', $def=NULL){
$type = trim($type);
if ($type == '') return false;
//$type = str_replace('#', dPrefix, $type);
$val = $_SESSION[$type];
if ($val == '') $val = $def;
return $val;
}
public function sessionDel($type=''){
unset($_SESSION[trim($type)]);
}
public function sessionDelAll(){
foreach(self::$sessionTypes as $key => $val) unset($_SESSION[$key]);
}
public function sessionDelInEnd(){
foreach(self::$sessionTypesDelInEnd as $key => $val) unset($_SESSION[$key]);
}
# Куки
public function cookieGet($name=NULL, $def=NULL){
if ($name === NULL) return false;
$val = $_COOKIE[dPrefix.$name];
if ($val == '' && $def !== NULL) $val = $def;
return $val;
}
public function cookieSet($name=NULL, $value=NULL, $expire=0, $path=NULL, $domain=NULL, $secure=false, $httponly=false){
if ($name === NULL) return false;
if ($path === NULL) $path = '/';
setCookie(dPrefix.$name, $value, $expire, $path, $domain, $secure, $httponly);
return true;
}
public function cookieSetSc($name=NULL, $value=NULL, $expire=0, $path=NULL, $domain=NULL, $secure=false, $httponly=false){
if (self::uCfgGet('sconnect') || $name === NULL) return false;
return self::cookieSet($name, $value, $expire, $path, $domain, $secure, $httponly);
}
# Лог
public function formatLogVar(&$logAll='', $logAdd=''){
if ($logAll === NULL) return false;
if ($logAll == '' && $logAdd == '') return false;
$logAll = preg_replace('/^@*(.+)@*$/', '$1', $logAll);
$logAdd = preg_replace('/^@*(.+)@*$/', '$1', $logAdd);
if ($logAll == '' && $logAdd != '') $logAll = $logAdd;
$logs = array($logAll, $logAdd);
if ($logAll == $logAdd) $logs[1] = '';
$logAll = '';
for($i=0; $i<2; $i++){
if ($logs[$i] == '') continue;
if ($logAll != '') $logAll .= '►';
$logAll .= str_replace('@', '::', $logs[$i]);
}
if ($logAll == '') $logAll = $logAdd;
}
public function logOff(){
self::$logState = 0;
}
public function logOn(){
self::$logState = 1;
}
public function logAdd($_logfm='', $type='', $msg=''){
//self::formatLogVar($_logfm, 'fw.core@logAdd');
if ($_logfm === NULL) return false;
self::getTextByArray($msg);
$logShowGroup = self::sCfgGet('logShowGroup', '', 500);
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
if (trim($msg) == '') return false;
if ($_logfm != '') $msg = '[<b>'.$_logfm.'</b>] '.$msg;
switch ($type){
case 'er':
case 'error':
$type = 'er';
break;
case 'wr':
case 'warn':
case 'warning':
$type = 'wr';
break;
case 'ok':
$type = 'ok';
break;
case 'i':
case 'inf':
case 'info':
default:
$type = 'inf';
break;
}
self::$logData[] = array($type, $msg);
self::sessionSet('#logData', self::$logData, 1);
return true;
}
private function _logGetItems($type='html'){
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
if ($type == 'array'){
return self::$logData;
}else{
$html = '';
for($i=0, $e=count(self::$logData); $i<$e; $i++){
if (!$i){
self::$logTmpl['item'] = self::getFileContent($_logfm, aRootSysTmplPath.DS.'log.item.core.php');
if (self::$logTmpl['item'] == '') self::$logTmpl['item'] = '<div class="log_%class">%item</div>';
}
self::$logData[$i][1] = str_replace('\\', '#sl', self::$logData[$i][1]);
$item = preg_replace(array('/%class/i', '/%item/i', '/#sl/'), array(self::$logData[$i][0], self::$logData[$i][1], '\\'), self::$logTmpl['item']);
if (trim($item) != '') $html .= $item."\n";
}
return $html;
}
}
public function logGetItemsArray(){
return self::_logGetItems('array');
}
public function logGetItemsHtml(){
return self::_logGetItems('html');
}
public function logGetFullHtml($returnWithoutItems=0){
if (!$returnWithoutItems && !self::logExists()) return '';
$html = self::getFileContent($_logfm, aRootSysTmplPath.DS.'log.wrap.core.php');
if ($html == '') $html = '<div id="log">'.self::logGetItems().'</div>';
return "\n\n".$html."\n\n";
}
public function logExists(){
if (count(self::$logData)) return true;
return false;
}
public function logEchoo($echoWithoutItems=0){
$logShowGroup = self::sCfgGet('logShowGroup', '', 500);
if (!self::$logState) return false;
if (self::uCfgGet('group') < $logShowGroup) return false;
echo self::logGetFullHtml($echoWithoutItems);
}
# Системные сообщения
public function sMsgAdd($_logfm='', $msg=''){
self::formatLogVar($_logfm, 'fw.core@sMsgAdd');
self::getTextByArray($msg);
if (is_string($msg) && trim($msg) == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$msg'));
return false;
}
self::$sMsgData[] = $msg;
self::sessionSet('#smsgData', self::$sMsgData, 1);
return true;
}
private function _sMsgGetItems($type='html'){
if ($type == 'array'){
return self::$sMsgData;
}else{
$html = '';
for($i=0, $e=count(self::$sMsgData); $i<$e; $i++){
if (!$i){
self::$sMsgTmpl['item'] = self::getFileContent($_logfm, aRootSysTmplPath.DS.'smsg.item.core.php');
if (self::$sMsgTmpl['item'] == '') self::$sMsgTmpl['item'] = '<div class="smsg_item">%item</div>';
}
$item = str_replace('%item', self::$sMsgData[$i], self::$sMsgTmpl['item']);
if (trim($item) != '') $html .= $item."\n";
}
return $html;
}
}
public function sMsgGetItemsArray(){
return self::_sMsgGetItems('array');
}
public function sMsgGetItemsHtml(){
return self::_sMsgGetItems('html');
}
public function sMsgGetFullHtml($returnWithoutItems=0){
if (!$returnWithoutItems && !self::sMsgExists()) return '';
$html = self::getFileContent($_logfm, aRootSysTmplPath.DS.'smsg.wrap.core.php');
if ($html == '') $html = '<div id="smsg">'.self::sMsgGetItemsHtml().'</div>';
return "\n\n".$html."\n\n";
}
public function sMsgExists(){
if (count(self::sMsgGetItemsArray())) return true;
return false;
}
public function sMsgEchoo($echoWithoutItems=0){
echo self::sMsgGetFullHtml($echoWithoutItems);
}
# Подключение библиотек
public function load($_logfm='', $type='', $path='', $class='', $classCfg='', $fatalEr=0){
# загрузка библиотеки, объявление класса
self::formatLogVar($_logfm, 'fw.core@load');
# адрес библиотеки, языковой файл
$temp = explode('@', preg_replace('/\s+/', '', $path));
switch (count($temp)){
case 0:
self::logAdd($_logfm, 'er', array('root@global', 'wrong path', $path));
return false;
case 1:
break;
case 2:
$langSite = $temp[1];
break;
default:
$langSite = $temp[1];
$langFile = $temp[2];
break;
}
$path = $temp[0];
$path = preg_replace('/(.+?)\.php/i', '$1', $path).'.php';
$path = trim($path);
if ($path == ''){
self::logAdd($_logfm, 'er', array('root@global', 'null path'));
return false;
}
# имя и переменная класса
if ($class != '') $class = explode('@', preg_replace('/\s+/', '', $class));
$className = '';
$classVar = '';
switch (count($class)){
case 1:
$className = $class[0];
break;
case 2:
$className = $class[0];
$classVar = '$'.str_replace('$', '', $class[1]);
break;
}
# удаление переменной класса
$logMsg = '';
if ($classVar) eval('unset('.$classVar.');');
if (file_exists($path)){
# перевод
if ($langSite != 'nolang'){
if ($langSite == ''){
$langSite = 'site';
str_replace(aSitePath, '', $path, $count);
if (!$count) $langSite = 'root';
}
if ($langFile == ''){
if ($type == 'core' || $type == 'lib') $langFile = preg_replace('/^.+\/(.+?)\..+$/', '$1', str_replace(DS, '/', $path));
else $langFile = preg_replace('/^.+\/(.+?)\/.+?\..+$/', '$1', str_replace(DS, '/', $path));
}
self::loadLang($_logfm, $langSite.'@'.$langFile.'.'.$type);
//self::loadLang($langSite.'@'.$langFile.'.'.$type);
}
# подключение библиотеки
include_once($path);
}else{
$logMsg = 'er include file at';
$logMsgCfg = $path;
}
# объявление класса, инициализация класса
if ($logMsg == '' && $className != ''){
if (class_exists($className)){
if ($classVar != ''){
$cfg = '';
if ($classCfg != ''){
if (is_array($classCfg)){
for($i=0, $e=count($classCfg); $i<$e; $i++){
$cfg .= '$classCfg['.$i.']';
if ($i<$e-1) $cfg .= ',';
}
}else{
$cfg = '$classCfg';
}
}
if ($classVar{0} != '$') $classVar = '$'.$classVar;
eval('global '.$classVar.';');
eval($classVar.' = new '.$className.'('.$cfg.');');
}else{
if (method_exists($className, 'init')) eval($className.'::init();');
}
}else{
$logMsg = 'er include class, lib at';
$logMsgCfg = array($className, $path);
}
}
# ошибка
if ($logMsg != ''){
self::logAdd($_logfm, 'er', array('root@global', $logMsg, $logMsgCfg));
if ($fatalEr){
self::sMsgAdd($_logfm, array('root@global', 'fatal er No', $fatalEr));
self::sMsgEchoo();
self::logEchoo();
self::fatalEr();
exit;
}
return false;
}
# результат
return true;
}
public function loadCore($_logfm='', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadCore');
return self::load($_logfm, 'core', aCorePath.DS.$path, $class, $classCfg, $fatalEr);
}
public function loadLib($_logfm='', $site='site', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadLib');
if ($site != 'root' && $site != 'site'){
Fw::logAdd($_logfm, 'er', array('core'.$_lf, 'wrong type', $site));
return false;
}
if ($site == 'root') $path = aRootLibsPath.DS.$path;
else $path = aSiteLibsPath.DS.$path;
return self::load($_logfm, 'lib', $path, $class, $classCfg, $fatalEr);
}
public function loadSite($_logfm='', $path='', $class='', $classCfg='', $fatalEr=0){
self::formatLogVar($_logfm, 'fw.core@loadSite');
return self::load($_logfm, 'site', aSitePath.DS.$path, $class, $classCfg, $fatalEr);
}
public function loadTmpl($_logfm=''){
self::formatLogVar($_logfm, 'fw.core@loadTmpl');
$path = aTmplPath.DS.'index.php';
$cfg = Fw::sCfgGet('tmplCfg', '', array());
$cfg = (object)$cfg;
if ($cfg->nolang != '' && $cfg->nolang == 1) $path .= '@nolang';
return self::load($_logfm, 'tmpl', $path, '', '', self::$fatalErNo['tmpl.site']);
}
# Перевод
public function loadLang($_logfm='', $file=''){
# загрузка ini-файла перевода
self::formatLogVar($_logfm, 'fw.core@loadLang');
$temp = explode('@', preg_replace('/\s+/', '', $file));
if (count($temp) <= 1){
$file = $temp[0];
}else{
$site = $temp[0];
$file = $temp[1];
}
if ($site != 'root' && $site != 'site') $site = 'site';
if ($file == ''){
self::logAdd($_logfm, 'er', array('root@global', 'null path'));
return false;
}
$file = strtolower($file);
if ($site == 'site') $langPath = aSiteLangPath;
else $langPath = aRootLangPath;
$path = $langPath.DS.$file.'.'.lLang.'.ini';
if (!file_exists($path)){
$pathLog = $path;
$path = $langPath.DS.$file.'.'.lDefLang.'.ini';
if (!file_exists($path)){
//$pathLog .= ', '.$path;
$path = $langPath.DS.$file.'.en.ini';
if (!file_exists($path)){
//$pathLog .= ', '.$path;
self::logAdd($_logfm, 'wr', array('root@global', 'file not found at', $pathLog));
return false;
}
}
}
self::$langData[$site.'@'.$file] = parse_ini_file($path);
return true;
}
public function getTextByArray(&$array){
if (!is_array($array)) return;
if (count($array) < 2) $array = '';
switch(count($array)){
case 2:
$type = $array[1];
$cfg = '';
case 3:
default:
$type = $array[1];
$cfg = $array[2];
}
$file = $array[0];
$array = self::getText($file, $type, $cfg);
}
public function getText($file='', $type='', $cfg=''){
# чтение текста из ini-файла перевода
$temp = explode('@', preg_replace('/\s+/', '', $file));
if (count($temp) < 2){
$site = 'site';
$file = $temp[0];
}else{
$site = $temp[0];
$file = $temp[1];
}
if ($site != 'root' && $site != 'site') $site = 'site';
if ($file == '' || $type == '') return $type;
$file = $site.'@'.$file;
if (self::$langData[$file] == ''){
$file = 'root@global';
if (self::$langData[$file] == '') return $type;
}
//echo print_r(self::$langData,1);
if (!isset(self::$langData[$file][$type])){
$file = 'root@global';
if (!isset(self::$langData[$file][$type])) return $type;
}
$text = self::$langData[$file][$type];
if (!is_array($cfg)) $cfg = htmlspecialchars($cfg);
else $cfg = array_map('htmlspecialchars', $cfg);
if ($text != ''){
if (!is_array($cfg)) $cfg = array($cfg);
for($i=0,$e=count($cfg); $i<$e; $i++) $cfg[$i] = str_replace('\\', '#sl', $cfg[$i]);
if (count($cfg)) $text = preg_replace(array_fill(0, count($cfg), '/%s/'), $cfg, $text, 1);
$text = preg_replace(array('/%s/', '/\\\n/', '/#sl/'), array('', '<br>', '\\'), $text);
}else{
$text = $type;
}
return $text;
}
# Шаблоны
public function renderTmpl($_logfm='', $name='', $filePath='', $writeIfNull='', $writeIfEr=NULL){
Fw::formatLogVar($_logfm, 'fw.core@renderTmpl');
if ($name == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$name'));
return NULL;
}
return self::$tmplData[$name] = self::getFileContent($_logfm, $filePath, $writeIfNull, $writeIfEr);
}
public function echooTmpl($_logfm='', $name=''){
Fw::formatLogVar($_logfm, 'fw.core@echooTmpl');
if ($name == ''){
Fw::logAdd($_logfm, 'er', array('root@global', 'null data', '$name'));
return NULL;
}
echo self::$tmplData[$name];
}
# Строки
public function delInStr($string='', $cfg=''){
if ($string == '' || $cfg == '') return $string;
$cfg = explode(',', preg_replace('/\s+/', '', strtolower($cfg)));
$pattern = array();
$replace = array();
$regExp = array(
'ltrim'=>array(
'/^\s*(.*?)$/',
'$1'
),
'rtrim'=>array(
'/^(.*?)\s*$/',
'$1'
),
'dtrim'=>array(
'/\s{2,}/',
' '
),
'atrim'=>array(
'/\s+/i',
''
),
'lrtrim'=>array(
'/^\s*(.*?)\s*$/',
'$1'
),
'lsl'=>array(
'/^\s*\/(.*?)$/',
'$1'
),
'rsl'=>array(
'/^(.*?)\/\s*$/',
'$1'
),
'lrsl'=>array(
'/^\s*\/(.*?)\/\s*$/',
'$1'
),
'http'=>array(
'/http:\/\//i',
''
),
'www'=>array(
'/www\./i',
''
)
);
for($i=0, $e=count($cfg); $i<$e; $i++){
$pattern[] = $regExp[$cfg[$i]][0];
$replace[] = $regExp[$cfg[$i]][1];
}
return preg_replace($pattern, $replace, $string);
}
public function checkStr($string='', $min=0, $max=0, $trim=0, $trims=0, $lower=0){
// $trim: 1 - слева, 2 - справа, 3 - слева и справа
// $trims: 1 - двойные, 2 - все
$string = (string)$string;
$pattern = array();
$replace = array();
if ($trims == 2) $trim = 0;
// паттерн удаления пробелов слева, справа, и слева и справа
switch ($trim){
case 1:
$pattern[] = '/^\s*(.+)$/';
$replace[] = '$1';
break;
case 2:
$pattern[] = '/^(.+)\s*$/';
$replace[] = '$1';
break;
case 3:
$pattern[] = '/^\s*(.+)\s*$/';
$replace[] = '$1';
break;
}
// паттерн удаления двойных проблелов
switch ($trims){
case 1:
$pattern[] = '/\s{2}/';
$replace[] = ' ';
break;
case 2:
$pattern[] = '/\s+/';
$replace[] = '';
break;
}
// перевод строки в нижний регистр
if ($lower) $string = strtolower($string);
// удаление пробелов
if (count($pattern)) $string = preg_replace($pattern, $replace, $string);
// проверка колличества символов min, max
if (strlen($string) < $min) return (object)array('er'=>1, 'data'=>$string);
if ($max && strlen($string) > $max) return (object)array('er'=>2, 'data'=>$string);
return (object)array('er'=>0, 'data'=>$string);
}
public function json_encode_cyr($string){
$arr_replace_utf = array('\u0410', '\u0430','\u0411','\u0431','\u0412','\u0432',
'\u0413','\u0433','\u0414','\u0434','\u0415','\u0435','\u0401','\u0451','\u0416',
'\u0436','\u0417','\u0437','\u0418','\u0438','\u0419','\u0439','\u041a','\u043a',
'\u041b','\u043b','\u041c','\u043c','\u041d','\u043d','\u041e','\u043e','\u041f',
'\u043f','\u0420','\u0440','\u0421','\u0441','\u0422','\u0442','\u0423','\u0443',
'\u0424','\u0444','\u0425','\u0445','\u0426','\u0446','\u0427','\u0447','\u0428',
'\u0448','\u0429','\u0449','\u042a','\u044a','\u042b','\u044b','\u042c','\u044c',
'\u042d','\u044d','\u042e','\u044e','\u042f','\u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$string1 = json_encode($string);
$string2 = str_replace($arr_replace_utf, $arr_replace_cyr, $string1);
return $string2;
}
public function htmlEscapeCyr($string=''){
if (trim($string) == '') return $string;
$search = array ("'Ё'", "'А'", "'Б'", "'В'", "'Г'", "'Д'", "'Е'", "'Ж'", "'З'", "'И'", "'Й'", "'К'", "'Л'", "'М'", "'Н'", "'О'", "'П'", "'Р'", "'С'", "'Т'", "'У'", "'Ф'", "'Х'", "'Ц'", "'Ч'", "'Ш'", "'Щ'", "'Ъ'", "'Ы'", "'Ь'", "'Э'", "'Ю'", "'Я'", "'а'", "'б'", "'в'", "'г'", "'д'", "'е'", "'ж'", "'з'", "'и'", "'й'", "'к'", "'л'", "'м'", "'н'", "'о'", "'п'", "'р'", "'с'", "'т'", "'у'", "'ф'", "'х'", "'ц'", "'ч'", "'ш'", "'щ'", "'ъ'", "'ы'", "'ь'", "'э'", "'ю'", "'я'", "'ё'", "'0'e");
$replace = array ('Ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё', '0');
return preg_replace($search, $replace, $string);
}
public function xmlEscape($string=''){
if (trim($string) == '') return $string;
$string = htmlspecialchars($string);
$string = str_replace('?', '?', $string);
$string = preg_replace('/\?/', '?', $string, 1);
return $string;
}
public function getPluralForm($n=0, $form1='', $form2='', $form5=''){
$forms = array($form1, $form2, $form5);
return $n%10 == 1 && $n%100 != 11?$forms[0] : ($n%10 >= 2 && $n%10 <= 4 && ($n%100 < 10 || $n%100 >= 20) ? $forms[1] : $forms[2]);
}
# Даты, время
private function _dateToFromUtc($format='', $data='', $type='dt'){
if ($format == '') return $data;
if ($data == '') return;
if ($data == 'now') $data = date('Y-m-d H:i:s');
switch($type){
case 'd':
$type = 'Y-m-d';
break;
case 't':
$type = 'H:i:s';
break;
case 'dt':
default:
$type = 'Y-m-d H:i:s';
break;
}
if ($format == 'to') return date($type, strtotime($data) - date('Z'));
return date($type, strtotime($data) + date('Z'));
}
public function dateToUtc($data='', $type='dt'){
return self::_dateToFromUtc('to', $data, $type);
}
public function dateFromUtc($data='', $type='dt'){
return self::_dateToFromUtc('from', $data, $type);
}
# Файлы
public function getFileContent($_logfm='', $filePath='', $returnIfNull='', $returnIfEr=NULL){
Fw::formatLogVar($_logfm, 'fw.core@getFileContent');
if (is_file($filePath)){
ob_start();
include $filePath;
$html = ob_get_contents();
ob_end_clean();
if ($html == '') $html = $returnIfNull;
return $html;
}else{
Fw::logAdd($_logfm, 'er', array('root@global', 'file not found at', $filePath));
return $returnIfEr;
}
}
# Разное
public function getArrayUnRnd($count=0, $min=0, $max=0){
$check = array();
$result = array();
if ($min != $max && $min < $max){
while($count){
$rnd = rand($min, $max);
if (!isset($check[$rnd])){
$check[$rnd] = true;
$result[] = $rnd;
$count--;
}
}
}
return $result;
}
}
?>