' . print_r($arr, true) . ''; } function get_href_by_id($id) { global $pdo; $q = $pdo->prepare("SELECT url FROM page WHERE id = :id"); $q->execute(["id" => $id]); $PG = $q->fetchAll(PDO::FETCH_ASSOC); if (count($PG) == 1) return $PG[0]['url']; else return '/'; } function upfolder($arr) { $res = '/'; for ($i = 0; $i < count($arr) - 1; $i++) { $res .= $arr[$i] . '/'; } return $res; } function gpx_to_json($gpx_file_name) { $gpx_path = __DIR__ . '/../data/files/' . $gpx_file_name; if (file_exists($gpx_path)) { try { $gpx_json = '{"res": "ok", "segments": ['; $gpx = new SimpleXMLElement(file_get_contents($gpx_path)); $segment_counter = 0; foreach ($gpx->trk->trkseg as $segment) { $segment_counter++; $gpx_json .= (($segment_counter > 1) ? ',' : '') . '{"segment_index": ' . json_encode($segment_counter) . ', "coords": ['; $pt_counter = 0; foreach ($segment->trkpt as $pt) { $pt_counter++; $gpx_json .= (($pt_counter > 1) ? ',' : '') . '{"idx": ' . $pt_counter . ', "lat": ' . $pt['lat'] . ', "lon": ' . $pt['lon'] . ', "time": "' . $pt->time . '"}'; } $gpx_json .= ']}'; } $gpx_json .= '], "way_points": ['; $wpt_counter = 0; foreach ($gpx->wpt as $wpt) { $wpt_counter++; $gpx_json .= (($wpt_counter > 1) ? ',' : '') . '{"idx": ' . $wpt_counter . ', "lat": ' . $wpt['lat'] . ', "lon": ' . $wpt['lon'] . ', "name": "' . $wpt->name . '"}'; } $gpx_json .= ']'; $gpx_json .= '}'; return $gpx_json; } catch (Exception $ex) { return '{"error": ' . json_encode($ex->getMessage()) . '}'; } } else return '{"error": "no_file", "path": ' . json_encode($gpx_path) . '}'; } function num_word($value, $words, $show = true) { $num = $value % 100; if ($num > 19) { $num = $num % 10; } $out = ($show) ? $value . ' ' : ''; switch ($num) { case 1: $out .= $words[0]; break; case 2: case 3: case 4: $out .= $words[1]; break; default: $out .= $words[2]; break; } return $out; } function href_get_vars($url, $pg, $filter_str) { $tail = ''; if ($pg > 1) $tail .= '?page=' . $pg; if ($filter_str != '') $tail .= (($tail != '') ? '&' : '?') . $filter_str; return $url . $tail; } function get_id_by_alias($alias, $module_id, $lev) { global $pdo; $query = $pdo->prepare("SELECT id FROM page WHERE alias = :alias AND module_id = :module_id AND lev = :lev"); if ($query->execute(["alias" => $alias, "module_id" => $module_id, "lev" => $lev])) { $res = $query->fetch(PDO::FETCH_ASSOC); return $res['id']; } else return -1; return 0; } function get_url_by_id($id) { global $pdo; $pg = $pdo->prepare("SELECT url FROM page WHERE id = :id"); $pg->execute(["id" => $id]); $URL = $pg->fetch(PDO::FETCH_ASSOC); return $URL['url']; } function get_page_vals($id, $lang) { global $pdo; $VALS = []; $vals_query = $pdo->prepare("SELECT module_field_val.*, module_field.field_code_name, module_field.field_typ FROM module_field_val, module_field WHERE module_field_val.page_id = :page_id AND module_field_val.lang = :lang and module_field.id = module_field_val.field_id"); $vals_query->execute(["page_id" => $id, "lang" => $lang]); while ($VAL = $vals_query->fetch(PDO::FETCH_ASSOC)) { $var_val = null; switch ($VAL['field_typ']) { case 1: case 2: case 9: $var_val = $VAL['str_val']; break; case 3: case 7: case 10: $var_val = $VAL['num_val']; break; case 4: $var_val = $VAL['dt_val']; break; case 6: $var_val = htmlspecialchars_decode($VAL['text_val']); break; case 8: if (isset($VALS[$VAL['field_code_name']])) $var_val = $VALS[$VAL['field_code_name']]; $var_val[] = $VAL['str_val']; break; case 11: $var_val = explode('#%#', $VAL['str_val']); if ($var_val[count($var_val) - 1] == '') unset($var_val[count($var_val) - 1]); break; } $VALS[$VAL['field_code_name']] = $var_val; } return $VALS; } function generate_menu_item($cur_item, $lang) { global $pdo; return false; } function safe_post($data, $typ) { global $pdo; switch ($typ) { case "text_sql": $data = strip_tags($data); $data = htmlspecialchars($data); $data = $pdo->quote($data); break; case "text_path": $data = strip_tags($data); $data = htmlspecialchars($data); $data = $pdo->quote($data); $data = substr($data, 1, strlen($data) - 2); break; } return $data; } function safe_post_nullable($data, $typ, $null_vals) { global $pdo; switch ($typ) { case "array": if (!is_array($data) || count($data) == 0) $data = null; break; case "int": $data = (int)$data; break; case "str": $data = strip_tags($data); break; case "float": $data = (float)$data; break; default: break; } if (in_array($data, $null_vals)) $data = null; return $data; } function generate_password($number) { $arr = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6'); // Генерируем пароль $pass = ""; for ($i = 0; $i < $number; $i++) { // Вычисляем случайный индекс массива $index = rand(0, count($arr) - 1); $pass .= $arr[$index]; } return $pass; } function generate_pin($number) { $arr = array('1', '2', '3', '4', '5', '6', '7', '8', '9'); // Генерируем пин-код $pin = ""; for ($i = 0; $i < $number; $i++) { // Вычисляем случайный индекс массива $index = rand(0, count($arr) - 1); $pin .= $arr[$index]; } return $pin; } function format_dt($dt1, $tm1 = false, $dt2 = null, $tm2 = false) { $res = ''; $dt_str1 = explode(" ", $dt1); if ($tm1) $tm_str1 = explode(":", $dt_str1[1]); $dt_str1 = explode("-", $dt_str1[0]); $res = $dt_str1[2] . ' ' . return_full_month_rp(intval($dt_str1[1])) . ' ' . $dt_str1[0] . ' г.'; if (($dt2 != null) and ($dt1 != $dt2)) { $dt_str2 = explode(" ", $dt2); if ($tm2) $tm_str2 = explode(":", $dt_str2[1]); $dt_str2 = explode("-", $dt_str2[0]); if ($dt_str2[1] == $dt_str1[1]) $res = $dt_str1[2] . ' - ' . $dt_str2[2] . ' ' . return_full_month_rp($dt_str1[1]) . ' ' . $dt_str1[0] . ' г. '; else if ($dt_str1[0] == $dt_str2[0]) $res = $dt_str1[2] . ' ' . return_full_month_rp($dt_str1[1]) . ' - ' . $dt_str2[2] . ' ' . return_full_month_rp($dt_str2[1]) . ' ' . $dt_str1[0] . ' г.'; else $res = $dt_str1[2] . ' ' . return_full_month_rp($dt_str1[1]) . ' ' . $dt_str1[0] . 'г. - ' . $dt_str2[2] . ' ' . return_full_month_rp($dt_str2[1]) . ' ' . $dt_str2[0] . ' г.'; } return $res; } function get_spr_value($val_id, $get_vals = false, $return_value = null) { global $pdo; $pg = $pdo->prepare("SELECT * FROM page WHERE id = :id"); $pg->execute(["id" => $val_id]); $PAGE = $pg->fetch(PDO::FETCH_ASSOC); return $PAGE['caption']; } function return_full_month($int) { if ($int == 1) return 'январь'; if ($int == 2) return 'февраль'; if ($int == 3) return 'март'; if ($int == 4) return 'апрель'; if ($int == 5) return 'май'; if ($int == 6) return 'июнь'; if ($int == 7) return 'июль'; if ($int == 8) return 'август'; if ($int == 9) return 'сентябрь'; if ($int == 10) return 'октябрь'; if ($int == 11) return 'ноябрь'; if ($int == 12) return 'декабрь'; } function return_full_month_rp($int) { if ($int == 1) return 'января'; if ($int == 2) return 'февраля'; if ($int == 3) return 'марта'; if ($int == 4) return 'апреля'; if ($int == 5) return 'мая'; if ($int == 6) return 'июня'; if ($int == 7) return 'июля'; if ($int == 8) return 'августа'; if ($int == 9) return 'сентября'; if ($int == 10) return 'октября'; if ($int == 11) return 'ноября'; if ($int == 12) return 'декабря'; } function readCache($filename) { $path = __DIR__ . '/../cache/' . $filename; if (file_exists($path)) { $cache = file($path); return implode('', $cache); } return FALSE; } function writeCache($content, $filename) { $fp = fopen(__DIR__ . '/../cache/' . $filename, 'w'); fwrite($fp, $content); fclose($fp); } function getExtension2($filename) { $path_info = pathinfo($filename); return $path_info['extension']; } function send_mime_mail($name_from, // имя отправителя $email_from, // email отправителя $name_to, // имя получателя $email_to, // email получателя $data_charset, // кодировка переданных данных $send_charset, // кодировка письма $subject, // тема письма $body // текст письма ) { $to = mime_header_encode($name_to, $data_charset, $send_charset) . ' <' . $email_to . '>'; $subject = mime_header_encode($subject, $data_charset, $send_charset); $from = mime_header_encode($name_from, $data_charset, $send_charset) . ' <' . $email_from . '>'; if ($data_charset != $send_charset) { $body = mb_iconv($data_charset, $send_charset, $body); } $headers = "From: $from\r\n"; $headers .= "Content-type: text/html; charset=$send_charset\r\n"; return mail($to, $subject, $body, $headers); } function bool_to_int($boll_val) { if ($boll_val) return 1; else return 0; } function send_mime_mail_file($name_from, // имя отправителя $email_from, // email отправителя $name_to, // имя получателя $email_to, // email получателя $data_charset, // кодировка переданных данных $send_charset, // кодировка письма $subject, // тема письма $body, // текст письма $path ) { $to = mime_header_encode($name_to, $data_charset, $send_charset) . ' <' . $email_to . '>'; $subject = mime_header_encode($subject, $data_charset, $send_charset); $from = mime_header_encode($name_from, $data_charset, $send_charset) . ' <' . $email_from . '>'; $fp = fopen($path, "rb"); $file = fread($fp, filesize($path)); fclose($fp); $name = "docs.zip"; $EOL = "\r\n"; $boundary = "--" . md5(uniqid(time())); $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $headers .= "From: $from"; if ($data_charset != $send_charset) { $body = iconv($data_charset, $send_charset, $body); } $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=windows-1251$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; // раздел между заголовками и телом html-части $multipart .= chunk_split(base64_encode($body)); $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL"; $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($file)); $multipart .= "$EOL--$boundary--$EOL"; //$headers = "From: $from\r\n"; //$headers .= "Content-type: text/html; charset=$send_charset\r\n"; return mail($to, $subject, $multipart, $headers); } function mime_header_encode($str, $data_charset, $send_charset) { if ($data_charset != $send_charset) { $str = iconv($data_charset, $send_charset, $str); } return '=?' . $send_charset . '?B?' . base64_encode($str) . '?='; } function MYSQL_MultiPolygon_to_LatLangs($txt) { if ($txt == '') { return null; } else { $txt = str_replace(['MULTIPOLYGON(((', ')))'], '', $txt); $features_array = explode(')),((', $txt); for ($i = 0; $i < count($features_array); $i++) { $cur_feature_polys = explode('),(', $features_array[$i]); for ($j = 0; $j < count($cur_feature_polys); $j++) { $points = explode(',', $cur_feature_polys[$j]); for ($k = 0; $k < count($points); $k++) { $points[$k] = explode(' ', $points[$k]); $points[$k] = [$points[$k][1], $points[$k][0]]; } $cur_feature_polys[$j] = $points; } $features_array[$i] = $cur_feature_polys; } return $features_array; } } function get_os($agent) { $os = array ( 'Windows' => 'Win', 'Open BSD'=>'OpenBSD', 'Sun OS'=>'SunOS', 'Linux'=>'(Linux)|(X11)', 'Mac OS'=>'(Mac_PowerPC)|(Macintosh)', 'QNX'=>'QNX', 'BeOS'=>'BeOS', 'OS/2'=>'OS/2' ); foreach($os as $key=>$value) { if (preg_match('#'.$value.'#i', $agent)) return $key; } return 'Unknown'; } function get_browser_name($agent) { preg_match("/(MSIE|Opera|Firefox|Chrome|Version|Opera Mini|Netscape|Konqueror|SeaMonkey|Camino|Minefield|Iceweasel|K-Meleon|Maxthon)(?:\/| )([0-9.]+)/", $agent, $browser_info); // регулярное выражение, которое позволяет отпределить 90% браузеров list(,$browser,$version) = $browser_info; // получаем данные из массива в переменную if (preg_match("/Opera ([0-9.]+)/i", $agent, $opera)) return 'Opera '.$opera[1]; // определение _очень_старых_ версий Оперы (до 8.50), при желании можно убрать if ($browser == 'MSIE') { // если браузер определён как IE preg_match("/(Maxthon|Avant Browser|MyIE2)/i", $agent, $ie); // проверяем, не разработка ли это на основе IE if ($ie) return $ie[1].' based on IE '.$version; // если да, то возвращаем сообщение об этом return 'IE'; // иначе просто возвращаем IE и номер версии } if ($browser == 'Firefox') { // если браузер определён как Firefox preg_match("/(Flock|Navigator|Epiphany)\/([0-9.]+)/", $agent, $ff); // проверяем, не разработка ли это на основе Firefox if ($ff) return $ff[1]; // если да, то выводим номер и версию } if ($browser == 'Opera' && $version == '9.80') return 'Opera'; // если браузер определён как Opera 9.80, берём версию Оперы из конца строки if ($browser == 'Version') return 'Safari'; // определяем Сафари if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; // для неопознанных браузеров проверяем, если они на движке Gecko, и возращаем сообщение об этом return $browser; // для всех остальных возвращаем браузер и версию } if ((isset($_SESSION['user'])) AND (isset($_COOKIE['csrf'])) AND (isset($_SESSION['secret'])) AND (substr($_COOKIE['csrf'], 0, 10) . MD5(substr($_COOKIE['csrf'], 0, 10) . ":" . $_SESSION['secret']) == $_COOKIE['csrf']) AND ($_SESSION['user']['id'])) { function create_guid() //Генераци GUID { static $guid = ''; $uid = uniqid("", true); $data = ""; $data .= $_SERVER['REQUEST_TIME']; $data .= $_SERVER['HTTP_USER_AGENT']; $data .= $_SERVER['SERVER_ADDR']; $data .= $_SERVER['REMOTE_ADDR']; $data .= $_SERVER['REMOTE_PORT']; $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data))); $guid = substr($hash, 0, 8) . '-' . substr($hash, 8, 4) . '-' . substr($hash, 12, 4) . '-' . substr($hash, 16, 4) . '-' . substr($hash, 20, 12); return $guid; } function clear_menu_cache($menu_id) { $cahe_path = __DIR__ . "/../cache/"; foreach (glob($cahe_path . "*_m_" . $menu_id . "*.cache") as $filename) { unlink($filename); } } function create_thumbnail($path, $save, $width, $height) { $info = getimagesize($path); //получаем размеры картинки и ее тип $size = array($info[0], $info[1]); //закидываем размеры в массив if (($width == 0) and ($height == 0)) { copy($path, $save); } else { //В зависимости от расширения картинки вызываем соответствующую функцию if ($info['mime'] == 'image/png') { $src = imagecreatefrompng($path); //создаём новое изображение из файла } else if ($info['mime'] == 'image/jpeg') { $src = imagecreatefromjpeg($path); } else if ($info['mime'] == 'image/gif') { $src = imagecreatefromgif($path); } else { return false; } if (($width != 0) and ($height != 0)) { $src_aspect = $size[0] / $size[1]; //отношение ширины к высоте исходника $thumb_aspect = $width / $height; //отношение ширины к высоте аватарки if ($src_aspect < $thumb_aspect) { //узкий вариант (фиксированная ширина) $scale = $width / $size[0]; $new_size = array($width, $width / $src_aspect); $src_pos = array(0, ($size[1] * $scale - $height) / $scale / 2); //Ищем расстояние по высоте от края картинки до начала картины после обрезки } else if ($src_aspect > $thumb_aspect) { //широкий вариант (фиксированная высота) $scale = $height / $size[1]; $new_size = array($height * $src_aspect, $height); $src_pos = array(($size[0] * $scale - $width) / $scale / 2, 0); //Ищем расстояние по ширине от края картинки до начала картины после обрезки } else { //другое $new_size = array($width, $height); $src_pos = array(0, 0); } $new_size[0] = max($new_size[0], 1); $new_size[1] = max($new_size[1], 1); } else { if ($height == 0) { $new_size[0] = $width; $new_size[1] = ceil($width * ($info[1] / $info[0])); } if ($width == 0) { $new_size[1] = $height; $new_size[0] = ceil($height * ($info[0] / $info[1])); } $src_pos = array(0, 0); //echo $new_size[0].' - '.$new_size[1]; } $thumb = imagecreatetruecolor($new_size[0], $new_size[1]); //возвращает идентификатор изображения, представляющий черное изображение заданного размера $transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127); imagefill($thumb, 0, 0, $transparent); imagesavealpha($thumb, true); // save alphablending setting (important); imagecopyresampled($thumb, $src, 0, 0, $src_pos[0], $src_pos[1], $new_size[0], $new_size[1], $size[0], $size[1]); //Копирование и изменение размера изображения с ресемплированием if ($save === false) { return imagepng($thumb); //Выводит JPEG/PNG/GIF изображение } else { return imagepng($thumb, $save);//Сохраняет JPEG/PNG/GIF изображение } } } function MultiPolygonArrayToMYSQL($arr) { $res = 'MULTIPOLYGON('; for ($i = 0; $i < count($arr); $i++) { $res .= (($i > 0) ? ',' : '') . '('; for ($j = 0; $j < count($arr[$i]); $j++) { if (count($arr[$i][$j]) > 2) { $res .= (($j > 0) ? ',' : '') . '('; $k = 0; foreach ($arr[$i][$j] as $point) { $res .= (($k > 0) ? ',' : '') . $point[0] . ' ' . $point[1]; $k++; } $res .= ')'; } } $res .= ')'; } $res .= ')'; return $res; } function MultiPointToMYSQL($arr) { $res = 'MULTIPOLYGON('; for ($i = 0; $i < count($arr); $i++) { $res .= (($i > 0) ? ',' : '') . '('; for ($j = 0; $j < count($arr[$i]); $j++) { if (count($arr[$i][$j]) > 2) { $res .= (($j > 0) ? ',' : '') . '('; $k = 0; foreach ($arr[$i][$j] as $point) { $res .= (($k > 0) ? ',' : '') . $point[0] . ' ' . $point[1]; $k++; } $res .= ')'; } } $res .= ')'; } $res .= ')'; return $res; } function GeoJsonMultiPolygon_to_MYSQL($geojson) { $res = 'MULTIPOLYGON('; for ($i = 0; $i < count($geojson['features']); $i++) { $res .= (($i > 0) ? ',' : '') . '('; $cur_cord_array = $geojson['features'][$i]['geometry']['coordinates']; for ($j = 0; $j < count($cur_cord_array); $j++) { $res .= (($j > 0) ? ',' : '') . '('; $k = 0; foreach ($cur_cord_array[$j] as $point) { $res .= (($k > 0) ? ',' : '') . $point[0] . ' ' . $point[1]; $k++; } $res .= ')'; } $res .= ')'; } $res .= ')'; return $res; } function GeoJson_to_MYSQL($geojson, $typ) { $res = ''; foreach ($geojson as $item) { $res .= ($res != '' ? ',' : '') . $item[0] . ' ' . $item[1]; } if ($res != '') { switch ($typ) { case 'MULTIPOLYGON': return $typ . '(((' . $res . ')))'; break; case 'POLYGON': return $typ . '((' . $res . '))'; break; case 'LINESTRING': return $typ . '(' . $res . ')'; break; case 'POINT': return $typ . '(' . $geojson[1] . ' ' . $geojson[0] . ')'; break; default: return null; break; } } else return null; } function MYSQL_to_LatLangs($txt) { if ($txt == '') { return null; } else { $txt = str_replace(['POLYGON((', 'LINESTRING(', 'POINT('], '', $txt); $txt = str_replace(['))', ')'], '', $txt); $coords = explode(',', $txt); for ($i = 0; $i < count($coords); $i++) { $coords[$i] = explode(' ', $coords[$i]); $coords[$i] = [(float)$coords[$i][0], (float)$coords[$i][1]]; } //unset($coords[count($coords) - 1]); $res = $coords; return $res; } } function MYSQL_to_GEoJson_Polygon($txt) { if ($txt == '') { return null; } else { $txt = str_replace(['POLYGON((', 'LINESTRING('], '', $txt); $txt = str_replace(['))', ')'], '', $txt); $coords = explode(',', $txt); for ($i = 0; $i < count($coords); $i++) { $coords[$i] = explode(' ', $coords[$i]); } $res = ["typ" => "Feature", "geometry" => ["type" => "Polygon", "coordinates" => [[$coords]]]]; return $res; } } function getSQ($borders) { $S = 0; $min_x = 0; $min_y = 0; for ($i = 0; $i < count($borders); $i++) { $COORDS[] = array($borders[$i][1], $borders[$i][0], 0); if ($i > 0) { if ($COORDS[$i][0] < $min_x) $min_x = $COORDS[$i][0]; if ($COORDS[$i][1] < $min_y) $min_y = $COORDS[$i][1]; } else { $min_x = $COORDS[$i][0]; $min_y = $COORDS[$i][1]; } } $MC = array(); for ($i = 0; $i < count($COORDS); $i++) { $MC[] = array(getDistance($min_x, $COORDS[$i][1], $COORDS[$i][0], $COORDS[$i][1]), getDistance($COORDS[$i][0], $min_y, $COORDS[$i][0], $COORDS[$i][1])); } for ($i = 0; $i < count($MC); $i++) { if ($i < count($MC) - 1) $S = $S + ($MC[$i][0] * $MC[$i + 1][1] - $MC[$i + 1][0] * $MC[$i][1]); else $S = $S + ($MC[$i][0] * $MC[0][1] - $MC[0][0] * $MC[$i][1]); } $S = abs(ceil($S / 2)); return $S; } function getDistance($lat1, $lon1, $lat2, $lon2) { $lat1 *= M_PI / 180; $lat2 *= M_PI / 180; $lon1 *= M_PI / 180; $lon2 *= M_PI / 180; $d_lon = $lon1 - $lon2; $slat1 = sin($lat1); $slat2 = sin($lat2); $clat1 = cos($lat1); $clat2 = cos($lat2); $sdelt = sin($d_lon); $cdelt = cos($d_lon); $y = pow($clat2 * $sdelt, 2) + pow($clat1 * $slat2 - $slat1 * $clat2 * $cdelt, 2); $x = $slat1 * $slat2 + $clat1 * $clat2 * $cdelt; return atan2(sqrt($y), $x) * 6372795; } } css as $css) : ?> route->css as $css) : ?> route->media_css as $css) : ?> js['top'] as $js) : ?> route->js['top'] as $js) : ?> ATLAS CRM