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(); ?>