Пишем модуль Комментарии для нашей CMS

 

Если у Вас на блоге есть привлекательный, а может быть познавательный, пост, то было бы не плохо, чтобы читатели такого поста, имели возможность прокомментировать, тем самым выразить свои мысли, или же задать какой-нить, волнующий их вопрос. Возможность комментировать посты есть на всех блогах, значит и нам нужно написать такой модуль. Если верить статьям по повышению привлекательности блога, то возможность оставлять комментарии может повлиять на посещаемость. Итог напрашивается сам собой, модуль "комментариев" нужен Что ж, добро пожаловать на урок, где я с Вами буду писать подобный модуль для нашего блога.

 

 

Что же нам понадобится? Два шаблона, один из них будет содержать html код формы, которую пользователь смог бы заполнить. Второй - визуальное оформление уже оставленных комментариев. Так же нам понадобится обработчик, который записывал бы посланный комментарий в базу данных, и само собой код, который будет выводить уже отправленные сообщения.. И того нам понадобится написать 3 файла, и подправить наш index.php

Начнем мы с создание базы данных для сообщений. Перед тем как вывешу sql запрос, хотел бы пояснить, как мы будем определять, для какого поста был написан комментарий.. В базе данных будет создан отдельный столбец, назовем его "blog" он будет содержать id поста, собственно при выводе статьи с id=1, на экран будут выводится все комментарии, в которых blog=1. Собственно я считаю, что Вы и сами догадывались, как выводятся комментарии, но все же я пояснил

Ну что ж, вот sql запрос таблицы с комментариями (Присутствуют 2 комментария для поста под индексом 1)

CREATE TABLE IF NOT EXISTS `comm` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`author` varchar(255) NOT NULL,
`text` text NOT NULL,
`date_comm` varchar(255) NOT NULL,
`blog` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

INSERT INTO `comm` (`id`, `author`, `text`, `date_comm`, `blog`) VALUES
(1, 'Rio-Shaman', 'Тест сообщение 1', '22/10/2011 18:34', 1),
(2, 'Rio-Shaman', 'Тест сообщение 2', '22/10/2011 18:37', 1);

Теперь приступим к созданию шаблонов, наши комментарии будут выглядеть так же как и посты, это значит, что мы можем просто скопировать html код из шаблона text.html, который мы писали в статье "Пишем модуль 'Статьи' для нашей CMS" в наш новый файл comm.html. Естественно в коде нужно кое что подправить. Например нам не нужна кнопка "назад" и тег p который отвечал за вывод название статьи, вот готовый html код шаблона comm.html

<div class="div_news">
<p>[_text]</p>
</div>
<div class="div_footer">
Автор: [_author] | [_date_b]
</div>

Сохраняем файл в ту же папку templates

Вот шаблон с формой нам придется писать с нуля. Для начала мы создадим простую форму без проверки на спам, то есть наша форма будет содержать лишь два поля ввода, для имени и собственно самого текста. Так же нужно создать одно скрытое поля, для сохранения в нем id поста, для последующей транспортировки методом post в обработчик комментариев, я набросал примитивную форму, вот код:

<p>Оставить комментарий</p>
<form action="index.php?blog=[_id]" method="post" name="form">
<input name="id_comm" type="hidden" value="[_id]">
<br>
<input style="width:400px;" name="author_comm" type="text" value="Автор*">
<br>
<textarea style="width:400px;" name="txt_comm" rows="10">Введите текст*</textarea>
<br><br><input type="submit" value="Оставить комментарий">
</form>

[_id] будет содержать id открытого пользователем поста. Я назвал этот шаблон comm_form.html и сохранил в папке templates.

Два файла из трех у нас есть. Приступим к написанию самого модуля. Суть его будет такова:

При открытия поста пользователем, index.php проверит, существует ли переменная $blog. Если да, то подключит модуль text.php. После того как готовый, с генерированный код, поступает в переменную $text, index.php подключает еще один модуль. Модуль комментариев проверит, есть ли в базе данных сообщения к открытому посту. Если есть, подключит шаблон (comm.html), запустит цикл, в котором заменит все код-слова на записи из базы данных. После цикла подключится наша форма(comm_form.html). Далее, результат работы нашего модуля просто приклеивается к результату работы модуля text.php, и выводится на экран.

Вот код модуля с комментариями

<?
function comm($blog)
{
$result_index = mysql_query("SELECT * FROM comm WHERE blog='$blog' ORDER BY id DESC");//Выводим из базы данных все записи где blog равен ID поста
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/comm.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
do//Цикл do while
{
$edd_tamp = $sm_read;//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер

//Замены идентификаторов на переменные из базы данных
$edd_tamp = str_replace("[_text]",$myrow_index[text],$edd_tamp);//Текст
$edd_tamp = str_replace("[_author]",$myrow_index[author],$edd_tamp);//Автор статьи
$edd_tamp = str_replace("[_date_b]",$myrow_index[date_comm],$edd_tamp);//Дата размещения

$comm .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
}
else $comm = "<p align='center'>Комментариев нет, Вы будите первым =)</p>";//Если записей нет, то вывести это сообщение

$form = file("templates/comm_form.html");//подключаем шаблон с формой
$form = implode("",$form);//функция file() возвращаем массив, поэтому склеиваем его

$form = str_replace("[_id]",$blog,$form);//вклеиваем id поста в форму

$comm .= $form;

return $comm;//Выводим с генерированный html код
}
?>

Я назвал модуль comm.php и поместил в папку moduls.

Для вывода результата функции на экран необходимо подправить файл index.php, а именно вставить вот этот код:

//МОДУЛЬ КОММЕНТОВ
if($blog)
{
include("moduls/comm.php");
$comm = comm($blog);//Выводим результат функции в переменную
$txt .= $comm;
}
//МОДУЛЬ КОММЕНТОВ

после модуля статей, но перед строкой

include("templates/index.html");

Пришло время приступить к реализации отправки сообщений из, написанной нами, формы. Поясню как это все будет работать:

Отправляются сообщения методом post, а это означает, что на сервере будет создана глобальная переменная $_POST. В этой переменной будет находится вся введенная пользователем информация. Все что вводит пользователь, расценивается как потенциальная угроза для нашего блога, поэтому перед занесением информации в базу данных, ее стоит провести через некие фильтры. Базовое, что следует сделать, это заменить все теги (если они есть) с помощью функции htmlspecialchars(); и избавится от кавычек. После чего, введенную информацию можно сохранить в базе данных. Так же нам следует с генерировать дату отправки с помощью функции date();

Писать обработчик будем в файле comm.php перед функцией (function comm($blog){...}), приступим:

//--------------ОБРАБОТЧИК КОММЕТАРИЕВ
$date_day = date("d");//Определяем день
$date_month = date("m");//Определяем месяц
$date_year = date("Y");//Определяем год
$date_time = date("H:i");//Определяем часы и минуты
$date_comm = $date_day."/".$date_month."/".$date_year." ".$date_time;//Склеим все переменные в одну
//получим дату для записи в формате день/месяц/год часы:минуты

//Определяем посланные переменные из формы
if(isset($_POST['id_comm']))$id_comm = $_POST['id_comm'];
if(isset($_POST['txt_comm']))$txt_comm = $_POST['txt_comm'];
if(isset($_POST['author_comm']))$author_comm = $_POST['author_comm'];

if($id_comm & $txt_comm & $author_comm)//Если посланные переменные определены как существующие
{
//Переводим html код (если есть) в каракозябры =)
//Вообщем то тут несколько лишних строк, но у меня паранойя, поэтому я проверяю ВСЕ переменные
$id_comm = htmlspecialchars($id_comm);
$txt_comm = htmlspecialchars($txt_comm);
$author_comm = htmlspecialchars($author_comm);

//Избавляемся от кавычки
$id_comm = str_replace("'","&#039",$id_comm);
$txt_comm = str_replace("'","&#039",$txt_comm);
$author_comm = str_replace("'","&#039",$author_comm);

$txt_comm = str_replace("\n","<BR>",$txt_comm);//Заменяем переносы строки на тег <BR>

//Добавляем сообщение в базу данных
$result_add_comm = mysql_query ("INSERT INTO comm (author,text,date_comm,blog)
VALUES ('$author_comm','$txt_comm','$date_comm','$id_comm')");

header("location: index.php?blog=$blog");//Перенаправляем пользователя
exit;//обратно к форме с комментариями
}
//--------------ОБРАБОТЧИК КОММЕТАРИЕВ

Я писал этот модуль вместе со статьей, у меня все работает. Жду ваших комментариев, у меня все, удачи вам

Исходник

Возможно Вам будут интересны следующие заметки