PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
Проверяем работу контроллера. Вставляем в файл index.html т.е. главную страницу сайта «news» код:
<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/createbase.php'?>
Вставляем в самый верх. Получится:
Листинг 11. Тестируем контроллер 1
<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/createbase_controller.php'?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>News</title>
</head>
<body>
Значимость этих проблем настолько очевидна, что начало повседневной работы по формированию позиции способствует
подготовке и реализации новых предложений!
<br>
Значимость этих проблем настолько очевидна, что повышение уровня гражданского сознания влечет за собой процесс
внедрения и модернизации модели развития.
<br> Практический опыт показывает, что рамки и место обучения кадров способствует повышению актуальности
соответствующих условий активизации.
</body>
</html>
Запускаем сайт, в случае с Open Server просто кликаем по его названию в выпадающем меню. Должно получиться следующее
Рис. 14. Вывод формы создания администратора
Появляются сообщения о том, что БД и таблицы созданы и затем выводится форма для задания логина и пароля администратора модуля.
Вводим свой логин и пароль, отправляем. Получается:
Рис. 15. Работа сайта
Мы видим содержание сайта, значит все прошло успешно и контроллер 1 свою функцию выполнил. Можете войти в phpMyAdmin и проверить таблицы и записи.
9. Контроллер 2. описание
Контроллер 2 будет заниматься администрированием пользователей: регистрацией, авторизацией и распределением прав. Исходя из этого он должен предоставить пользователю необходимый интерфейс. В состав интерфейса будут входить управляющие кнопки:
• Авторизация – отвечает за вход в модуль для возможности оставления комментариев ;
• Регистрация – установка параметров авторизации нового пользователя;
• Кабинет – отвечает за вход в личный кабинет пользователя;
• Выход.
Контроллер должен обеспечивать вход в личный кабинет пользователя и предоставлять ему возможности для изменения и управления данными.
В данном случае достаточно двух основных ролей пользователя: «admin» и «user». «admin» может управлять добавлением, редактированием и удалением любых пользователей, имеет доступ для редактирования и удаления всех комментариев и ответов на них, «user» имеет те же возможности, но только для себя.
Есть также дополнительный резервный профиль «Site Administrator» он не активирован.
Перед написанием кода контроллера необходимо создать файлы его окружения.
9.1 Файлы окружения контроллера 2
9.1.1 Личный кабинет
Создаем в папке «admin» файл «index.php». Это будет страница администрирования модуля, на которой будут располагаться ссылки на соответственные разделы.
Листинг 12. index.php Путь: /news/chat/admin/index.php
<?php
/* Проверяем уровень доступа к странице */
include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/access.php';
if (!userIsLoggedIn()) {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/form_login.php';
exit();
}
if (!userHasRole('admin') and !userHasRole('user')) {
$error = 'Вход только для администратора';
include $_SERVER['DOCUMENT_ROOT'].'/chat/admin/accessdenied.html.php';
exit();
}
?>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/style.css" />
<title>Панель управления</title>
</head>
<body class="chatbody">
<?php include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/button_logout.html'; ?>
<div class="wrap_apanel">
<div class="blockapanel">
<h2>Панель управления</h2>
<ul>
<li><a href="/chat/admin/comment.php" class="apanel">Комментарии</a></li>
<li><a href="/chat/admin/users/index.php" class="apanel">Пользователи</a></li>
</ul>
</div>
<a href="/" class="apreturn">Вернуться на главную страницу</a>
</div>
</body>
</html>
В самом начале файла проверяем данные пользователя, если пользователь авторизован и имеет статус «admin» или «user» открываем страницу, если нет, выводим страницу запрета доступа accessdenied.html.php. Если пользователь не авторизован, выводим форму авторизации form_login.php.
На самой странице панели управления выводим:
• форму выхода пользователя из сессии button_logout.html с кнопкой «Выйти»;
• ссылки для перехода на страницы «Комментарии», «Пользователи»;
• ссылку «Вернуться на главную страницу» для перехода на начальную страницу сайта.
9.1.2 Управление доступом
Для управления доступом не будем изобретать велосипед, а воспользуемся уже проверенным решением из шуточной CMS [1] и создаем файл «access.php» листинг которого за некоторыми доработками аналогичен, приведенному в данной книге.
В исходный листинг [1.C.233] добавлены проверка активации и установление «id» пользователя.
Листинг 13. access.php Путь: /news/chat/admin/access.php
<?php
error_reporting(E_ALL);
/* Проверяем пароль и логин стартуем или удаляем сессию */
/* Функция возвращает true или false в зависимости от результатов проверки */
function userIsLoggedIn()
{
if (isset($_POST['action']) and $_POST['action'] == 'out')
{
if (!isset($_POST['login']) or $_POST['login'] == '' or
!isset($_POST['password']) or $_POST['password'] == '')
{
$GLOBALS['loginError'] = 'Пожалуйста, заполните оба поля';
return FALSE;
}
$password = md5($_POST['password'] . 'swl');
if (databaseContainsAuthor($_POST['login'], $password))
{
/* Если пользователь существует в БД, то проверяем его активацию */
try {
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
$activation ='';
$login = $_POST['login'];
$password = md5($_POST['password'] . 'swl');
$sql = 'SELECT activation FROM users WHERE login = :login AND password = :password';
$s = $dsn->prepare($sql);
$s->bindValue(':login', $login);
$s->bindValue(':password', $password);
$s->execute();
}
catch (PDOException $e) {
echo $e->getMessage();
exit();
}
$activation = $s->fetch(PDO::FETCH_COLUMN);
if ($activation !=1) {
include $_SERVER['DOCUMENT_ROOT'].'/chat/admin/erroractivation.html';
exit();
}
/* Если активирован задаем значения сессии */
if(session_id() == '') {session_start();}
$_SESSION['loggedIn'] = TRUE;
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = $password;
return TRUE;
}
else
{
if(session_id() == '') {session_start();}
unset($_SESSION['loggedIn']);
unset($_SESSION['login']);
unset($_SESSION['password']);
$GLOBALS['loginError'] =
'Указанный логин или password не совпадают.';
return FALSE;
}
}
if (isset($_POST['action']) and $_POST['action'] == 'logout')
{
if(session_id() == '') {session_start();}
unset($_SESSION['loggedIn']);
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['userid']);
header('Location: ' . $_POST['goto']);
exit();
}
if(session_id() == '') {session_start();}
if (isset($_SESSION['loggedIn']))
{
return databaseContainsAuthor($_SESSION['login'], $_SESSION['password']);
}
}
/* Функция проверяет наличие в БД пользователя с переданной парой логин – пароль */
function databaseContainsAuthor($login, $password)
{
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
try
{
$sql = 'SELECT COUNT(*) FROM users WHERE login = :login AND password = :password';
$s = $dsn->prepare($sql);
$s->bindValue(':login', $login);
$s->bindValue(':password', $password);
$s->execute();
}
catch (PDOException $e)
{
echo $e->getMessage();
exit();
}
$row = $s->fetch();
if ($row[0] > 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* Права для пользователя */
function userHasRole($role)
{
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
if (isset($_SESSION['login'])) {
try
{
$sql = "SELECT COUNT(*) FROM users
INNER JOIN authorrole ON users.id = authorid
INNER JOIN role ON roleid = role.id
WHERE login = :login AND role.id = :roleId";
$s = $dsn->prepare($sql);
$s->bindValue(':login', $_SESSION['login']);
$s->bindValue(':roleId', $role);
$s->execute();
}
catch