ifhub2/framework/include/function.php

590 lines
15 KiB
PHP
Raw Normal View History

2024-06-02 09:37:06 +03:00
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Если не стоит расширения mb
*
* @param unknown_type $s
* @return unknown
*/
if (!function_exists('mb_strlen')) {
function mb_strlen($s, $sEncode = "UTF-8")
{
$length = strlen(iconv($sEncode, 'Windows-1251', $s));
return (int)$length;
}
}
/**
* Если не стоит расширения mb
*/
if (!function_exists('mb_strtolower')) {
function mb_strtolower($s, $sEncode = "UTF-8")
{
$s = iconv($sEncode, "Windows-1251", $s);
$s = strtolower($s);
$s = iconv("Windows-1251", $sEncode, $s);
return $s;
}
}
/**
* Проверяет запрос послан как ajax или нет
* Пришлось продублировать здесь, чтобы получить к ней доступ до подключения роутера
*
* @return unknown
*/
function isAjaxRequest()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
/**
* функция вывода отладочных сообщений через консоль браузера
*/
function dump()
{
Engine::getInstance()->Logger_Console(func_get_args());
}
/**
* функция доступа к GET POST параметрам
*
* @param string $sName
* @param mixed $default
* @param string $sType
* @return mixed
*/
function getRequest($sName, $default = null, $sType = null)
{
/**
* Выбираем в каком из суперглобальных искать указанный ключ
*/
switch (strtolower($sType)) {
default:
case null:
$aStorage = $_REQUEST;
break;
case 'get':
$aStorage = $_GET;
break;
case 'post':
$aStorage = $_POST;
break;
}
if (isset($aStorage[$sName])) {
if (is_string($aStorage[$sName])) {
return trim($aStorage[$sName]);
} else {
return $aStorage[$sName];
}
}
return $default;
}
/**
* функция доступа к GET POST параметрам, которая значение принудительно приводит к строке
*
* @param string $sName
* @param mixed $default
* @param string $sType
*
* @return string
*/
function getRequestStr($sName, $default = null, $sType = null)
{
$mData = getRequest($sName, $default, $sType);
if (!is_array($mData)) {
return (string)$mData;
}
return '';
}
/**
* Определяет был ли передан указанный параметр методом POST
*
* @param string|null $sName
* @return bool
*/
function isPost($sName=null)
{
if (is_null($sName)) {
return $_SERVER['REQUEST_METHOD'] == 'POST';
}
return (getRequest($sName, null, 'post') !== null);
}
/**
* генерирует случайную последовательность символов
*
* @param unknown_type $iLength
* @return unknown
*/
function func_generator($iLength = 10)
{
if ($iLength > 32) {
$iLength = 32;
}
return substr(md5(uniqid(mt_rand(), true)), 0, $iLength);
}
/**
* htmlspecialchars умеющая обрабатывать массивы
*
* @param mixed $data
* @param int %walkIndex - represents the key/index of the array being recursively htmlspecialchars'ed
* @return void
*/
function func_htmlspecialchars(&$data, $walkIndex = null)
{
if (is_string($data)) {
$data = htmlspecialchars($data);
} elseif (is_array($data)) {
array_walk($data, __FUNCTION__);
}
}
function func_urlspecialchars_array(&$data, $walkIndex = null)
{
if (is_string($data)) {
$data = func_urlspecialchars($data);
} elseif (is_array($data)) {
array_walk($data, __FUNCTION__);
}
}
function func_urlspecialchars($data)
{
$aTable = get_html_translation_table();
unset($aTable['&']);
return strtr($data, $aTable);
}
/**
* stripslashes умеющая обрабатывать массивы
*
* @param unknown_type $data
*/
function func_stripslashes(&$data)
{
if (is_array($data)) {
foreach ($data as $sKey => $value) {
if (is_array($value)) {
func_stripslashes($data[$sKey]);
} else {
$data[$sKey] = stripslashes($value);
}
}
} else {
$data = stripslashes($data);
}
}
/**
* Проверяет на корректность значение соглавно правилу
*
* @param unknown_type $sValue
* @param unknown_type $sParam
* @param unknown_type $iMin
* @param unknown_type $iMax
* @return unknown
*/
function func_check($sValue, $sParam, $iMin = 1, $iMax = 100)
{
if (is_array($sValue)) {
return false;
}
switch ($sParam) {
case 'id':
if (preg_match("/^\d{" . $iMin . ',' . $iMax . "}$/", $sValue)) {
return true;
}
break;
case 'float':
if (preg_match("/^[\-]?\d+[\.]?\d*$/", $sValue)) {
return true;
}
break;
case 'mail':
if (preg_match("/^[\da-z\_\-\.\+]+@[\da-z_\-\.]+\.[a-z]{2,5}$/i", $sValue)) {
return true;
}
break;
case 'login':
if (preg_match("/^[\da-z\_\-]{" . $iMin . ',' . $iMax . "}$/i", $sValue)) {
return true;
}
break;
case 'md5':
if (preg_match("/^[\da-z]{32}$/i", $sValue)) {
return true;
}
break;
case 'password':
if (mb_strlen($sValue, 'UTF-8') >= $iMin) {
return true;
}
break;
case 'text':
if (mb_strlen($sValue, 'UTF-8') >= $iMin and mb_strlen($sValue, 'UTF-8') <= $iMax) {
return true;
}
break;
default:
return false;
}
return false;
}
/**
* Шифрование
*
* @param unknown_type $sData
* @return unknown
*/
function func_encrypt($sData)
{
return md5($sData);
}
/**
* Определяет IP адрес
*
* @return unknown
*/
function func_getIp()
{
// Если запускаем через консоль, то REMOTE_ADDR не определен
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
}
/**
* Заменяет стандартную header('Location: *');
*
* @param unknown_type $sLocation
*/
function func_header_location($sLocation)
{
$sProtocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
header("{$sProtocol} 301 Moved Permanently");
header('Location: ' . $sLocation);
exit();
}
/**
* Создаёт каталог по полному пути
*
* @param unknown_type $sBasePath
* @param unknown_type $sNewDir
*/
function func_mkdir($sBasePath, $sNewDir)
{
$sDirToCheck = rtrim($sBasePath, '/') . '/' . $sNewDir;
if (!is_dir($sDirToCheck)) {
@mkdir($sDirToCheck, 0755, true);
}
}
/**
* Рекурсивное удаление директории (со всем содержимым)
*
* @param string $sPath
* @return bool
*/
function func_rmdir($sPath)
{
if (!is_dir($sPath)) {
return true;
}
$sPath = rtrim($sPath, '/');
$aFiles = array_diff(scandir($sPath), array('.', '..'));
foreach ($aFiles as $sFile) {
(is_dir("$sPath/$sFile")) ? func_rmdir("$sPath/$sFile") : @unlink("$sPath/$sFile");
}
return @rmdir($sPath);
}
/**
* Возвращает обрезанный текст по заданное число слов
*
* @param unknown_type $sText
* @param unknown_type $iCountWords
*/
function func_text_words($sText, $iCountWords)
{
$aWords = preg_split('#[\s\r\n]+#um', $sText);
if ($iCountWords < count($aWords)) {
$aWords = array_slice($aWords, 0, $iCountWords);
}
return join(' ', $aWords);
}
/**
* Меняет числовые ключи массива на их значения
*
* @param unknown_type $arr
* @param unknown_type $sDefValue
*/
function func_array_simpleflip(&$arr, $sDefValue = 1)
{
foreach ($arr as $key => $value) {
if (is_int($key) and is_string($value)) {
unset($arr[$key]);
$arr[$value] = $sDefValue;
}
}
}
function func_build_cache_keys($array, $sBefore = '', $sAfter = '')
{
$aRes = array();
foreach ($array as $key => $value) {
$aRes[$value] = $sBefore . $value . $sAfter;
}
return $aRes;
}
function func_array_sort_by_keys($array, $aKeys)
{
$aResult = array();
foreach ($aKeys as $iKey) {
if (isset($array[$iKey])) {
$aResult[$iKey] = $array[$iKey];
}
}
return $aResult;
}
/**
* Сливает два ассоциативных массива
*
* @param unknown_type $aArr1
* @param unknown_type $aArr2
* @return unknown
*/
function func_array_merge_assoc($aArr1, $aArr2)
{
$aRes = $aArr1;
foreach ($aArr2 as $k2 => $v2) {
$bIsKeyInt = false;
if (is_array($v2)) {
foreach ($v2 as $k => $v) {
if (is_int($k)) {
$bIsKeyInt = true;
break;
}
}
}
if (is_array($v2) and !$bIsKeyInt and isset($aArr1[$k2])) {
$aRes[$k2] = func_array_merge_assoc($aArr1[$k2], $v2);
} else {
$aRes[$k2] = $v2;
}
}
return $aRes;
}
if (!function_exists('array_fill_keys')) {
function array_fill_keys($aArr, $values)
{
if (!is_array($aArr)) {
$aArr = array($aArr);
}
$aArrOut = array();
foreach ($aArr as $key => $value) {
$aArrOut[$value] = $values;
}
return $aArrOut;
}
}
if (!function_exists('array_intersect_key')) {
function array_intersect_key($isec, $keys)
{
$argc = func_num_args();
if ($argc > 2) {
for ($i = 1; !empty($isec) && $i < $argc; $i++) {
$arr = func_get_arg($i);
foreach (array_keys($isec) as $key) {
if (!isset($arr[$key])) {
unset($isec[$key]);
}
}
}
return $isec;
} else {
$res = array();
foreach (array_keys($isec) as $key) {
if (isset($keys[$key])) {
$res[$key] = $isec[$key];
}
}
return $res;
}
}
}
if (!function_exists('class_alias')) {
function class_alias($original, $alias)
{
if (!class_exists($original)) {
return false;
}
eval('abstract class ' . $alias . ' extends ' . $original . ' {}');
return true;
}
}
function func_underscore($sStr)
{
2024-06-02 12:57:11 +03:00
return strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", (string) $sStr));
2024-06-02 09:37:06 +03:00
}
function func_camelize($sStr)
{
$aParts = explode('_', $sStr);
$sCamelized = '';
foreach ($aParts as $sPart) {
$sCamelized .= ucfirst($sPart);
}
return $sCamelized;
}
function func_list_plugins($bAll = false)
{
$sPluginsDir = Config::Get('path.application.plugins.server');
$sPluginsListFile = $sPluginsDir . '/' . Config::Get('sys.plugins.activation_file');
$aPlugin = array();
if ($bAll) {
$aPluginRaw = array();
$aPaths = glob("$sPluginsDir/*", GLOB_ONLYDIR);
if ($aPaths) {
foreach ($aPaths as $sPath) {
$aPluginRaw[] = basename($sPath);
}
}
} else {
if ($aPluginRaw = @file($sPluginsListFile)) {
$aPluginRaw = array_map('trim', $aPluginRaw);
$aPluginRaw = array_unique($aPluginRaw);
}
}
if ($aPluginRaw) {
foreach ($aPluginRaw as $sPlugin) {
$sPluginXML = "$sPluginsDir/$sPlugin/plugin.xml";
if (is_file($sPluginXML)) {
$aPlugin[] = $sPlugin;
}
}
}
return $aPlugin;
}
function func_convert_entity_to_array(Entity $oEntity, $aMethods = null, $sPrefix = '')
{
if (!is_array($aMethods)) {
$aMethods = get_class_methods($oEntity);
}
$aEntity = array();
foreach ($aMethods as $sMethod) {
if (!preg_match('#^get([a-z][a-z\d]*)$#i', $sMethod, $aMatch)) {
continue;
}
$sProp = strtolower(preg_replace('#([a-z])([A-Z])#', '$1_$2', $aMatch[1]));
$mValue = call_user_func(array($oEntity, $sMethod));
$aEntity[$sPrefix . $sProp] = $mValue;
}
return $aEntity;
}
function func_method_exists($mObject, $sMethod, $sType = null)
{
$oRef = new ReflectionClass($mObject);
if ($oRef->hasMethod($sMethod)) {
if (is_null($sType)) {
return true;
}
$oMethod = $oRef->getMethod($sMethod);
switch ($sType) {
case "static":
return $oMethod->isStatic();
break;
case "public":
return $oMethod->isPublic();
break;
case "protected":
return $oMethod->isProtected();
break;
case "private":
return $oMethod->isPrivate();
break;
}
}
return false;
}
function func_array_unshift_assoc(&$aArr, $sKey, $mVal)
{
$aArr = array_reverse($aArr, true);
$aArr[$sKey] = $mVal;
$aArr = array_reverse($aArr, true);
}
function func_ini_return_bytes($sSizeStr)
{
switch (substr($sSizeStr, -1)) {
case 'M':
case 'm':
return (int)$sSizeStr * 1048576;
case 'K':
case 'k':
return (int)$sSizeStr * 1024;
case 'G':
case 'g':
return (int)$sSizeStr * 1073741824;
default:
return $sSizeStr;
}
}
/**
* Позволяет получить значение объекта в многомерном массиве задав путь до него
*
* @param array $aArr Массив с данными, например: [ "user" => [ "name" => "John", "id" => 15 ] ]
* @param array $aKeys Путь до объекта, например: [ "user", "name" ]
* @return mixed Значение параметра, путь до которого указан в $aKeys
*/
function func_array_multisearch($aArr, $aKeys)
{
$mTemp = $aArr;
foreach ($aKeys as $mKey) {
if (!isset($mTemp[$mKey])) return false;
$mTemp = $mTemp[$mKey];
}
return $mTemp;
}