Файл: inc/functions.php
Строк: 296
<?php
/*
################################################################################
### ###
### Cafe CMS ###
### http://cms.rad-li.ru ###
### mailto:rad-li@ya.ru ###
### ###
################################################################################
*/
/* Проверяем, установлена ли CMS
* Если файл /config.php не существует, выводим ошибку и предлагаем установку CMS
*/
function check_install () {
if (!file_exists ($_SERVER['DOCUMENT_ROOT'] . '/config.php')) {
print_error ('Файл настроек config.php не найден или к нему нет доступа. Возможно CMS не установлена.');
echo '<br>';
print_done ('Для установки системы перейдите по ссылке <a href="/install/index.php">http://' . $_SERVER[SERVER_NAME] . '/install/index.php</a>. Официальный сайт разработчика
<a href="http://cms.rad-li.ru">cms.rad-li.ru</a>');
exit;
} else {
include $_SERVER['DOCUMENT_ROOT'] . '/config.php';
}
}
/* Подключение к базе данных
* Данные для подключения берутся из файла /config.php
*/
function db_connect () {
@mysql_connect (DB_SERVER, DB_LOGIN , DB_PASSWORD) ?
(@mysql_select_db (DB_NAME) ? $status = true : $status = 'Не удалось подключиться к серверу БД! ' . mysql_error())
: $status = 'Невозможно открыть базу данных! ' . mysql_error();
@mysql_query ("SET NAMES UTF8");
if ($status !== true) {exit (print_error ($status));}
}
/* Загрузка модулей
* $module_name - имя модуля (например, photo)
*/
function load_module ($module_name) {
include $_SERVER['DOCUMENT_ROOT'] . '/admin/modules/' . $module_name . '.php';
}
/* Чистка принятых данных
*/
function clear_input ($input_data) {
if (is_array ($input_data)) {
foreach ($input_data AS $key => $value) {
$output_data[$key] = clear_input ($input_data[$key]);
}
} else {
if (get_magic_quotes_gpc () == 1) {
$input_data = stripslashes($input_data);
}
$input_data = trim ($input_data);
$output_data = mysql_real_escape_string ($input_data);
}
return $output_data;
}
/* Запись действий пользователей в журнал
*
* Входные данные:
* $type - тип действия пользователя,
* $status - статус действия (успех или ошибка),
* $level - уровень детализации.
*
* Всего три уровня детализации:
* 0 - ведение журнала отключено,
* 1 - записываются только самые важные события,
* 2 - записываются все события.
*
* В базу данных пишутся следующие данные:
* user - id пользователя,
* date - дата и время выполнения действия,
* type - тип действия,
* status - статус действия (успех или ошибка),
* ip - текущий ip-адрес пользователя,
* ua - user-agent пользователя
*/
function log_write ($type, $status, $level) {
if ($level <= LOG_LEVEL) {
if (empty ($_SESSION['id'])) $_SESSION['id'] = '0';
$add_log = "INSERT `" . DB_PREFIX . "_logs` (
`user`,
`date`,
`type`,
`status`,
`ip`
)
VALUES (
'" . $_SESSION['id'] . "',
'" . mktime () . "',
'" . $type . "',
'" . $status . "',
'" . $_SERVER['REMOTE_ADDR'] . "'
)";
@mysql_query ($add_log);
}
}
// Вывод сообщений об ошибках и успешных операциях
function print_message () {
global $error;
if (isset ($_GET['msg']) && in_array ($_GET['msg'], array ('del', 'add', 'pos', 'upd', 'bcp', 'err'))) {
$msg = $_GET['msg'];
$status_msg = array (
'pos' => 'Позиции обновлены.',
'add' => 'Запись успешно добавлена.',
'upd' => 'Запись успешно обновлена.',
'del' => 'Запись успешно удалена.',
'bcp' => 'Резервная копия создана.',
'err' => 'Ошибка при выполнении операции.',);
if (empty ($error)) {
print_done ($status_msg[$msg]);
log_write ($status_msg[$msg], 1, 2);
}
} else {
if (isset ($_GET['msg'])) $error .= 'Не корректный параметр msg.';
}
}
// Вывод ошибки, стили задаются в style.css текущего шаблона
function print_error ($message) {
echo '<div class="print_error">' . $message . '</div>';
}
// Вывод успешной операции, стили задаются в style.css текущего шаблона
function print_done ($message) {
echo '<div class="print_done">' . $message . '</div>';
}
// Высчитываем начальную и конечную запись для вывода на текущей странице
function page_limit ($page_limit) {
global $start_page;
global $end_page;
if (isset ($_GET['page'])) {
$start_page = $_GET['page'] * $page_limit - $page_limit;
$end_page = $page_limit;
} else {
$start_page = '0';
$end_page = $page_limit;
}
}
// Вывод списка страниц (пагинатор)
function pager ($page_count) {
if ($page_count>=2) {
echo "Страницы: ";
if ($_GET['page']) {
for ($page = 1; $page <= $page_count; $page++) {
if ($page == $_GET['page']) {
echo '<strong><span class="page-num">' . $page . '</span></strong>';
}
else {
echo '<a class="page-num" href="/admin/index.php?section=' . $_GET['section'] . '&action=list&page=' . $page . '">' . $page . '</a>';
}
}
}
if (!$_GET['page']) {
echo '<strong><span class="page-num">1</span></strong>';
for ($page = 2; $page <= $page_count; $page++) {
if ($page == $_GET['page']) {
echo '<strong><span class="page-num">' . $page . '</span></strong>';
}
else {
echo '<a class="page-num" href="/admin/index.php?section=' . $_GET['section'] . '&action=list&page=' . $page . '">' . $page . '</a>';
}
}
}
}
}
/* Перенаправление после запроса или вывод ошибки в случае неудачи
* $sql - запрос в БД,
* $path - куда переадресовать при успешном выполнении, если не указано - к списку
* $msg - сообщение при успешном выполнение
*/
function make_query ($sql, $msg, $path) {
if (!isset($path)) {$path = $_GET['section'];}
if (mysql_query ($sql)) {
header ('Location: /admin/index.php?section=' . $path . '&msg=' . $msg);
} else {
print_error ('Ошибка: ' . mysql_errno() . ': ' . mysql_error ());
}
}
// Удаляем запись из БД
// $section - из какого раздела/таблицы
// $id - номер записи в бд
function terminator () {
$id = $_GET['id'];
$delete = "DELETE FROM `" . DB_PREFIX . "_" . $_GET['section'] . "` WHERE `id` = " . $id . " LIMIT 1";
if ($_SESSION['status'] == '1') { // удалять может только администратор
if (mysql_query ($delete)) {
header ('Location: /admin/index.php?section=' . $_GET['section'] . '&action=list&msg=del');
} else {
print_error ('При удалении записи возникла ошибка: ' . mysql_errno() . ': ' . mysql_error () . '.');
}
} else {
print_error ('Не достаточно прав для удаления.');
}
}
// Очистка данных от html тегов
function clear_html ($include_data, $exclude_data) {
if (is_array ($include_data)) {
foreach ($include_data AS $key => $value) {
$output_data[$key] = clear_html ($include_data[$key], $exclude_data);
}
} else {
if (!in_array ($include_data, $exclude_data)) {
$output_data = htmlspecialchars ($include_data);
} else {
$output_data = $include_data;
}
}
return $output_data;
}
// Удаляем пробелы, табы, переносы строки
function clear_space ($in_data) {
$search = array("'[r|n|t]'", "'s{2,}'");
$replace = array(' ', ' ');
$out_data=preg_replace($search,$replace,trim($in_data));
return $out_data;
}
/* Транслитерирование строки
* Используется для перевода русских значений поля url в транслит
* Если значение поля url было пустое, вместо него берется значение поля title
*/
function translit ($origin_url, $title) {
global $url;
$arr = array (
'А' => 'a', 'а' => 'a',
'Б' => 'b', 'б' => 'b',
'В' => 'v', 'в' => 'v',
'Г' => 'g', 'г' => 'g',
'Д' => 'd', 'д' => 'd',
'Е' => 'e', 'е' => 'e',
'Ё' => 'yo', 'ё' => 'yo',
'Ж' => 'zh', 'ж' => 'zh',
'З' => 'z', 'з' => 'z',
'И' => 'i', 'и' => 'i',
'Й' => 'j', 'й' => 'j',
'К' => 'k', 'к' => 'k',
'Л' => 'l', 'л' => 'l',
'М' => 'm', 'м' => 'm',
'Н' => 'n', 'н' => 'n',
'О' => 'o', 'о' => 'o',
'П' => 'p', 'п' => 'p',
'Р' => 'r', 'р' => 'r',
'С' => 's', 'с' => 's',
'Т' => 't', 'т' => 't',
'У' => 'u', 'у' => 'u',
'Ф' => 'f', 'ф' => 'f',
'Х' => 'kh', 'х' => 'kh',
'Ц' => 'c', 'ц' => 'c',
'Ч' => 'ch', 'ч' => 'ch',
'Ш' => 'sh', 'ш' => 'sh',
'Щ' => 'shh', 'щ' => 'shh',
'Ъ' => '', 'ъ' => '',
'Ы' => 'y', 'ы' => 'y',
'Ь' => '', 'ь' => '',
'Э' => 'e', 'э' => 'e',
'Ю' => 'yu', 'ю' => 'yu',
'Я' => 'ya', 'я' => 'ya',
' ' => '-',
);
if ($origin_url == '') {$origin_url = $title;}
$key = array_keys ($arr);
$val = array_values ($arr);
$url = str_replace ($key,$val,$origin_url);
return preg_replace ("/[^a-z0-9-]/i", "", $url);
}
/* Перевод даты в таймстемп
* Входные данные имеют вид 12:45:56 17.12.2012
*/
function timestamp ($get_date) {
global $date;
$date = mktime (
substr ($get_date, 0, 2),
substr ($get_date, 3, 2),
substr ($get_date, 6, 2),
substr ($get_date, 12, 2),
substr ($get_date, 9, 2),
substr ($get_date, 15, 4));
return $date;
}
// Проверяем ошибки в переменных POST и GET
function check_error () {
global $error;
global $action;
$error = '';
// проверяем GET-запросы
if ($_GET) {
// проверяем id и pid
if (isset ($_GET['id']) && !ctype_digit ($_GET['id'])) {$error .= 'id должен состоять только из цифр.';}
if (isset ($_GET['pid']) && !ctype_digit ($_GET['pid'])) {$error .= 'pid должен состоять только из цифр.';}
// определяем разрешенные значения параметра action
if (isset ($_GET['action']) && !in_array ($_GET['action'], array ('list', 'add', 'delete', 'edit', 'view', 'category', 'comments', 'delete_category', 'add_category', 'edit_subcategory', 'add_subcategory', 'delete_comment', 'edit_category', 'edit_comment', 'backup', 'album_list', 'album_add', 'album_edit', 'album_view', 'album_delete'))) {
$action = 'list';
$error .= 'Не корректный параметр action.';
} else {
if (!empty ($_GET['action'])) {
$action = $_GET['action'];
} else {
$action = 'list';
}
}
// проверяем номер страницы
if (isset ($_GET['page']) && !ctype_digit ($_GET['page'])) {
$error .= 'Номер страницы должен быть цифрой.';
unset ($_GET['page']);
}
}
// проверяем POST-запросы
if ($_POST) {
// проверяем id
if ((isset ($_POST['id']) && $_POST['id'] !== '') && empty ($_POST['position']) && !ctype_digit ($_POST['id'])) {
$error .= 'id должен состоять только из цифр.' . $_POST['id'];
}
// проверяем pid
if (isset ($_POST['pid']) && empty ($_POST['position']) && !ctype_digit ($_POST['pid'])) {
$error .= 'pid должен состоять только из цифр.';
}
// значение параметра position должно быть цифрой
if (isset ($_POST['id']) && isset ($_POST['position'])) {
foreach ($_POST['id'] as $testcase) {
if (!ctype_digit ($testcase)) {
$error .= 'id должен состоять только из цифр.';
}
}
foreach ($_POST['position'] as $testcase) {
if (!ctype_digit ($testcase)) {
if ($testcase != "") {
$error .= 'position должно состоять только из цифр.';
}
}
}
}
}
}
/* Загрузка файлов
* Входные значения:
* $valid_types - разрешенные расширения файлов в виде массива,
* $valid_mime - то же для mime-типов
* $dl_path - путь для сохранения файла
*/
function file_upload ($valid_types, $valid_mime, $dl_path) {
$filenametmp = $_FILES['file']['name']; // расположение временного файла
$ext = strtolower (substr ($filenametmp, 1 + strrpos ($filenametmp, "."))); // расширение файла
// проверяем расширение файла
if (!in_array ($ext, $valid_types)) {
print_error ('Файл не загружен. Разрешена загрузка только файлов с расширениями $valid_types. <a href="javascript:history.back(1)">Назад</a>');
exit;
}
// перемещаем временный файл в нужный каталог
if (!copy ($_FILES["file"]["tmp_name"], $dl_path)) {
print_error ('При загрузке файла произошла ошибка. <a href="javascript:history.back(1)">Назад</a>');
exit;
}
}
/* Обрезка изображения
* $input_file - путь к изображению,
* $width - ширина изображения в пикселях,
* $height - высота изображения в пикселях,
* $output_file - путь для сохранения файла
* $quality - качество сжатия jpg в процентах
*/
function resize_pic ($input_file, $width, $height, $output_file, $quality) {
$src = imagecreatefromjpeg ($input_file);
$w_src = imagesx ($src);
$h_src = imagesy ($src);
// если изображение горизонтальное
if ($w_src>=$h_src) {
if ($w_src >= $width && $h_src >= $height) {$neww = $width; $newh = $height;
} else {$neww = $w_src; $newh = $h_src;}
$k1 = $neww/imagesx ($src);
$k2 = $newh/imagesy ($src);
$k = $k1 > $k2 ? $k2 : $k1;
$w = intval (imagesx ($src)*$k);
$h = intval (imagesy ($src)*$k);
$dest = imagecreatetruecolor ($w,$h);
imagecopyresampled ($dest, $src, 0, 0, 0, 0, $w, $h, imagesx ($src), imagesy ($src));
}
// если изображение векртикальное
if ($w_src < $h_src) {
if ($w_src >= $height && $h_src >= $height) {$neww = $height; $newh = $height;
} else {$neww = $w_src; $newh = $h_src;}
$k1 = $neww/imagesx ($src);
$k2 = $newh/imagesy ($src);
$k = $k1 > $k2 ? $k2 : $k1;
$w = intval (imagesx ($src)*$k);
$h = intval (imagesy ($src)*$k);
$dest = imagecreatetruecolor ($w, $h);
imagecopyresampled ($dest, $src, 0, 0, 0, 0, $w, $h, imagesx ($src), imagesy ($src));
}
// сохраняем
$save = imagejpeg ($dest, $output_file, $quality); //сохраняем рисунок в формате
// чистим память
imagedestroy ($dest);
}
/* Создаем квадратное превью из исходного изображения
* $input_file - путь к изображению,
* $width - ширина изображения в пикселях,
* $height - высота изображения в пикселях,
* $output_file - путь для сохранения файла
* $quality - качество сжатия jpg в процентах
*/
function crop_preview ($input_file, $width, $output_file, $quality) {
$src = imagecreatefromjpeg ($input_file);
$w_src = imagesx ($src);
$h_src = imagesy ($src);
// создаём пустую квадратную картинку
$dest = imagecreatetruecolor ($width, $width);
// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src > $h_src)
imagecopyresized ($dest, $src, 0, 0, round ((max ($w_src, $h_src) - min ($w_src, $h_src))/2), 0, $width, $width, min ($w_src, $h_src), min ($w_src, $h_src));
// вырезаем квадратную верхушку по y,
// если фото вертикальное
if ($w_src < $h_src)
imagecopyresized ($dest, $src, 0, 0, 0, 0, $width, $width, min($w_src, $h_src), min($w_src, $h_src));
// квадратная картинка масштабируется без вырезок
if ($w_src == $h_src)
imagecopyresized ($dest, $src, 0, 0, 0, 0, $width, $width, $w_src, $w_src);
// вывод картинки и очистка памяти
$save = Imagejpeg($dest, $output_file, $quality); //сохраняем рисунок в формате JPEG
imagedestroy($dest);
}
// Удаление файлов (для фотоальбома)
function files_delete ($file_id) {
$sql = mysql_query ("SELECT date FROM `" . DB_PREFIX . "_photos` WHERE `id` = $file_id");
$row = mysql_fetch_array ($sql, MYSQL_ASSOC);
$file_name = $row['date'];
unlink ("../upload/photo/original/" . $file_name . ".jpg");
unlink ("../upload/photo/220-220/" . $file_name . ".jpg");
unlink ("../upload/photo/800-600/" . $file_name . ".jpg");
}
// Выводим счетчик с указанным id
function print_counter ($id) {
$counter_list = mysql_query ("SELECT code FROM `" . DB_PREFIX . "_stats` WHERE `status` = '1' && `id` = " . $id);
while ($row = mysql_fetch_array ($counter_list, MYSQL_ASSOC)) {
echo $row['code'] . "rn";
}
}
// Формируем содержимое страницы
function get_page () {
global $page_title;
global $page_text;
global $page_keywords;
global $page_description;
$url = $_GET['url'];
$section = $_GET['section'];
if (isset ($url) && $url !== 'main') {
$page_list = mysql_query ("SELECT * FROM `" . DB_PREFIX . "_" . $section . "` WHERE `url` = '" . $url . "' && `position` != '0' LIMIT 1");
while ($row = mysql_fetch_array ($page_list, MYSQL_ASSOC)) {
$page_title = $row['title'];
$page_text = $row['text'];
$page_keywords = $row['keywords'];
$page_description = $row['description'];
}
} else {
$main_page = mysql_query ("SELECT * FROM `" . DB_PREFIX . "_pages` WHERE `url` = 'main' && `position` != '0' LIMIT 1");
if (mysql_num_rows ($main_page) < '1') {
$page_text = 'Не создано ни одной страницы или главная страница не выбрана. Если вы являетесь администратором сайта, перейдите в панель управления и создайте новые страницы.';
}
while ($row = mysql_fetch_array ($main_page, MYSQL_ASSOC)) {
$page_text = $row['text'];
$page_keywords = $row['keywords'];
$page_description = $row['description'];
}
}
if (isset ($page_list) && mysql_num_rows ($page_list) < '1') {
header ("Status: 404 Not Found");
header ("HTTP/1.0 404 Not Found");
$page_text = 'Страница не найдена.';
}
}
// Выводим список страниц без подстраниц
function page_list () {
$menu_list = mysql_query ("SELECT * FROM `" . DB_PREFIX . "_pages` WHERE position != '0' && position != '' && `pid` = '0' ORDER BY `position`");
if (mysql_num_rows ($menu_list) > '0') {
while ($rows = mysql_fetch_array ($menu_list)) {
$id = $rows['id'];
$title = $rows['title'];
$url = $rows['url'];
echo '<p><a href="/index.php?section=pages&url=' . $url . '">' . $title . '</a><p>';
}
}
}
/*// Выводим список страниц
function page_list () {
$menu_list = mysql_query ("SELECT * FROM `" . DB_PREFIX . "_pages` WHERE position != '0' && position != '' ORDER BY `position`");
if (mysql_num_rows ($menu_list) > '0') {
while ($rows = mysql_fetch_array ($menu_list)) {
$data[] = array (
'id' => $rows['id'],
'pid' => $rows['pid'],
'title' => $rows['title'],
'url' => $rows['url']
);
}
$tree = array ();
foreach ($data as $row) {
$tree[(int) $row['pid']][] = $row;
}
function treePrint ($tree, $pid=0) {
if (empty ($tree[$pid]))
return;
echo '<ul>';
foreach ($tree[$pid] as $k => $row) {
echo '
<li class="page-list-tree">
<div class="page-list-item">
<a href="/index.php?section=' . $rows['section'] . '&url=' . $row['url'] . '">' . $row['title'] . '</a>
</div>';
if (isset ($tree[$row['id']]))
treePrint ($tree, $row['id']);
echo '</li>';
}
echo '</ul>';
}
treePrint($tree);
}
}*/
?>