Урок 7. CMS – Как гуглить?

Добро пожаловать на 7-й урок курса для начинающих разработчиков под названием «Как гуглить?».

Сегодня мы познакомимся с системами управления контентом. Википедия говорит Content Management System (CMS) информационная система или компьютерная программа, используемая для обеспечения и организации совместного процесса создания, редактирования и управления содержимым.

Простыми словами CMS – это админка для сайта, которая позволяет в удобном виде добавлять, удалять или редактировать информацию на сайте или в веб-приложении. Зачастую, использование админки позволяет вносить изменения специалистам, не обладающим какими-либо техническими навыками.

Наиболее популярные сегодня CMS – это WordPress, 1С-Битрикс, Тильда. Такие системы управления контентом уже из коробки позволяют решить множество задач: управление пользователями и правами доступа, редактирование новостей, редактирование страниц, редактирование товаров, сбор заказов и обратной связи от посетителей сайта.

На этом уроке мы разработаем собственную систему управления сайтом для того, чтобы понять принципы работы CMS.

Переходим в панель управления хостингом нашего сайта и в корневой директории с сайтом создаем папочку «admin» – именно там будут храниться исходные файлы нашей админ-панели.

Создадим с этой папке сразу 2 файла: index.php и login.php

Теперь переходим к редактированию файла login.php – в нем мы разместим шаблон страницы авторизации. Создадим форму авторизации

				
					<form action="?" method="POST">
    Логин:<br>
    <input name="login" type="text" />
    <br><br>
    
    Пароль:<br>
    <input name="password" type="password" />
    <br><br>

    <button type="submit">Войти</button>
</form>
				
			

В форме укажем action = “?”, что будет означать отправку данных в по тому же адресу, где находится сейчас пользователь и метод – POST, чтобы не демонстрировать пароль пользователя в адресной строке браузера (как в случае с GET-запросами)

Теперь переходим к файлу index.php в папке admin и начинаем накидывать систему авторизации.

Перо-наперво нам понадобится функция session_start(), которая позволит нам организовать работу с сессиям. Сессии в PHP – это крайне удобный инструмент. Если мы инициируем сессию на стороне сервера – то пока пользователь находится на нашем сайте мы можем хранить служебную информацию на стороне сервера. Пользователь может переходит по страницам нашего сайта при это мы всегда будем четно знать кто это и что мы о нём знаем.

				
					<?php
session_start();

if (!isset($_SESSION["admin"])){
    include ("login.php");
    exit;
}
				
			

Эта конструкция позволяет проверить наличие в сессии параметра «admin» и если его нет – показать пользователю страницу авторизации. Обратите внимание на функцию exit – она позволяет остановить выполнение PHP-скрипта и игнорировать весь код, который будет написан далее. Также обратите внимание на функцию isset – она позволяет проверить существует ли искомая переменная.

Теперь, нам где-то нужно произвести проверку на то, что пользователь указал корректную пару логин-пароль. Для этого между session_start() и конструкцией if добавим следующий код

				
					if ((isset($_POST['login'])) AND (isset($_POST['password']))){
    if (($_POST["login"] == "admin") AND ($_POST["password"] == "12345")){
        $_SESSION["admin"] = 1;
    } else {
        echo "неверный логин или пароль";
    }
}
				
			

Здесь мы производим авторизацию пользователя, и, если авторизация пройдена успешно – записываем в сессию пользователя параметр «admin» со значением 1, в противном случае – мы уведомляем пользователя, что указанный логин или пароль не верны.

В итоге у нас получается следующий код

				
					<?php
    session_start();
    
    if ((isset($_POST['login'])) AND (isset($_POST['password']))){
        if (($_POST["login"] == "admin") AND ($_POST["password"] == "12345")){
            $_SESSION["admin"] = 1;
        } else {
            echo "неверный логин или пароль";
        }
    }
        
    if (!isset($_SESSION["admin"])){
        include ("login.php");
        exit;
    }
				
			

А код, который будет написан ниже – будет доступен к исполнению только для авторизованных пользователей.

Теперь, скопируем из файла news.php, который мы обновили на предыдущем уроке кусок кода, который позволяет выдернуть из базы данных заголовки новостей.

				
						$mysqli = new mysqli("localhost", "u1777138_new", "cX8jI9zN3c", "u1777138_new");
	mysqli_query($mysqli, "SET character_set_results='utf8'");
	mysqli_query($mysqli, "SET NAMES 'utf8'");

	$sql = "SELECT * FROM news";
	if($result = $mysqli->query($sql)){
		foreach($result as $row){
			echo "- <a href='/view.php?id=" .$row['id'] . "'>" . $row['title'] . "</a><br>";
		}
	}
				
			

Немного доработаем ту часть, которая относится к переходу на новость – сделаем так, чтобы мы переходили к странице edit.php, которая находится в директории с админкой: /admin/edit.php, а также добавим перед всеми новостями кнопку “Добавить новость”

				
						echo "- <a href='/admin/edit.php?id=0'><b>Добавить новость</b></a><br><br>";
	
	$mysqli = new mysqli("localhost", "u1777138_new", "cX8jI9zN3c", "u1777138_new");
	mysqli_query($mysqli, "SET character_set_results='utf8'");
	mysqli_query($mysqli, "SET NAMES 'utf8'");

	$sql = "SELECT * FROM news";
	if($result = $mysqli->query($sql)){
		foreach($result as $row){
			echo "- <a href='/admin/edit.php?id=" .$row['id'] . "'>" . $row['title'] . "</a><br>";
		}
	}
				
			

Теперь, когда администратор сайта нажмёт на ссылку с новостью или нажмет на “Добавить новость” – он будет перенаправлен на страницу /admin/edit.php с GET-параметром “id”, который отвечает за порядковый номер новости (или с параметром равным “0”, который позволит нам понять, что администратор хочет добавить новую публикацию).

Теперь создадим файл edit.php в директории admin в разместим в нём следующий код

				
					<?php
    session_start();
    if (!isset($_SESSION['admin'])){
        exit;
    }
				
			

Этот код позволит остановить выполнение PHP-скрипта на странице edit.php, в случае, если администратор не был авторизован.

Теперь создадим шаблон формы, который позволит редактировать запись

				
					<?php
	// Проверяем наличие сессии для администратора
	session_start();
	if (!isset($_SESSION['admin'])){
		exit;
	}
	
	// Подключение к БД
	$mysqli = new mysqli("localhost", "u1777138_new", "cX8jI9zN3c", "u1777138_new");
	$mysqli -> query("SET character_set_results='utf8'");
	$mysqli -> query("SET NAMES 'utf8'");
	
	// Проверяем был ли передан GET-параметр "save"
	if (isset($_GET['save'])){
		$id		= $_POST['id'];
		$title	= $mysqli -> real_escape_string($_POST['title']);
		$text	= $mysqli -> real_escape_string($_POST['text']);
			
		if ($_POST['id'] == 0){
			$sql = "INSERT INTO `news` (title, text) VALUES ('$title', '$text')";
		} else {
			$sql = "UPDATE `news` SET `title` = '$title', `text` = '$text' WHERE `id` = $id";
		}
		
		$mysqli -> query($sql);
		$mysqli -> close();
		echo "Информация успешно сохранена. <a href='/admin/'>Перейти в панель управления</a>.";
		exit;
	}
	
	// Проверяем наличие ID записи в GET-параметрах
	if (!isset($_GET['id'])){
		echo "Не указан идентификатор новости";
		exit;
	}
	
	// Получаем информацию о новости
	if ($_GET['id'] != 0){
    	$sql = "SELECT * FROM `news` WHERE id = " . $_GET['id'];
    	if ($result = $mysqli -> query($sql)){
    		foreach($result as $row){
    			$title = $row['title'];
    			$text = $row['text'];
    		}
    	}
    } else {
        $title = "Заголовок новости";
        $text = "Текст новости";
    }
	
	// Завершаем работу с БД
	$mysqli -> close();
?>
<form action="?save" method="POST">
	<input type="hidden" name="id" value="<?= $_GET['id']; ?>">
	
	Заголовок
	<br>
	<input type="text" name="title" value="<?= $title; ?>">
	<br><br>
	
	Текст новости
	<br>
	<textarea name="text"><?= $text; ?></textarea>
	<br><br>
	
	<button type="submit">Сохранить</button>
</form>
				
			

Разберемся, что здесь написано. После того, как мы убедились, что пользователь, пытающийся открыть /admin/edit.php обладает правами администратора – мы открываем соединение с базой данных.

После этого, мы проверяем был ли отправлен GET-параметр “save”, который будет добавлен к URL-адресу после отправки формы (которая находится самом низу кода). В случае, если GET-параметр “save” был передан – это значит, что мы имеем POST-данные из формы для создания новой записи или обновления существующей.

Внутри конструкции if мы подготавливаем, полученные из формы данные. Сначала мы используем функцию real_escape_string, которая позволит экранировать специальные символы, если они были в тексте или заголовке новости. Так как при подготовке SQL-запроса в PHP мы просто соединяем строки (соединяем SQL-команду со значением переменных) – может возникнуть ситуация, когда значения переменных поломают наш SQL-запрос. Так например, если заголовок новости содержит кавычки – SQL-запрос отработает некорректно. Допустим наш заголовок новости выглядит так: “АВТОВАЗ” запустил производство обновлённой Приоры – в этом случае, после объединения шаблона SQL-запроса со значением из POST-параметра title – мы получим следующий SQL-запрос.

В случае же, если GET-параметр “save” не передавался – продолжаем выполнения скрипта и проверяем наличие GET-параметра “id”, который нам понадобится для того, чтобы определить хотим ли мы добавить новую новость или отредактировать существующую. Если параметр не задан – выводим ошибку и завершаем выполнение PHP-скрипта.

				
					INSERT INTO `news` (title) VALUES (""АВТОВАЗ" запустил производство обновлённой Приоры");
				
			

Такой запрос будет выполнен некорректно и данные не будут сохранены в БД, поэтому, чтобы передать в БД спецсимволы, но не поломать запрос – необходимо использовать для строковых и текстовых значений экранирование, которое реализовано в PHP функцией real_escape_string.

Далее, мы проверяем переданный ID новости. Если он равен нулю – значит мы создаем новую запись в БД, используя SQL-команду INSERT. Если же значение отличное от нуля – обновляем существующую запись в БД с помощью SQL-команды UPDATE.

После выполнения – разрываем соединение с БД, выводим информацию о том, что запись была успешно обновлена / создана и заканчиваем выполнение PHP-скрипта.

Если GET-параметр id задан и он отличается от нуля – получаем информацию о новости из БД и сохраняем эту информацию в отдельные переменные.

Ниже в HTML-форме с помощью сокращенной PHP-функции echo, которая выглядит просто как знак равно идущий после открывающего тега php, выводим заголовок и текст новости в соответствующие поля.

Теперь мы можем без труда редактировать новости и добавлять новые без доступа к исходным файлам сайта и без доступа к базе данных.

 

Домашнее задание

В качестве домашнего задания, я предлагаю реализовать следующее:

1. Добавьте на страницу редактирования новости ссылку для удаления новости. Точно также как отправкой формы – такая ссылка должна содержать GET-параметр, пусть это будет “delete”:

				
					<?php if ($_GET['id'] != 0): ?>
<a href="/admin/edit.php?delete&id=<?= $_GET['id']; ?>">удалить новость</a>
<?php endif; ?>
				
			

2. Найдите с помощью Google пример SQL-запроса, который позволяет удалять записи из базы данных и доработайте файл /admin/edit.php таким образом, чтобы при клике на ссылку “удалить новость” – запись была удалена из базы данных

Скачать исходные файлы урока №7

Обсудите ваш проект с менеджером

    Я согласен на обработку персональных данных согласно политике конфиденциальности

    Звоните
    Пишите

    Meta* признана экстремистской организацией на территории РФ

    Служба поддержки

      Тариф Базовый Продвинутый Профессиональный
      При оплате на 1 год 390 руб./мес. 450 руб./мес. 490 руб./мес.
      При оплате на 2 года 332 руб./мес. 383 руб./мес. 417 руб./мес.
      При оплате на 3 года 273 руб./мес. 315 руб./мес. 343 руб./мес.

      Реквизиты для рассчётного счета

      Заполните реквизиты вашей организации, а мы подготовим и направим счет вам на электронную почту. Обратите внимание, при оплате через расчетный счет срок выполнения работ увеличен до 10 рабочих дней.

        Я согласен на обработку персональных данных согласно политике конфиденциальности