📚 Hub Books: Онлайн-чтение книгРазная литератураPHP. Разработка модуля комментариев для сайта - Дмитрий Приходько

PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько

Шрифт:

-
+

Интервал:

-
+
1 ... 14 15 16 17 18 19 20 21 22 23
Перейти на страницу:

Для обработки комментариев служит скрипт makeformaddsay.php

Листинг 44. makeformaddsay.php Путь: news/chat/say/ makeformaddsay.php

<?php

error_reporting(E_ALL);

if(session_id() == '') {session_start();}

unset($_SESSION['txt']);

if (isset($_POST['nosay'])) {

$_GET['addsay'] ='';

header("Location: ".$_SERVER["HTTP_REFERER"]);// Делаем редирект

exit();

}

/* Проверяем наличие текста в форме */

if (empty($_POST['saytext'])) {

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 say SET

saytext = :saytext,

userid = :userid,

page_id = :page_id,

saydate = :saydate';

$s = $dsn->prepare($sql);

$saytext = html($_POST['saytext']);

$saydate = time();

$page_id = $_POST['page_id'];

$s->bindValue(':saytext',$saytext);

$s->bindValue(':saydate',$saydate);

$s->bindValue(':userid',$userid);

$s->bindValue(':page_id',$page_id);

$s->execute();

}

catch (PDOException $e) {

      echo 'makeformaddsay ошибка вставки комментария';

      echo 'sdsd'.$page_id;

echo $e->getMessage();

echo $e->getLine();

exit();

}

header("Location: ".$_SERVER["HTTP_REFERER"]);// Делаем редирект

exit();

}

header("Location: ".$_SERVER["HTTP_REFERER"]);// Делаем редирект

exit();

Скрипт также выполнен в отдельном файле во избежание проблем с сохранением $_POST в браузере. В нем проверяются данные отправленные из формы formaddsay.html.php «Добавить комментарии» и заносятся в БД.

29. Форма редактирования комментариев

Для редактирования комментариев служит форма form_editsay.html.php

Листинг 45. form_editsay.html.php Путь: news/chat/say/ form_editsay.html.php

<!DOCTYPE html>

<html lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<link rel="stylesheet" type="text/css" href="<?= $_SERVER['HTTP_ORIGIN'].'/chat/style.css'; ?>"/>

</head>

<body>

<form action="" method="post" class="sayedit">

<div>

<label for="saytext" class="say"><h4>Редактировать комментарий:</h4></label>

       <hr>

<textarea id="saytext" name="saytext" rows="6" cols="80" maxlength="100" autofocus><?= $_POST['saytext'];?></textarea>

</div>

<br/>

       <div class="">

<div class="says">

<input type="hidden" name="sayid" value="<?= $_POST['textedit'];?>">

<input type="submit" name="sayedit" value="Редактировать">

      <input type="submit" name="actionnot" value="Отмена">

</div>

       <br><hr>

       <div class="smilesetdiv" id="">

             <fieldset class="smileset" style="">

                  <?php print_smile_set();?>

       </fieldset>

       </div>

</div>

<br/>

</form>

</body>

</html>

Это HTML форма в которой можно отредактировать комментарий. Состоит из:

• Поле редактирования textarea со значением по умолчанию равным $_POST['saytext'].

• Кнопок «Редактировать» и «Отмена».

• Набор для выбора доступных смайлов.

30. Скрипт редактирования комментариев

Для редактирования комментариев служит файл sayedit.php

Листинг 46. sayedit.php Путь: news/chat/say/ sayedit.php

<?php

error_reporting(E_ALL);

if(session_id() == '') {session_start();}

include_once $_SERVER['DOCUMENT_ROOT'] .'/chat/admin/clean.php';

include $_SERVER['DOCUMENT_ROOT'].'/chat/function/print_smile_set.php';

/* Сохраняем переменную идентефикатор поста */

if (isset($_POST['textedit']) and $_POST['textedit'] != ""){

$_SESSION['idsave']      = $_POST['textedit'];

} else {

$_POST['textedit'] = $_SESSION['idsave'];

}

/* Заносим в базу и делаем редирект */

if (isset($_POST['sayedit']) and $_POST['sayedit'] == "Редактировать") {

try {

include_once $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';

$sql = 'UPDATE say SET saytext = :saytext WHERE id = :id';

$s = $dsn ->prepare($sql);

$s->bindValue(':saytext', $_POST['saytext']);

$s->bindValue(':id', $_POST['sayid']);

$res = $s->execute();

unset ($_SESSION['idsave']);

header("Location: /");

exit();

}

catch (PDOexeption $e) {

      echo $e->getMessage();

echo $e->getLine();

exit('error.html.php');

}

exit();

}

/* Контролируем нажатия кнопок */

if (isset($_POST['actionedit']) and $_POST['actionedit'] == "Редактировать") {

include $_SERVER['DOCUMENT_ROOT'].'/chat/say/form_editsay.html.php';

exit();

}

if (isset($_POST['smile'])) {

$_POST['saytext'] = $_POST['saytext'].$_POST['smile'];

include $_SERVER['DOCUMENT_ROOT'].'/chat/say/form_editsay.html.php';

}

if (isset($_POST['actionnot']) and $_POST['actionnot'] == "Отмена") {

header("Location: /");// Делаем редирект

exit();

}

В этом файле происходит обработка данных переданных из формы form_editsay.html.php. Контролируется нажатие кнопок «Редактировать», «Отмена» и вставки исмайлов. Производится обновление текста комментария и добавление обновленного текста в БД.

31. Создаем массив ответов на комментарии

Для этого используем скрипт list_reply.php

Листинг 47. list_reply.php Путь: news/chat/say/ list_reply.php

<?php

/* Формируем массив ответов на комментарии */

/* SELECT say.id, say.userid, say.saydate, say.saytext, users.login, users.img FROM say INNER JOIN users ON users.`id` = say.userid */

try {

$sql = 'SELECT reply.id, reply.userid, reply.replydate, reply.replyid, reply.replytext, users.login, users.img FROM reply INNER JOIN users ON users.id = reply.userid';

$stm = $dsn->query($sql);

} catch (PDOException $e) {

echo $e->getMessage();

echo $e->getLine();

exit();

}

foreach ($stm as $rows) {

$reply[] = array(

'id' => $rows['id'],

'replytext' => $rows['replytext'],

'userid' => $rows['userid'],

'replyid' => $rows['replyid'],

'img' => $rows['img'],

'login' => $rows['login'],

'replydate' => $rows['replydate'],

'userid' => $rows['userid']

);

}

Выбираем данные из таблицы reply, где id пользователя в таблице users совпадает со значением reply.userid. Т.е. выбираем ответы на комментарии для конкретного пользователя, соответствующие номеру комментария.

32. Обертка вывода ответов на комментарии

Для печати комментариев служит страница print_reply.html.php

Листинг 48. print_reply.html.php Путь: news/chat/say/ print_reply.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="wrap_reply_form" id="">

<?php

if (isset($reply)) {

foreach ($reply as $replylist) :

/* Активация кнопок */

if (userHasRole('admin')) {

$buttonactive = 'submit'; //если админ делаем активными все кнопки

} elseif ($replylist['userid'] == $userid) {

$buttonactive = 'submit'; //делаем активными кнопки для юзера

} else {

$buttonactive = 'hidden'; //отключаем кнопки

}

if ($post_id == $replylist['replyid']) {

$comment = $replylist['replytext'];

echo '<div class="block_reply">';      //делаем общий div для кнопки и ответа

include $_SERVER['DOCUMENT_ROOT'] . '/chat/say/form_reply.html';

include $_SERVER['DOCUMENT_ROOT'] . '/chat/say/reply_delete_button.html';

echo '</div>' . '</br>';

}

endforeach;

}

?>

</div> <!– .wrap_reply_form –>

</html>

В скрипте проверяем какие кнопки доступны для данного пользователя. Доступные выводим. Для ответов возможность редактирования не предусмотрена, поэтому только «Удалить». Эта кнопка доступна только автору ответа и администратору. Затем обрабатываем и печатаем ответ на комментарий, полученный из предыдущего скрипта list_reply.php.

33. Форма ответа на комментарий

Для вывода ответа на комментарий используем файл form_reply.html

Листинг 49. form_reply.html Путь: news/chat/say/ form_reply.html

<!DOCTYPE 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="reply_form">

<div class="topreply" id="">

<b><?= $replylist['login'] ?></b><span style="float:right;">

<?php $t = $replylist['replydate'];

echo date("d.m.Y", "$t");?>

</span>

</div>

<img src="<?='/chat/admin/users/'.$replylist['img']?>" class="avareply" align="left" />

<?php comment_to_smile($comment); ?>

</div>

Выводит логин пользователя, дату оставления ответа, аватар пользователя, текст ответа. Для span выводящего дату стили указаны непосредственно в файле, но можно присвоить класс при необходимости.

34. Страница ответов на комметарии

Выводим страницу с ответами на комментарии list_reply.html.php

Листинг 50. list_reply.html.php Путь: news/chat/say/ list_reply.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" >

<?php

if (!empty($reply)) {

foreach ($reply as $replylist) :

?>

<div class="sayform" id="">

<div class="printcomment" id="">

<?php

if ($post_id == $replylist['replyid']) {

$comment = $replylist['replytext'];

comment_to_smile($comment);

echo '#' . $replylist['id'];

echo '#' . $replylist['replyid'] . $replylist['login'] . $replylist['img'];

1 ... 14 15 16 17 18 19 20 21 22 23
Перейти на страницу:

Комментарии

Обратите внимание, что комментарий должен быть не короче 20 символов. Покажите уважение к себе и другим пользователям!

Никто еще не прокомментировал. Хотите быть первым, кто выскажется?