exec("CREATE TABLE `configs` ( name TEXT PRIMARY KEY, -- Имя value TEXT -- Значение )"); // Заполняем значениями по умолчанию $db->exec("INSERT INTO configs (name, value) VALUES ('path', '/var/www/www-root/data/www/')"); // 12345 == 827ccb0eea8a706c4c34a16891f84e7b $db->exec("INSERT INTO configs (name, value) VALUES ('pass', '".md5('12345')."')"); // Создаем таблицу DROPS - содержащую спилок доменво $db->exec("CREATE TABLE `drops` ( id INTEGER PRIMARY KEY, -- ID name TEXT, -- Имя домена tag TEXT -- Тэг для вставки )"); // Заполняем значениями по умолчанию $db->exec("INSERT INTO drops (name, tag) VALUES ('0td24.ru', '')"); $db->exec("INSERT INTO drops (name, tag) VALUES ('1apple.ru', '')"); $db->exec("INSERT INTO drops (name, tag) VALUES ('43mb.ru', '')"); // Создаем таблицу ARTICLES - содержащую спилок доменво $db->exec("CREATE TABLE `articles` ( id INTEGER PRIMARY KEY, -- ID id_drop INTEGER, -- Имя домена url TEXT, -- url статьи item TEXT -- Пункт меню )"); } // Если невозможно создать или открыть базу if ( ! $db) die('Unable to create or open database.'); // Получаем настройки $conf = conf_get($db); /*=============================================================================================== */ /*========================================================================================== POST */ /*=============================================================================================== */ // Авторизация ----------------------------------------------------------------- if (isset($_POST['login']) && ! $auth) { // Получаем введенный пароль $pass = isset($_POST['auth-pass']) ? md5(trim($_POST['auth-pass'])) : ''; // Если пароли совпадают то устанавливаем авторизацию if ($conf['pass'] == $pass) $auth = $_SESSION['auth'] = true; // Иначе выводим сообщение об ошибке else messages_add('Пароль не верен.', 'errors'); } // Выход ----------------------------------------------------------------------- if (isset($_POST['logout']) && $auth) { // Снимаем авторизацию unset($_SESSION['auth']); $auth = false; } // Сохранение или добавление домена -------------------------------------------- if (isset($_POST['drop']) && $auth) { // Флаг ошибок проверки $error = false; // Получаем данные $data = [ 'name' => isset($_POST['drop-name']) ? trim($_POST['drop-name']) : '', 'tag' => isset($_POST['drop-tag']) ? trim($_POST['drop-tag']) : '', ]; // Если пустое поле "Название" if (empty($data['name'])) { $error = true; messages_add('Поле Название не должно быть пустым.', 'errors'); } // Если нет ошибок и запрошено сохранение if ($error === false && $_POST['drop'] == 'edit') { // Добавляем идентификатор $data['id'] = isset($_POST['drop-id']) ? (int) $_POST['drop-id'] : 0; // Изменяем домен drop_edit($db, $data); // Формируем сообщение об успехе messages_add("Домен {$data['name']} успешно изменён.", 'success'); // Возвращаем на главную страницу header("Location: $script"); exit(); // Если нет ошибок и запрошено добавление } elseif ($error === false && $_POST['drop'] == 'add') { // Добавляем группу drop_add($db, $data); // Формируем сообщение об успехе messages_add("Домен {$data['name']} успешно добавлен.", 'success'); // Возвращаем на главную страницу header("Location: $script"); exit(); } } // Удаление домена ------------------------------------------------------------- if (isset($_POST['drop_delete']) && $auth) { // Получаем идентификатор $id = (int) $_POST['drop_delete']; // Получаем домен $drop = drop_get_one($db, $id); // Если группа не найдена if ( ! isset($drop['name'])) { // Составляем сообщение messages_add("Нельзя удалить домен с ID $id, так как он не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Получаем статьи домена if ( ! empty(article_get_drop($db, $id))) { // Составляем сообщение messages_add("Нельзя удалить домен который содержит статьи.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Удаляем домен drop_delete($db, $id); // Формируем сообщение об успехе messages_add("Домен {$drop['name']} успешно удалён.", 'success'); } // Сохранение или добавление статьи -------------------------------------------- if (isset($_POST['article']) && $auth) { // Флаг ошибок проверки $error = false; // Получаем данные $article = [ 'url' => isset($_POST['article-url']) ? trim($_POST['article-url']) : '', 'id_drop' => isset($_GET['id_drop']) ? $_GET['id_drop'] : 0, 'item' => isset($_POST['article-item']) ? trim($_POST['article-item']) : '', 'item' => isset($_POST['article-item']) ? trim($_POST['article-item']) : '', 'title' => isset($_POST['article-title']) ? trim($_POST['article-title']) : '', 'description' => isset($_POST['article-url']) ? trim($_POST['article-description']) : '', 'h1' => isset($_POST['article-h1']) ? trim($_POST['article-h1']) : '', 'content' => isset($_POST['article-content']) ? trim($_POST['article-content']) : '' ]; // Получаем домен $drop = drop_get_one($db, $article['id_drop']); // Если пустое поле "Название" if (empty($article['url'])) { $error = true; messages_add('Поле URL не должно быть пустым.', 'errors'); } // Если пустое поле "Пункт меню" if (empty($article['item'])) { $error = true; messages_add('Поле Пункт меню не должно быть пустым.', 'errors'); } // Если уже существует стать с таким URL $isset = article_get_url($db, $article['url'], $article['id_drop']); if ( ! empty($isset) && $article['id'] == $isset['id']) { $error = true; messages_add('Статья с URL '.$article['url'].' уже существует.', 'errors'); } // Если нет ошибок и запрошено сохранение if ($error === false && $_POST['article'] == 'edit') { // Добавляем идентификатор $article['id'] = isset($_POST['article-id']) ? (int) $_POST['article-id'] : 0; // Изменяем статью article_edit($db, $article); // Формируем сообщение об успехе messages_add("Статья {$article['item']} успешно изменена.", 'success'); // Если нет ошибок и запрошено добавление } elseif ($error === false && $_POST['article'] == 'add') { // Добавляем статью $article['id'] = article_add($db, $article); // Формируем сообщение об успехе messages_add("Статья {$article['name']} успешно добавлена.", 'success'); } // Если нет ошибок сохраняем статью if ($error === false) { // Путь до папки $path = $conf['path'].$drop['name'].'/.userfiles/'; // Сохраняем данные списка и статьи $arts = article_get_drop($db, $article['id_drop']); $arts_json = []; foreach ($arts as $art) { $arts_json[$art['url']] = ['i' => $art['id'], 'n' => $art['item']]; } file_put_contents($path.'articles.json', json_encode($arts_json, JSON_UNESCAPED_UNICODE)); // Сохраняем данные статьи file_put_contents($path.'articles/'.$article['id'].'.json', json_encode($article, JSON_UNESCAPED_UNICODE)); // Возвращаем на главную страницу header("Location: $script"); exit(); } } // Удаление статьи ------------------------------------------------------------- if (isset($_POST['article_delete']) && $auth) { // Получаем идентификатор $id = (int) $_POST['article_delete']; // Получаем статью $article = article_get_one($db, $id); // Если группа не найдена if ( ! isset($article['item'])) { // Составляем сообщение messages_add("Нельзя удалить статью с ID $id, так как она не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Удаляем URL article_delete($db, $id); // Получаем домен $drop = drop_get_one($db, $article['id_drop']); // Путь до папки $path = $conf['path'].$drop['name'].'/.userfiles/'; // Сохраняем данные списка и статьи $arts = article_get_drop($db, $article['id_drop']); $arts_json = []; foreach ($arts as $art) { $arts_json[$art['url']] = ['i' => $art['id'], 'n' => $art['item']]; } file_put_contents($path.'articles.json', json_encode($arts_json, JSON_UNESCAPED_UNICODE)); // Удаляем файл статьи unlink($path.'articles/'.$article['id'].'.json'); // Формируем сообщение об успехе messages_add("Статья {$article['item']} успешно удалена.", 'success'); } // Изменение настроек ---------------------------------------------------------- if (isset($_POST['config']) && $auth) { // Получаем данные $data = [ 'path' => isset($_POST['conf-path']) ? trim($_POST['conf-path']) : '', 'pass' => isset($_POST['conf-pass']) ? trim($_POST['conf-pass']) : '' ]; // Если нужно сменить пароль if ( ! empty($_POST['conf-pass'])) { $data['pass'] = md5($_POST['conf-pass']); } // Сохраняем настройки conf_edit($db, $data); // Формируем сообщение об успехе messages_add("Настройки успешно сохранены.", 'success'); // Возвращаем на главную страницу header("Location: $script"); exit(); } /*=============================================================================================== */ /*======================================================================================== LOGICS */ /*=============================================================================================== */ // Главная страница ------------------------------------------------------------ if ($action == '' && $auth) { // Получаем все домены $drops = drop_get_all($db); } // Страница создания домена ---------------------------------------------------- if ($action == 'drop_add' && $auth) { // Первоначальные настройки URL $drop = [ 'name' => '', 'tag' => '' ]; } // Страница редактирование домена ---------------------------------------------- if ($action == 'drop_edit' && $auth) { // Получаем идентификатор $id = isset($_GET['id']) ? $_GET['id'] : 0; // Получаем группу $drop = drop_get_one($db, $id); // Если домен не найден if ( ! isset($drop['name'])) { // Составляем сообщение messages_add("Домен с ID $id не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } } // Новые статьи домена -------------------------------------------------------- if ($action == 'article_all' && $auth) { // Получаем идентификатор $id = isset($_GET['id']) ? $_GET['id'] : 0; // Получаем все статьи домена $articles = article_get_drop($db, $id); // Получаем домен $drop = drop_get_one($db, $id); // Если домен не найден if ( ! isset($drop['name'])) { // Составляем сообщение messages_add("Новая статья с ID $id не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } } // Страница создания новой статьи --------------------------------------------- if ($action == 'article_add' && $auth) { // Получаем идентификатор $id_drop = isset($_GET['id_drop']) ? $_GET['id_drop'] : 0; // Первоначальные настройки статьи $article = [ 'url' => '', 'item' => '', 'title' => '', 'description' => '', 'h1' => '', 'content' => '' ]; // Получаем домен $drop = drop_get_one($db, $id_drop); } // Страница редактирование новой статьи --------------------------------------- if ($action == 'article_edit' && $auth) { // Получаем идентификатор $id = isset($_GET['id']) ? $_GET['id'] : 0; // Получаем данные из базы $article = article_get_one($db, $id); // Получаем домен $drop = drop_get_one($db, $article['id_drop']); // Путь до статьи $path = $conf['path'].$drop['name'].'/.userfiles/articles/'.$id.'.json'; // Если статья не найдена if ( ! is_file($path)) { // Составляем сообщение messages_add("Файл сатьи с ID $id не найден.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Получаем данные о статье $article = array_merge($article, json_decode(file_get_contents($path), true, 512, JSON_UNESCAPED_UNICODE)); // Если статья не найдена if ( ! isset($article['item'])) { // Составляем сообщение messages_add("Статья с ID $id не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Получаем все домены $drops = drop_get_all($db); } // Старые статьи домена ------------------------------------------------------- if ($action == 'page_all' && $auth) { // Получаем идентификатор $id = isset($_GET['id']) ? $_GET['id'] : 0; // Получаем домен $drop = drop_get_one($db, $id); // Если домен не найден if ( ! isset($drop['name'])) { // Составляем сообщение messages_add("Домен с ID $id не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Получаем все статьи домена $pages = page_get_all($conf['path'], $drop['name']); } // Страница редактирование старой статьи --------------------------------------- if ($action == 'page_edit' && $auth) { // Получаем идентификатор $url = isset($_GET['url']) ? $_GET['url'] : 0; $id_drop = isset($_GET['id_drop']) ? $_GET['id_drop'] : 0; // Получаем домен $drop = drop_get_one($db, $id_drop); // Если домен не найден if ( ! $drop) { // Составляем сообщение messages_add("Домен с ID $id_drop не найден.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Получаем все статьи домена $pages = page_get_all($conf['path'], $drop['name']); // Если статья не найдена if ( ! isset($pages[$url])) { // Составляем сообщение messages_add("Статья с URL $url не существует.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } // Путь до статьи $path = $conf['path'].$drop['name'].'/'.$pages[$url]; // Если файл статьи не найден if ( ! is_file($path)) { // Составляем сообщение messages_add("Файл по пути $path не найден.", 'errors'); // Возвращаем на главную страницу header("Location: $script"); exit(); } $page = [ 'url' => $url, 'path' => $path, 'content' => file_get_contents($path) ]; } /*=============================================================================================== */ /*======================================================================================== MODELS */ /*=============================================================================================== */ // Получение все настоек ------------------------------------------------------- function conf_get($db) { // Выполняем запрос $sel = $db->query("SELECT * FROM `configs`"); // Подготавливаем данные $result = []; while ($temp = $sel->fetchArray(SQLITE3_ASSOC)) $result[$temp['name']] = $temp['value']; return $result; } // Редактирование настроек ----------------------------------------------------- function conf_edit($db, $data) { // Подготовка запроса $upd = $db->prepare("UPDATE `configs` SET value=:value WHERE name=:name"); foreach ($data as $name => $value) { // Подготовка параметров $upd->bindValue(':value', $value); $upd->bindValue(':name', $name); // Выполняем вставку $upd->execute(); } } // Получение одного домена ------------------------------------------------------ function drop_get_one($db, $id) { // Подготовка запроса $sel = $db->prepare("SELECT * FROM `drops` WHERE id=:id"); // Подготовка параметров $sel->bindValue(':id', $id, SQLITE3_INTEGER); // Выполняем запрос return $sel->execute()->fetchArray(SQLITE3_ASSOC); } // Получение всех групп -------------------------------------------------------- function drop_get_all($db) { // Выполняем запрос $sel = $db->query('SELECT * FROM `drops` ORDER BY name'); // Подготавливаем данные $result = []; while ($temp = $sel->fetchArray(SQLITE3_ASSOC)) $result[$temp['id']] = $temp; return $result; } // Добавление группы ----------------------------------------------------------- function drop_add($db, $data) { // Подготовка запроса $ins = $db->prepare("INSERT INTO `drops` (name, tag) VALUES (:name, :tag)"); // Подготовка параметров $ins->bindValue(':name', $data['name'], SQLITE3_TEXT); $ins->bindValue(':tag', $data['tag'], SQLITE3_TEXT); return $ins->execute(); } // Изменение домена ------------------------------------------------------------ function drop_edit($db, $data) { // Подготовка запроса $upd = $db->prepare("UPDATE `drops` SET name=:name, tag=:tag WHERE id=:id"); // Подготовка параметров $upd->bindValue(':name', $data['name'], SQLITE3_TEXT); $upd->bindValue(':tag', $data['tag'], SQLITE3_TEXT); $upd->bindValue(':id', $data['id'], SQLITE3_INTEGER); return $upd->execute(); } // Удаление домена ------------------------------------------------------------- function drop_delete($db, $id) { // Подготовка запроса $del = $db->prepare("DELETE FROM `drops` WHERE id=:id"); // Подготовка параметров $del->bindValue(':id', $id, SQLITE3_INTEGER); return $del->execute(); } // Получение одной статьи ------------------------------------------------------ function article_get_one($db, $id) { // Подготовка запроса $sel = $db->prepare("SELECT * FROM `articles` WHERE id=:id"); // Подготовка параметров $sel->bindValue(':id', $id, SQLITE3_INTEGER); // Выполняем запрос return $sel->execute()->fetchArray(SQLITE3_ASSOC); } // Получение всех статей -------------------------------------------------------- function article_get_all($db) { // Выполняем запрос $sel = $db->query('SELECT * FROM `articles` ORDER BY item'); // Подготавливаем данные $result = []; while ($temp = $sel->fetchArray(SQLITE3_ASSOC)) $result[$temp['id']] = $temp; return $result; } // Получение всех статей -------------------------------------------------------- function article_get_drop($db, $id_drop) { // Выполняем запрос $sel = $db->prepare("SELECT * FROM `articles` WHERE id_drop=:id_drop"); // Подготовка параметров $sel->bindValue(':id_drop', $id_drop, SQLITE3_INTEGER); // Выполняем запрос $sel = $sel->execute(); // Подготавливаем данные $result = []; while ($temp = $sel->fetchArray(SQLITE3_ASSOC)) $result[$temp['id']] = $temp; return $result; } // Получение статьи по URL -------------------------------------------------------- function article_get_url($db, $url, $id_drop) { // Выполняем запрос $sel = $db->prepare("SELECT * FROM `articles` WHERE url=:url AND id_drop=:id_drop"); // Подготовка параметров $sel->bindValue(':url', $url, SQLITE3_TEXT); $sel->bindValue(':id_drop', $id_drop, SQLITE3_INTEGER); // Выполняем запрос $sel = $sel->execute(); // Подготавливаем данные $result = []; while ($temp = $sel->fetchArray(SQLITE3_ASSOC)) $result[$temp['id']] = $temp; return $sel->fetchArray(SQLITE3_ASSOC); } // Добавление статьи ----------------------------------------------------------- function article_add($db, $data) { // Подготовка запроса $ins = $db->prepare("INSERT INTO `articles` (id_drop, url, item) VALUES (:id_drop, :url, :item)"); // Подготовка параметров $ins->bindValue(':id_drop', $data['id_drop'], SQLITE3_INTEGER); $ins->bindValue(':url', $data['url'], SQLITE3_TEXT); $ins->bindValue(':item', $data['item'], SQLITE3_TEXT); $ins->execute(); return $db->lastInsertRowID(); } // Изменение статьи ------------------------------------------------------------ function article_edit($db, $data) { // Подготовка запроса $upd = $db->prepare("UPDATE `articles` SET url=:url WHERE id=:id"); // Подготовка параметров $upd->bindValue(':url', $data['url'], SQLITE3_TEXT); $upd->bindValue(':id', $data['id'], SQLITE3_INTEGER); return $upd->execute(); } // Удаление статьи ------------------------------------------------------------- function article_delete($db, $id) { // Подготовка запроса $del = $db->prepare("DELETE FROM `articles` WHERE id=:id"); // Подготовка параметров $del->bindValue(':id', $id, SQLITE3_INTEGER); return $del->execute(); } // Получение всех старых статей -------------------------------------------------------- function page_get_all($path, $drop_name) { // Путь до списка $path_list = $path.$drop_name.'/.userfiles/db.list'; // Если файла не существует if ( ! is_file($path_list)) return false; // Получаем и разбираем файл $routes = explode("\n", file_get_contents($path_list)); $urls = []; foreach($routes as $route) { $line = explode("=>", $route); $urls[trim($line[0])] = trim($line[1]); } return $urls; } // Добавить сообщение ---------------------------------------------------------- function messages_add($text, $type) { // Добавляем сообщение $_SESSION['messages'][$text] = $type; } // Получить все сообщения и обнулить их ---------------------------------------- function messages_get() { // Если сообщений не существует if (empty($_SESSION['messages'])) return []; // Возвращаем и обнуляем сообщения $messages = $_SESSION['messages']; $_SESSION['messages'] = []; return $messages; } /*=============================================================================================== */ /*========================================================================================= VIEWS */ /*=============================================================================================== */ // Закрываем базу данных $db->close(); ?> Скрипт проверки работы URL адресов
Drop-manager - Скрипт управления дропами
$type): ?>
Добавить домен Вставки Настройки
Домен Тэг Статьи Действия
Новые Старые Добавить Перейти
Отмена

Создание нового домена

Редактирование

Назад Добавить статью

Список новых статей домена

Пункт меню URL Действия
Перейти
Отмена

Создание новой статьи для

Редактирование c домена

Назад

Список старых статей домена

$path): ?>
URL Действия
Перейти
Отмена

Редактирование c домена

Отмена

Настройки скрипта