Если у Вас на блоге есть привлекательный, а может быть познавательный, пост, то было бы не плохо, чтобы читатели такого поста, имели возможность прокомментировать, тем самым выразить свои мысли, или же задать какой-нить, волнующий их вопрос. Возможность комментировать посты есть на всех блогах, значит и нам нужно написать такой модуль. Если верить статьям по повышению привлекательности блога, то возможность оставлять комментарии может повлиять на посещаемость. Итог напрашивается сам собой, модуль "комментариев" нужен Что ж, добро пожаловать на урок, где я с Вами буду писать подобный модуль для нашего блога.
Что же нам понадобится? Два шаблона, один из них будет содержать 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("'","'",$id_comm);
$txt_comm = str_replace("'","'",$txt_comm);
$author_comm = str_replace("'","'",$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;//обратно к форме с комментариями
}
//--------------ОБРАБОТЧИК КОММЕТАРИЕВ
Я писал этот модуль вместе со статьей, у меня все работает. Жду ваших комментариев, у меня все, удачи вам
Исходник |
Вы мне ответили на
mailto: viktorp284@gmail.com
Если хотите связаться со мной, пишите через форму "Контакты".
Пробовал вставлять слова - метки, не помогло.
http://rio-shaman.ru/index.php?blog=96
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\adobe\www\moduls\text.php:1) in Z:\home\adobe\www\moduls\comm.php on line 33
Немогу разобраться в чем дело, проверял text.php там все по уроку, в comm.php тоже
http://rio-shaman.ru/index.php?blog=133
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\blog\index.php:1) in Z:\home\localhost\www\blog\moduls\comm.php on line 34
У вашего блога один из лучших дизайнов, которые я видел. В одном стиле но без перегруза графикой. Зря говорят, что черный цвет мрачный.
Unicode Signature (BOM). Если я правильно понял образуется символ, который отсылается в браузер, но его не видно.
В разных редакторах снимается по-разному. В дримвьюере например:
изменить-свойства страницы-название\кодировка - убрать флажок Unicode Signature (BOM). Так перезаписать все файлы.
хотел бы сделать на сайте комментарии от авторизованных пользователей.
и есть предложение интегрировать авторизацию от ulogin.ru
ну чтобы в новостях могли комментировать пользователи авторизовавшиеся через ulogin.ru
Идею взял из Russeller там так и сделано)
Как выйти из положения?
Могу для начала посоветовать посмотреть есть ли какой либо текст в переменных $author_comm, $txt_comm, $date_comm, $id_comm
Для этого перед
//$author_comm = htmlspecialchars($author_comm);
Нашёл на днях Ваш блог и теперь осваиваю урок за уроком, и Ваши многочисленные комментарии действительно помогают разобраться, спасибо!
В этой статье впервые встретил препятствие. Вопрос уже дважды задавали, но ответы мне не помогли. Код для первого раза я взял Ваш с той разницей, что у меня все шаблоны в папке "templates" лежат с расширением .php, мне так привычней, а так же все файлы имеют расширения utf-8 (index.php - utf-8, остальные без BOM).
При создании нового комментария выскакивает сообщение о том, что заголовки уже отправлены
Подскажите, пожалуйста. как ещё можно реализовать перезагрузку страницы после добавления комментария?
Очень часто случается так, что у читателей проблема именно в этом.
Ну бывают случаи когда проблемой является конфликт двух кодировок (utf-8 и cp1251).
p.s.: Кстати, если я не ошибаюсь, файлы с utf-8 с BOM тоже могут вызывать данную ошибку
- $author_comm
- $txt_comm
- $date_comm
- $id_comm
На наличие каких либо значений в них.
Проверить можно с помощью оператора echo
Сперва позвольте поблагодарить Вас за ваши статьи, очень полезны для начинающих, и разрешите вопрос:
В обработчике в файле comm.php идет защита с очисткой комментария от тегов через функцию htmlspecialchars, то есть преобразование в символы. А потом дополнительно
//Избавляемся от кавычки
$id_comm = str_replace("'","'",$id_comm);
Но у функции htmlspecialchars, по мануалу, есть параметр ENT_QUOTES который как раз преобразует как двойные, так и одинарные кавычки. Скажите, почему Вы не используете его, а пишите дополнительную замену через функцию str_replace?
На самом деле от кавычек лучше не избавляться а экранировать спецсимволом.
Если не трудно, объясните, пожалуйста, почему кавычки лучше экранировать? Ведь в тексте статьи они не нужны для функционала никак.
"коммент на который отвечает"
А тут сам коммент
Помогите! :)
Вам необходимо создать дополнительную колонку в БД а которой хранить id комментария на который делается ответ. Если эта колонка содержит ноль или null (это зависит от того как Вы предполагаете хранить данные) то этот комментарий - обычный. Если в ней (в колонке) содержится id комментария то это ответ. По этому id Вы можете получить и сам комментарий и имя автора который его написал.