Многие веб-разработчики рано или поздно задумываются: а как устроены популярные CMS вроде WordPress или Joomla? Что если написать свою собственную систему управления контентом? Это не только интересный проект, но и отличный способ прокачать навыки PHP. В этой статье мы шаг за шагом разберём, как создать простую CMS с нуля. Вы получите работающий прототип и понимание ключевых принципов.
Что такое CMS и зачем писать свою?
CMS (Content Management System) — это система управления контентом. Она позволяет добавлять, редактировать и удалять статьи, страницы, товары без прямого вмешательства в код. Популярные CMS — WordPress, Joomla, Drupal. Но зачем создавать свою? Во-первых, это отличная практика. Во-вторых, для небольших проектов своя CMS может быть легче и быстрее. В-третьих, вы полностью контролируете код и можете адаптировать его под конкретные задачи.
Конечно, своя CMS не заменит WordPress для крупного сайта, но для учебного проекта или простого блога — самое то.
Подготовка: структура проекта и база данных
Для начала создадим структуру папок. Вот пример:
/cms
/admin
/includes
/assets
/css
/js
index.php
config.php
functions.php
Файл config.php будет содержать настройки подключения к базе данных. Создадим базу данных MySQL с таблицей posts:
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Теперь напишем подключение к БД в config.php:
<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'cms');
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error) {
die("Ошибка подключения: " . $conn->connect_error);
}
?>
Не забудьте создать саму базу данных через phpMyAdmin или консоль.
mysqli или PDO для работы с базой. PDO удобнее и безопаснее, но для простоты начнём с mysqli.
Создаём функции для работы с записями
В файле functions.php напишем основные функции: получение всех записей, получение одной записи, добавление, обновление и удаление.
<?php
require_once 'config.php';
function getAllPosts($conn) {
$sql = "SELECT * FROM posts ORDER BY created_at DESC";
$result = $conn->query($sql);
return $result->fetch_all(MYSQLI_ASSOC);
}
function getPostById($conn, $id) {
$stmt = $conn->prepare("SELECT * FROM posts WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_assoc();
}
function addPost($conn, $title, $content) {
$stmt = $conn->prepare("INSERT INTO posts (title, content) VALUES (?, ?)");
$stmt->bind_param("ss", $title, $content);
return $stmt->execute();
}
function updatePost($conn, $id, $title, $content) {
$stmt = $conn->prepare("UPDATE posts SET title = ?, content = ? WHERE id = ?");
$stmt->bind_param("ssi", $title, $content, $id);
return $stmt->execute();
}
function deletePost($conn, $id) {
$stmt = $conn->prepare("DELETE FROM posts WHERE id = ?");
$stmt->bind_param("i", $id);
return $stmt->execute();
}
?>
Обратите внимание на подготовленные запросы — это защита от SQL-инъекций.
Админ-панель: создание, редактирование, удаление
Создадим папку admin и файл index.php, который будет выводить список записей с ссылками на редактирование и удаление.
<?php
require_once '../functions.php';
$posts = getAllPosts($conn);
?>
<!DOCTYPE html>
<html>
<head>
<title>Админ-панель</title>
</head>
<body>
<h1>Управление записями</h1>
<a href="create.php">Добавить запись</a>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<?= htmlspecialchars($post['title']) ?>
<a href="edit.php?id=<?= $post['id'] ?>">Редактировать</a>
<a href="delete.php?id=<?= $post['id'] ?>" onclick="return confirm('Удалить?')">Удалить</a>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
Файл create.php:
<?php
require_once '../functions.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'];
$content = $_POST['content'];
if (addPost($conn, $title, $content)) {
header('Location: index.php');
exit;
}
}
?>
<!DOCTYPE html>
<html>
<body>
<h1>Создать запись</h1>
<form method="post">
Заголовок: <input type="text" name="title" required><br>
Содержание: <textarea name="content" required></textarea><br>
<button type="submit">Сохранить</button>
</form>
</body>
</html>
Аналогично edit.php и delete.php.
Вывод записей на сайте
В корневом index.php выведем список записей:
<?php
require_once 'functions.php';
$posts = getAllPosts($conn);
?>
<!DOCTYPE html>
<html>
<head>
<title>Мой сайт</title>
</head>
<body>
<h1>Последние записи</h1>
<?php foreach ($posts as $post): ?>
<article>
<h2><?= htmlspecialchars($post['title']) ?></h2>
<p><?= nl2br(htmlspecialchars($post['content'])) ?></p>
<small><?= $post['created_at'] ?></small>
</article>
<?php endforeach; ?>
</body>
</html>
Готово! Теперь у вас есть минимальная CMS.
Улучшения и безопасность
Чтобы CMS была удобной и безопасной, добавьте:
- Аутентификацию администратора (сессии, хеширование паролей).
- Валидацию данных на сервере.
- Защиту от CSRF.
- Разделение шаблонов (header, footer).
Также стоит использовать PDO вместо mysqli для гибкости.
Заключение
Создание CMS с нуля — это увлекательный процесс, который даёт глубокое понимание веб-разработки. Вы научились подключать базу данных, писать функции CRUD, создавать админ-панель и выводить контент. Конечно, это только основа. Дальше можно добавить категории, теги, загрузку изображений, редактор WYSIWYG. Главное — не бойтесь экспериментировать и улучшать свой код.
Помните: даже большие системы начинали с малого. Удачи в разработке!
Студия WNDER



