PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
if (userHasRole('admin')) {
$buttonactive = 'submit'; //если админ делаем активными все кнопки
} elseif ($saylist['userid'] == $userid) {
$buttonactive = 'submit'; //делаем активными кнопки для юзера
} else {
$buttonactive = 'hidden'; //отключаем кнопки
} ?>
</div>
</div>
<div class="blocksayform" id="">
<div class="sayforms">
<form name="sayform" method="post" action="/chat/say/reset.php" class="logout">
<input type="hidden" name="pageid" id="" value=" <?php echo $pageid; ?>" />
<input type="hidden" name="deleteid" id="" value=" <?php echo $replylist['id']; ?>" />
<input type="<?= $buttonactive ?>" name="delete" id="" value="Удалить" />
</form>
</div>
<?php
}
endforeach;
}
?>
</div>
<div class="add_reply" id="">
<?php
if (isset($_SESSION['login'])) {
if (isset($_GET['reply']) and $_GET['reply'] == $post_id) {
include_once $_SERVER['DOCUMENT_ROOT'] . '/say/form_add_reply.html.php';
}
}
?>
</div>
</div>
</html>
На этой странице в цикле foreach – endforeach выводим все ответы на данный комментарий. Показываем кнопку «Удалить». Проверяем необходимость вставки формы для добавления ответа form_add_reply.html.php' на данный комментарий. Необходимость определяется наличием переменной $_GET['reply'].
35. Форма добавления ответов на комментарии
Для добавления ответов на комментарии служит форма form_add_reply.html.php
Листинг 51. form_add_reply.html.php Путь: news/chat/say/ form_add_reply.html.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
</style>
</head>
<form action="/chat//say/separate_action.php" method="post" class="say">
<fieldset class="chatfieldset">
<legend>Ответить на комментарий:</legend>
<textarea class="saytext" name="replytext" rows="5" cols="50" autofocus><?php if(isset($_SESSION['txt'])){
echo htmlout($_SESSION['txt']);}?></textarea>
<br />
<div class="">
<div class="says">
<input type="hidden" name="userid" value="Добавить">
<input type="hidden" name="pageid" value="<?php echo $pageid ?>">
<input type="hidden" name="sayid" value="<?php if(isset($sayid)) {echo $sayid;} ?>">
<input type="hidden" name="deleteid" id="" value=" <?php echo $saylist['id'];?>" />
<input type="hidden" name="postid" id="" value=" <?php htmlout($post_id);?>" />
<input type="submit" name="action" value="Ответить">
<input type="submit" name="smileblock" value="Показать смайлы">
<input type="submit" name="smileblock_close" value="Скрыть смайлы">
</div>
<div class="notaddsay" id=""><a href="?" class="notaddsays">Отмена</a></div>
</div>
</fieldset>
<br>
<hr>
<div class="smilesetdiv">
<fieldset class="smileset" style="<?php if (isset($_SESSION['smileblock'])) {echo $_SESSION['smileblock'];} ?>">
<?php print_smile_set();?>
</fieldset>
</div>
<br />
</form>
</html>
Это HTML форма состоящая из следующих частей:
• Поле ввода комментариев тип textarea,autofocus.
• Кнопки «Добавить», «Показать смайлы», «Скрыть смайлы» тип input submit.
• Ссылка «Отмена», при нажатии обнуляет все значения в $_GET.
• Блок смайлов, который выводит доступный набор смайлов.
36. Обработчик добавления ответов
Для обработки ответов на комментарии служит файл make_reply.php
Листинг 52. make_reply.php Путь: news/chat/say/ make_reply.php
<?php
error_reporting(E_ALL);
if (session_id() == '') {
session_start();
}
unset($_SESSION['txt']);
if (isset($_POST['nosay'])) {
$_GET['reply'] = '';
exit();
}
/* Проверяем наличие текста в форме */
if (empty($_POST['replytext'])) {
header("Location: " . $_SERVER["HTTP_REFERER"]); // Делаем редирект
exit();
}
if (isset($_POST['action']) and $_POST['action'] == "Ответить") {
include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/clean.php';
/* Получаем id текущего пользователя */
if (isset($_SESSION['userid'])) {
$userid = $_SESSION['userid'];
}
/* заносим текст в базу */
try {
$sql = 'INSERT INTO reply SET
replytext = :replytext,
userid = :userid,
replydate = :replydate,
replyid =:replyid';
$s = $dsn->prepare($sql);
$replytext = html($_POST['replytext']);
$replyid = $_POST['postid'];
$replydate = time();
$s->bindValue(':replytext', $replytext);
$s->bindValue(':replyid', $replyid);
$s->bindValue(':replydate', $replydate);
$s->bindValue(':userid', $userid);
$s->execute();
} catch (PDOException $e) {
echo 'Error adding данного пользователя';
echo $e->getMessage();
echo $e->getLine();
exit();
}
header("Location: " . $_SERVER["HTTP_REFERER"]); // Делаем редирект
exit();
}
header("Location: " . $_SERVER["HTTP_REFERER"]); // Делаем редирект
exit();
Здесь мы проверяем данные переданные формой form_add_reply.html.php, вставляем данные в БД и делаем редирект обратно.
37. Кнопка удаления ответов на комментарии
Для вывода кнопки удаления ответов на комментарии служит файл reply_delete_button.html
Листинг 53. reply_delete_button.html Путь: news/chat/say/ reply_delete_button.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
</head>
<div class="wrapreplyform">
<div class="idreplynum">
<!– печатаем id комментария –>
<span style=""><?php
echo '#'.$saylist['id'].' '.'^'.$replylist['id'];?></span>
</div>
<!– печатаем кнопку удалить –>
<div class="reply_delete_button">
<form name="sayform" method="post" action="/chat/say/reply_delete.php" class="reply_delete_button">
<input type="hidden" name="pageid" id="" value=" <?php echo $pageid;?>" />
<input type="hidden" name="deleteid" id="" value=" <?php echo $replylist['id'];?>" />
<input type="<?= $buttonactive ?>" name="reply_delete" id="" value="Удалить" />
</form>
</div>
<?php if($buttonactive =='hidden'){echo '.';} ?>
<!– печатаем точку и не даем схлопнуться div –>
</div>
Здесь выводим на печать идентификаторы ответа: номер комментария и номер ответа, и кнопку «Удалить».
38. Удаление комментариев
Для удаления служит скрипт reset.php
Листинг 54. reset.php Путь: news/chat/say/ reset.php
<?php
if (isset($_POST['delete']) and $_POST['delete'] == 'Удалить') {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
try {
$sql = 'DELETE FROM say WHERE id = :id';
$s = $dsn->prepare($sql);
$saylist = $_POST['deleteid'];
$s->bindValue(':id', $saylist);
$s->execute();
} catch (pdoException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
}
header("Location:" . $_SERVER['HTTP_REFERER']);// Делаем редирект обратно
Удаляется запись из таблицы say c номером, совпадающим с номером комментария.
39. Удаление ответов на комментарии
Для удаления ответов на комментарии служит файл reply_delete.php
Листинг 55. reply_delete.php Путь: news/chat/say/ reply_delete.php
<?php
if (isset($_POST['reply_delete']) and $_POST['reply_delete'] == 'Удалить') {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
try {
$sql = 'DELETE FROM reply WHERE id = :id';
$s = $dsn->prepare($sql);
$del = $_POST['deleteid'];
$s->bindValue(':id', $del);
$s->execute();
} catch (pdoException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
}
header("Location:" . $_SERVER['HTTP_REFERER']);// Делаем редирект обратно
Удаляется запись из таблицы reply c номером, совпадающим с номером ответа.
40. Перенаправление смайлов
Для разделения смайлов служит файл smile_make.php
Листинг 56. smile_make.php Путь: news/chat/say/ smile_make.php
<?php
if(session_id() == '') {session_start();}
/* Проверяем куда пойдет смайл в комментарии или в ответы */
if (isset($_POST['saytext'])) {
$_SESSION['txt'] = $_POST['saytext'].$_POST['smile'];
header("Location: ".$_SERVER["HTTP_REFERER"]);// Делаем редирект в комментарии
exit();
}
elseif (isset($_POST['replytext'])){
$_SESSION['txt'] = $_POST['replytext'].$_POST['smile'];
header("Location: ".$_SERVER["HTTP_REFERER"]);// Делаем редирект в ответы
exit();
}
Смайлы предусмотрены и в комментариях и в ответах на них, поэтому в данном скрипте отрабатывается место вставки смала: в комментарий или в ответ. Проверка идет при вставке в файл separate_action.php.
41. Стили
CSS
Код отвечающий за отображение выводимых элементов находится в файле style.css
Листинг 57. style.css Путь: news/chat/style.css
/* body */
.chatbody {
background-color: #fef5e4;
max-width: 1366px;
width: auto;
background-image: url(/images/home/bg.jpg);
}
/* form */
.chatform {
margin: 0 auto;
max-width: fit-content;
box-sizing: border-box;
padding: 1.5%;
border-radius: 5px;
background: RGBA(255, 255, 255, 1);
–webkit-box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.45);
box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.45);