Source for file func.common.php
Documentation is available at func.common.php
* Вычисление разницы между двумя метками времени
* @param string $a начальная метка
* @param string $b конечная метка
* @return int время между метками
list
($a_dec, $a_sec) =
explode(' ', $a);
list
($b_dec, $b_sec) =
explode(' ', $b);
return $b_sec -
$a_sec +
$b_dec -
$a_dec;
* Регистронезависимый вариант функции strpos
* Возвращает числовую позицию первого вхождения needle в строке haystack.
* @param unknown_type $haystack проверяемая строка
* @param unknown_type $needle искомая подстрока
* @param unknown_type $offset с какого символа в haystack начинать поиск.
* @return int числовая позиция
function stripos($haystack, $needle, $offset =
0)
* @param array $param значение и параметры
* @return string отформатированное значение
* Проверка начинается ли строка с указанной подстроки
* @param string $str проверяемая строка
* @param string $in подстрока
* @return boolean результат проверки
* Проверка прав пользователя
* @param string $action проверяемое право
* @return boolean результат проверки
if ((isset
($_SESSION['user_group']) &&
$_SESSION['user_group'] ==
1) ||
(isset
($_SESSION['alles']) &&
$_SESSION['alles'] ==
1) ||
(isset
($_SESSION[$action]) &&
$_SESSION[$action] ==
1))
* Очистка текста от програмного кода
* @param string $text исходный текст
* @return string очищенный текст
return str_replace(array('<?', '?>', '<script'), '', $text);
* Вывод системного сообщения
* @param string $message сообщение
echo
'<div style="background-color:#ff6;padding:5px;border:1px solid #f00;color:#f00;text-align:center;"><b>Системное сообщение: </b>' .
$message .
'</div>';
* Сообщение о запрете распечатки страницы
* Сообщение о проблемах доступа к файлам модуля
* Получение основных настроек
* @param string $field параметр настройки, если не указан - все параметры
$settings =
$AVE_DB->Query("SELECT * FROM " .
PREFIX .
"_settings")->FetchAssocArray();
if ($field ==
'') return $settings;
return isset
($settings[$field]) ?
$settings[$field] :
null;
static $navigations =
null;
if ($navigations ==
null)
$sql =
$AVE_DB->Query("SELECT * FROM " .
PREFIX .
"_navigation");
while ($row =
$sql->FetchRow())
$row->Gruppen =
explode(',', $row->Gruppen);
$navigations[$row->id] =
$row;
if ($navi_id ==
'') return $navigations;
return (isset
($navigations[$navi_id]) ?
$navigations[$navi_id] :
false);
* Проверка прав доступа к навигации по группе пользователя
* @param int $id идентификатор меню навигации
if (empty($navigation->Gruppen)) return false;
* Обработка парного тэга [hide:X,X]...[/hide] (скрытый текст)
* Заменяет скрываемый текст в зависимости от группы пользователя
* @param string $data обрабатываемый текст
* @return string обработанный текст
static $hidden_text =
null;
if (1 !=
preg_match('/\[hide:\d+(,\d+)*].*?\[\/hide]/s', $data)) return $data;
$data =
preg_replace('/\[hide:(\d+,)*' .
UGROUP .
'(,\d+)*].*?\[\/hide]/s', $hidden_text, $data);
$data =
preg_replace('/\[hide:\d+(,\d+)*](.*?)\[\/hide]/s', '\\2', $data);
* Получить идентификатор текущего документа
* @return int идентификатор текущего документа
$_REQUEST['id'] =
(isset
($_REQUEST['id']) &&
is_numeric($_REQUEST['id'])) ?
$_REQUEST['id'] :
1;
* Формирование URL редиректа
if ($exclude !=
'' &&
!is_array($exclude)) $exclude =
explode(',', $exclude);
foreach($_GET as $key =>
$value)
* Ссылка на главную страницу
* Ссылка на страницу версии для печати
$link .=
(strpos($link, '?')===
false ?
'?print=1' :
'&print=1');
if (isset
($_SERVER['HTTP_REFERER']))
$link =
(trim($link['host']) ==
$_SERVER['SERVER_NAME']);
function truncate_text($string, $length =
80, $etc =
'...', $break_words =
false, $middle =
false)
if ($length ==
0) return '';
if (strlen($string) >
$length)
if (!$break_words &&
!$middle)
return substr($string, 0, $length) .
$etc;
return substr($string, 0, $length/
2) .
$etc .
substr($string, -
$length/
2);
* Swap named HTML entities with numeric entities.
* @see http://www.lazycat.org/software/html_entity_decode_full.phps
'Aacute' =>
'Á', 'aacute' =>
'á', 'Acirc' =>
'Â', 'acirc' =>
'â', 'acute' =>
'´',
'AElig' =>
'Æ', 'aelig' =>
'æ', 'Agrave' =>
'À', 'agrave' =>
'à', 'alefsym' =>
'ℵ',
'Alpha' =>
'Α', 'alpha' =>
'α', 'amp' =>
'&', 'and' =>
'∧', 'ang' =>
'∠',
'Aring' =>
'Å', 'aring' =>
'å', 'asymp' =>
'≈', 'Atilde' =>
'Ã', 'atilde' =>
'ã',
'Auml' =>
'Ä', 'auml' =>
'ä', 'bdquo' =>
'„', 'Beta' =>
'Β', 'beta' =>
'β',
'brvbar' =>
'¦', 'bull' =>
'•', 'cap' =>
'∩', 'Ccedil' =>
'Ç', 'ccedil' =>
'ç',
'cedil' =>
'¸', 'cent' =>
'¢', 'Chi' =>
'Χ', 'chi' =>
'χ', 'circ' =>
'ˆ',
'clubs' =>
'♣', 'cong' =>
'≅', 'copy' =>
'©', 'crarr' =>
'↵', 'cup' =>
'∪',
'curren' =>
'¤', 'dagger' =>
'†', 'Dagger' =>
'‡', 'darr' =>
'↓', 'dArr' =>
'⇓',
'deg' =>
'°', 'Delta' =>
'Δ', 'delta' =>
'δ', 'diams' =>
'♦', 'divide' =>
'÷',
'Eacute' =>
'É', 'eacute' =>
'é', 'Ecirc' =>
'Ê', 'ecirc' =>
'ê', 'Egrave' =>
'È',
'egrave' =>
'è', 'empty' =>
'∅', 'emsp' =>
' ', 'ensp' =>
' ', 'Epsilon' =>
'Ε',
'epsilon' =>
'ε', 'equiv' =>
'≡', 'Eta' =>
'Η', 'eta' =>
'η', 'ETH' =>
'Ð',
'eth' =>
'ð', 'Euml' =>
'Ë', 'euml' =>
'ë', 'euro' =>
'€', 'exist' =>
'∃',
'fnof' =>
'ƒ', 'forall' =>
'∀', 'frac12' =>
'½', 'frac14' =>
'¼', 'frac34' =>
'¾',
'frasl' =>
'⁄', 'Gamma' =>
'Γ', 'gamma' =>
'γ', 'ge' =>
'≥', 'gt' =>
'>',
'harr' =>
'↔', 'hArr' =>
'⇔', 'hearts' =>
'♥', 'hellip' =>
'…', 'Iacute' =>
'Í',
'iacute' =>
'í', 'Icirc' =>
'Î', 'icirc' =>
'î', 'iexcl' =>
'¡', 'Igrave' =>
'Ì',
'igrave' =>
'ì', 'image' =>
'ℑ', 'infin' =>
'∞', 'int' =>
'∫', 'Iota' =>
'Ι',
'iota' =>
'ι', 'iquest' =>
'¿', 'isin' =>
'∈', 'Iuml' =>
'Ï', 'iuml' =>
'ï',
'Kappa' =>
'Κ', 'kappa' =>
'κ', 'Lambda' =>
'Λ', 'lambda' =>
'λ', 'lang' =>
'〈',
'laquo' =>
'«', 'larr' =>
'←', 'lArr' =>
'⇐', 'lceil' =>
'⌈', 'ldquo' =>
'“',
'le' =>
'≤', 'lfloor' =>
'⌊', 'lowast' =>
'∗', 'loz' =>
'◊', 'lrm' =>
'‎',
'lsaquo' =>
'‹', 'lsquo' =>
'‘', 'lt' =>
'<', 'macr' =>
'¯', 'mdash' =>
'—',
'micro' =>
'µ', 'middot' =>
'·', 'minus' =>
'−', 'Mu' =>
'Μ', 'mu' =>
'μ',
'nabla' =>
'∇', 'nbsp' =>
' ', 'ndash' =>
'–', 'ne' =>
'≠', 'ni' =>
'∋',
'not' =>
'¬', 'notin' =>
'∉', 'nsub' =>
'⊄', 'Ntilde' =>
'Ñ', 'ntilde' =>
'ñ',
'Nu' =>
'Ν', 'nu' =>
'ν', 'Oacute' =>
'Ó', 'oacute' =>
'ó', 'Ocirc' =>
'Ô',
'ocirc' =>
'ô', 'OElig' =>
'Œ', 'oelig' =>
'œ', 'Ograve' =>
'Ò', 'ograve' =>
'ò',
'oline' =>
'‾', 'Omega' =>
'Ω', 'omega' =>
'ω', 'Omicron' =>
'Ο', 'omicron' =>
'ο',
'oplus' =>
'⊕', 'or' =>
'∨', 'ordf' =>
'ª', 'ordm' =>
'º', 'Oslash' =>
'Ø',
'oslash' =>
'ø', 'Otilde' =>
'Õ', 'otilde' =>
'õ', 'otimes' =>
'⊗', 'Ouml' =>
'Ö',
'ouml' =>
'ö', 'para' =>
'¶', 'part' =>
'∂', 'permil' =>
'‰', 'perp' =>
'⊥',
'Phi' =>
'Φ', 'phi' =>
'φ', 'Pi' =>
'Π', 'pi' =>
'π', 'piv' =>
'ϖ',
'plusmn' =>
'±', 'pound' =>
'£', 'prime' =>
'′', 'Prime' =>
'″', 'prod' =>
'∏',
'prop' =>
'∝', 'Psi' =>
'Ψ', 'psi' =>
'ψ', 'quot' =>
'"', 'radic' =>
'√',
'rang' =>
'〉', 'raquo' =>
'»', 'rarr' =>
'→', 'rArr' =>
'⇒', 'rceil' =>
'⌉',
'rdquo' =>
'”', 'real' =>
'ℜ', 'reg' =>
'®', 'rfloor' =>
'⌋', 'Rho' =>
'Ρ',
'rho' =>
'ρ', 'rlm' =>
'‏', 'rsaquo' =>
'›', 'rsquo' =>
'’', 'sbquo' =>
'‚',
'Scaron' =>
'Š', 'scaron' =>
'š', 'sdot' =>
'⋅', 'sect' =>
'§', 'shy' =>
'­',
'Sigma' =>
'Σ', 'sigma' =>
'σ', 'sigmaf' =>
'ς', 'sim' =>
'∼', 'spades' =>
'♠',
'sub' =>
'⊂', 'sube' =>
'⊆', 'sum' =>
'∑', 'sup' =>
'⊃', 'sup1' =>
'¹',
'sup2' =>
'²', 'sup3' =>
'³', 'supe' =>
'⊇', 'szlig' =>
'ß', 'Tau' =>
'Τ',
'tau' =>
'τ', 'there4' =>
'∴', 'Theta' =>
'Θ', 'theta' =>
'θ', 'thetasym' =>
'ϑ',
'thinsp' =>
' ', 'THORN' =>
'Þ', 'thorn' =>
'þ', 'tilde' =>
'˜', 'times' =>
'×',
'trade' =>
'™', 'Uacute' =>
'Ú', 'uacute' =>
'ú', 'uarr' =>
'↑', 'uArr' =>
'⇑',
'Ucirc' =>
'Û', 'ucirc' =>
'û', 'Ugrave' =>
'Ù', 'ugrave' =>
'ù', 'uml' =>
'¨',
'upsih' =>
'ϒ', 'Upsilon' =>
'Υ', 'upsilon' =>
'υ', 'Uuml' =>
'Ü', 'uuml' =>
'ü',
'weierp' =>
'℘', 'Xi' =>
'Ξ', 'xi' =>
'ξ', 'Yacute' =>
'Ý', 'yacute' =>
'ý',
'yen' =>
'¥', 'Yuml' =>
'Ÿ', 'yuml' =>
'ÿ', 'Zeta' =>
'Ζ', 'zeta' =>
'ζ',
'zwj' =>
'‍', 'zwnj' =>
'‌'
if (isset
($table[$matches[1]])) return $table[$matches[1]];
else return $destroy ?
'' :
$matches[0];
* Замена некоторых символов на их сущности
* замена и исправление HTML-тэгов
return preg_replace(array("'©'" , "'®'" , "'<b>'i" , "'</b>'i" , "'<i>'i", "'</i>'i", "'<br>'i", "'<br/>'i"),
array('©', '®', '<strong>', '</strong>', '<em>' , '</em>' , '<br />' , '<br />'), $s);
* @param string $st строка для транслитерации
// $st = htmlspecialchars_decode($st);
// // Convert all named HTML entities to numeric entities
// $st = preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9]{1,7});/', 'convert_entity', $st);
// // Convert all numeric entities to their actual character
// $st = preg_replace('/&#x([0-9a-f]{1,7});/ei', 'chr(hexdec("\\1"))', $st);
// $st = preg_replace('/&#([0-9]{1,7});/e', 'chr("\\1")', $st);
$st =
strtr ($st, array('ье'=>
'ye', 'ъе'=>
'ye', 'ьи'=>
'yi', 'ъи'=>
'yi',
'ъо'=>
'yo', 'ьо'=>
'yo', 'ё'=>
'yo', 'ю'=>
'yu',
'я'=>
'ya', 'ж'=>
'zh', 'х'=>
'kh', 'ц'=>
'ts',
'ч'=>
'ch', 'ш'=>
'sh', 'щ'=>
'shch', 'ъ'=>
'', 'ь'=>
'')
$st =
strtr($st,'абвгдезийклмнопрстуфыэ',
'abvgdeziyklmnoprstufye');
array('/^[\/-]+|[\/-]+$|[^a-zа-яё0-9\/-]/', '/--+/', '/-*\/+-*/', '/\/\/+/'),
array('-', '-', '/', '/'),
* Подготовка имени файла или директории
$st =
preg_replace(array('/[^a-zа-яё0-9-]/', '/--+/'), '-', $st);
* Формирование ЧПУ для документов
* @param string $s ссылка или текст с ссылками
$doc_regex =
'/index.php(?:\?)id=(?:[0-9]+)&(?:amp;)*doc='.
(TRANSLIT_URL ?
'([a-z0-9\/-]+)' :
'([a-zа-яё0-9\/-]+)');
$page_regex =
'&(?:amp;)*(artpage|apage|page)=([{s}0-9]+)';
$s =
preg_replace($doc_regex.
$page_regex.
$page_regex.
$page_regex.
'/', ABS_PATH.
'$1/$2-$3/$4-$5/$6-$7'.
URL_SUFF, $s);
$mod_regex =
'/index.php(?:\?)module=(shop|forums|download)';
$s =
preg_replace($mod_regex.
'&(?:amp;)*page=([{s}]|\d+)/', ABS_PATH.
'$1-$2.html', $s);
$s =
preg_replace($mod_regex.
'&(?:amp;)*print=1/', ABS_PATH.
'$1-print.html', $s);
$s =
preg_replace($mod_regex.
'(?!&)/', ABS_PATH.
'$1.html', $s);
function reportLog($meldung, $typ =
0, $rub =
0)
INSERT INTO " .
PREFIX .
"_log
IpCode = '" .
addslashes($_SERVER['REMOTE_ADDR']) .
"',
Seite = '" .
addslashes($_SERVER['QUERY_STRING']) .
"',
LogTyp = '" . (int)
$typ .
"',
Rub = '" . (int)
$rub .
"'
static $document_fields =
array();
if (!is_numeric($document_id)) return false;
if (!isset
($document_fields[$document_id]))
" .
PREFIX .
"_document_fields AS doc_field
" .
PREFIX .
"_rubric_fields AS rub_field
ON RubrikFeld = rub_field.Id
" .
PREFIX .
"_documents AS doc
DokumentId = '" .
$document_id .
"'
while ($row =
$sql->FetchAssocArray())
$row['tpl_req_empty'] =
(trim($row['tpl_req']) ==
'');
$row['tpl_field_empty'] =
(trim($row['tpl_field']) ==
'');
if ($row['Inhalt'] ===
'')
$row['tpl_req'] =
preg_replace('/\[cp:not_empty](.*?)\[\/cp:not_empty]/si', '', $row['tpl_req']);
$row['tpl_req'] =
trim(str_replace(array('[cp:if_empty]','[/cp:if_empty]'), '', $row['tpl_req']));
$row['tpl_field'] =
preg_replace('/\[cp:not_empty](.*?)\[\/cp:not_empty]/si', '', $row['tpl_field']);
$row['tpl_field'] =
trim(str_replace(array('[cp:if_empty]','[/cp:if_empty]'), '', $row['tpl_field']));
$row['tpl_req'] =
preg_replace('/\[cp:if_empty](.*?)\[\/cp:if_empty]/si', '', $row['tpl_req']);
$row['tpl_req'] =
trim(str_replace(array('[cp:not_empty]','[/cp:not_empty]'), '', $row['tpl_req']));
$row['tpl_field'] =
preg_replace('/\[cp:if_empty](.*?)\[\/cp:if_empty]/si', '', $row['tpl_field']);
$row['tpl_field'] =
trim(str_replace(array('[cp:not_empty]','[/cp:not_empty]'), '', $row['tpl_field']));
$fields[$row['RubrikFeld']] =
$row;
$document_fields[$document_id] =
$fields;
return $document_fields[$document_id];
* Формирование строки имени пользователя
* При наличии всех параметров пытается сформировать строку <b>Имя Фамилия</b>
* Если задать $short=1 - формирует короткую форму <b>И. Фамилия</b>
* Когда отсутствует информация о Имени или Фамилии пытается сформировать
* строку на основе имеющихся данных, а если данных нет вообще - выводит
* имя анонимного пользователя которое задается в основных настройках системы.
* @todo добавить параметр 'anonymous' в настройки
* @param string $login логин пользователя
* @param string $first_name имя пользователя
* @param string $last_name фамилия пользователя
* @param int $short {0|1} признак формирования короткой формы
function get_username($login =
'', $first_name =
'', $last_name =
'', $short =
1)
if ($first_name !=
'' &&
$last_name !=
'')
if ($short ==
1) $first_name =
substr($first_name, 0, 1) .
'.';
elseif ($first_name !=
'' &&
$last_name ==
'')
elseif ($first_name ==
'' &&
$last_name !=
'')
// return get_settings('anonymous');
* Возвращает имя пользователя по его идентификатору
* @param int $id - идентификатор пользователя
FROM " .
PREFIX .
"_users
WHERE Id = '" . (int)
$id .
"'
$users[$id] =
!empty($row) ?
get_username($row->UserName, $row->Vorname, $row->Nachname, 1) :
get_username();
* Исправление форматирования даты
* Функцию можно использовать в шаблонах Smarty как модификатор
* @param string $string - дата отформатированная в соответствии с текущей локалью
* @param string $language - язык
$language =
ACP ?
$_SESSION['admin_language'] :
$_SESSION['user_language'];
'Январь' =>
'января', 'Февраль' =>
'февраля', 'Март' =>
'марта',
'Апрель' =>
'апреля', 'Май' =>
'мая', 'Июнь' =>
'июня',
'Июль' =>
'июля', 'Август' =>
'августа', 'Сентябрь'=>
'сентября',
'Октябрь' =>
'октября', 'Ноябрь' =>
'ноября', 'Декабрь' =>
'декабря',
'воскресенье'=>
'Воскресенье', 'понедельник'=>
'Понедельник', 'вторник' =>
'Вторник',
'среда' =>
'Среда', 'четверг' =>
'Четверг', 'пятница' =>
'Пятница',
return (isset
($pretty) ?
strtr($string, $pretty) :
$string);
* Формирование строки из случайных символов
* @param int $length количество символов в строке
* @param string $chars набор символов для формирования строки
* @return string сформированная строка
$chars =
'abcdefghijklmnopqrstuvwxyz';
$chars .=
'ABCDEFGHIJKLMNOPRQSTUVWXYZ';
$chars .=
'~!@#$%^&*()-_=+{[;:/?.,]}';
while (strlen($string) <
$length) $string .=
$chars[mt_rand(0, $clen)];
// if ($q) $s .= "\n<br>Количество запросов: " . $AVE_DB->DBStatisticGet('count') . ' шт. за ' . number_format($AVE_DB->DBStatisticGet('time')*1000, 3, ',', '.') . ' мксек.';
// if ($l) $s .= style=\"text-align:left;padding-left:30px\"><small><ol>" . $AVE_DB->DBStatisticGet('list') . '</ol></small></div>';
if ($q) $s .=
"\n<br>Количество запросов: " .
$AVE_DB->DBProfilesGet('count') .
' шт. за ' .
$AVE_DB->DBProfilesGet('time') .
' сек.';
if ($l) $s .=
$AVE_DB->DBProfilesGet('list');
return "\n\n<!-- BEGIN SMARTY TEMPLATE " .
$smarty->_current_file .
" -->\n".
$tpl_source.
"\n<!-- END SMARTY TEMPLATE " .
$smarty->_current_file .
" -->\n\n";
* @param int $status статус стран входящих в список
* <li>1 - активные страны</li>
* <li>0 - неактивные страны</li>
* если не указано возвращает список стран без учета статуса
LOWER(LandCode) AS LandCode,
" .
(($status !=
'') ?
"WHERE Aktiv = '" .
$status .
"'" :
'') .
"
while ($row =
$sql->FetchRow()) array_push($countries, $row);
* @param string $fromemail
* @param string $content_type
function send_mail($to, $text, $subject =
'', $fromemail =
'', $from =
'', $content_type =
'', $attach =
'', $html =
'')
require_once(BASE_DIR .
'/class/class.phpmailer.php');
$PHPMailer =
new PHPMailer;
$PHPMailer->ContentType =
(get_settings('mail_content_type') ==
'text/plain' ||
$content_type ==
'text') ?
'text/plain' :
'text/html';
$PHPMailer->ContentType =
($html ==
1) ?
'text/html' :
$PHPMailer->ContentType;
$PHPMailer->From =
($fromemail !=
'') ?
$fromemail :
get_settings('mail_from');
$PHPMailer->FromName =
($from !=
'') ?
$from :
get_settings('mail_from_name');
$PHPMailer->AddAddress($to);
$PHPMailer->Subject =
$subject;
$PHPMailer->Body =
$text .
"\n\n" .
($PHPMailer->ContentType ==
'text/html' ?
'' :
get_settings('mail_signature'));
foreach ($attach as $attachment)
$PHPMailer->AddAttachment(BASE_DIR .
'/attachments/' .
$attachment);
$PHPMailer->AddAttachment(BASE_DIR .
'/attachments/' .
$attach);
// if (is_array($attach)) {
// foreach ($attach as $attachment) {
// @unlink(BASE_DIR . '/attachments/' . $attachment);
// @unlink(BASE_DIR . '/attachments/' . $attach);
Documentation generated on Fri, 04 Jun 2010 18:02:26 +0400 by phpDocumentor 1.4.3