PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
Шрифт:
Интервал:
Закладка:
{
try {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
$sql = "SELECT smile, path FROM smiles";
$s = $dsn->query($sql);
$ress = $s->fetchall();
foreach ($ress as $row) :
$smiles_key = $row['smile'];
$smile_path = $row['path'];
endforeach;
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
$smile_path = array_column($ress, 'path'); // Массив с кодами смайлов
$smiles_keys = array_column($ress, 'smile'); // Массив с соответствующими путями к изображениям смайлов
for ($i = 0; $i < count($smile_path); $i++) {
$smile_path[$i] = "<img src='" . $smile_path[$i] . "' alt='' />";//получаем изображение смайла
}
$comment = str_replace($smiles_keys, $smile_path, $comment); //Меняем в комментарии ключи смайлов на пути к смайлам
echo $comment; //печатаем комментарий со смайлами
}
Получаем из таблицы smiles массивы условных обозначений смайлов и путей к их изображениям. В цикле обрабатываем и выводим на печать комментарии со смайлами.
25. Страница сепарации данных
Страница separate_action.php получает данные из формы formaddsay.html.php и обрабатывает их. Введение этой страницы было необходимо для обнуления $_POST на странице обработки комментариев после их отправки. Если этого не сделать, то при размещении этого кода на странице с контроллером 3 при обычном обновлении страницы возникала бы проблема с его обработкой т.к. браузер обычно запоминает данные, которые отправляются с текущей страницы для того, чтобы отправить их снова при обновлении страницы и:
без обнуления переменной POST один и тот же комментарий будет добавляться до бесконечности при каждой перезагрузке страницы.
Если же мы уйдем со страницы на другую и отправим данные формы на следующую (в данном случае вернемся обратно) страницу, то браузер запомнит уже новые заголовки и при обновлении будет обрабатывать их, а при возврате они будут для страницы возврата пусты и соответственно при ее обновлении ничего не произойдет.
Листинг 41. separate_action.php Путь: news/chat/function/ print_comment.php
<?php
if(session_id() == '') {session_start();}
include_once $_SERVER['DOCUMENT_ROOT'].'./chat/admin/clean.php';
/* включаем/выключаем видимость блока смайлов */
if (isset($_POST['smileblock'])) {
$_SESSION['smileblock'] = 'display:block';
}
if (isset($_POST['smileblock_close'])) {
$_SESSION['smileblock'] = 'display:none';
}
/* Комментарии */
//если была нажата кнопка "Добавить" вставляем форму добавления комментариев,
//если была нажата кнопка "Ответить" вставляем форму ответа на комментарии,
if (isset($_POST['action']) and $_POST['action'] == 'Добавить') {
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/say/makeformaddsay.php';
}
elseif (isset($_POST['action']) and $_POST['action'] == 'Ответить') {
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/say/make_reply.php';
}
else {//Проверяем куда пойдет смайл в комментарии или в ответы
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/say/smile_make.php';
}
Скрипт управляет отображением/скрытием блока смайлов, вставкой формы добавления комментариев и вставкой формы добавления ответов на комментарии.
26. Форма для вывода комментариев
Форма form_say.html.php служит для вывода комментариев
Листинг 42. form_say.html.php Путь: news/chat/say/ form_say.html.php
<!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="wrapsayform" style="<?= $display_say ?>">
<?php
include $_SERVER['DOCUMENT_ROOT'] . '/chat/say/list_reply.php';
if (!empty($say)) {
foreach ($say as $saylist) : ?>
<div class="sayform" id="">
<!– Выводим логин и дату –>
<div class="topprintcomment" id="">
<b><?php echo $saylist['login']; ?></b>
<?php $t = $saylist['saydate'];
echo '<span style="float:right;">' . date("d.m.Y", "$t") . '</span>'; ?>
</div>
<!– Выводим аватар и комментарии –>
<div class="printcomment" id="">
<p></p><img src="<?= '/chat/admin/users/' . $saylist['img'] ?>" class="sayavatar">
<?php
$comment = $saylist['saytext'];
comment_to_smile($comment); //печатаем комментарии
$post_id = $saylist['id'];
/* Активация кнопок */
if (userHasRole('admin')) {
$buttonactive = 'submit'; //если админ делаем активными все кнопки
} elseif ($saylist['userid'] == $userid) {
$buttonactive = 'submit'; //делаем активными кнопки для юзера
} else {
$buttonactive = 'hidden'; //отключаем кнопки
} ?></p>
</div><!– END printcomment –>
<!– Выводим блок кнопок –>
<div class="block_button_say" id="">
<div class="wrappersaybutton">
<div class="reply_button" id="">
<div class="postnumber" id=""><?php echo '#' . $saylist['id']; ?> </div>
<a href="?reply=<?php htmlout($post_id); ?>" class="areply">Ответить</a>
</div>
<div class="sayright">
<div class="button_say_edit">
<form name="" method="post" action="/chat/say/sayedit.php" class="logout">
<input type="hidden" name="pageid" id="" value=" <?php echo $pageid; ?>" />
<input type="hidden" name="textedit" value="<?php echo $saylist['id']; ?>">
<input type="hidden" name="saytext" id="" value="<?php echo $saylist['saytext']; ?>" />
<input type="<?= $buttonactive ?>" name="actionedit" value="Редактировать" />
</form>
</div>
<div class="button_say_delete">
<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 $saylist['id']; ?>" />
<input type="<?= $buttonactive ?>" name="delete" id="" value="Удалить" />
</form>
</div>
</div>
</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'] . '/chat/say/form_add_reply.html.php';
}
} ?>
</div>
</div><!– END block_button_say –>
</div><!– END sayform –>
<!– Выводим ответы на комментарии и кнопки –>
<?php
include $_SERVER['DOCUMENT_ROOT'] . '/chat/say/print_reply.html.php';
endforeach;
} ?>
</div><!– END wrapsayform –>
</html>
Здесь вставляется, подготовленный в list_reply.php массив ответов на комментарии $reply, затем в цикле foreach – endforeach обрабатываются комментарии, содержащиеся в массиве $say, созданном в контроллере 3, которые выводятся в соответствующих блоках div и происходит активация кнопок для каждого комментария, затем в этом же цикле подключается файл print_reply.html.php, который печатает ответы и выводит кнопки ответов.
27. Форма добавления комментариев
Для добавления комментариев служит форма formaddsay.html.php
Листинг 43. form_addsay.html.php Путь: news/chat/say/ form_addsay.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" />
<title>Добавление</title>
</head>
<!– При нажатии кнопок формы идем на страницу сепарации переменных –>
<form action="/chat/say/separate_action.php" method="post" class="say">
<div>
<label for="saytext" class="say">Введите ваш комментарий:</label>
<textarea id="saytext" name="saytext" rows="5" cols="60" autofocus><?php if (isset($_SESSION['txt'])) {
echo htmlout($_SESSION['txt']);} ?></textarea>
</div>
<br />
<div class="">
<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="submit" name="action" value="Добавить">
<input type="submit" name="smileblock" value="Показать смайлы" style="">
<input type="submit" name="smileblock_close" value="Скрыть смайлы" style="">
</div>
<div class="notaddsay" id=""><a href="?">Отмена</a></div>
</div>
<br>
<hr>
<!– Вставляем лист доступных смайлов –>
<div class="smilesetdiv" id="">
<fieldset class="smileset" style="<?php if (isset($_SESSION['smileblock'])) {
echo $_SESSION['smileblock'];
} ?>">
<?php print_smile_set(); ?>
</fieldset>
</div>
</div>
<br />
</form>
</body>
</html>
Это HTML форма состоящая из следующих частей:
• Поле ввода комментариев тип textarea,autofocus.
• Кнопки «Добавить», «Показать смайлы», «Скрыть смайлы» тип input submit.
• Ссылка «Отмена», при нажатии обнуляет все значения в $_GET.
• Блок смайлов, который выводит доступный набор смайлов.
28. Обработка комментариев