Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Вебсайт. 210 шагов до успеха. Руководство для Незнайки. # выпуск # 050116


Информационный Канал Subscribe.Ru


Я тут немного отвлекся - потребовалось срочно написать гостевую книгу. Сегодняшний выпуск и посвящен этому вопросу. Я не знаю пока, где эта информация будет размещена в структуре книги и какой по счету это шаг - но, поскольку раздел закончен, положим его на сайт, а там - посмотрим.


  Гостевая книга  

Сегодня мы создадим небольшую гостевую книгу.

Готовых скриптов на эту тему в сети можно найти немало.

Обычно все они сопровождаются инструкцией по установке и особых проблем возникнуть не должно. Разбирать достоинства и/или недостатки этих скриптов - не входит в мои планы. Ты можешь выбрать любой из них или воспользоваться тем, что (как правило) предоставил твой хостер.

Однако, у нас учебный курс - вот мы и напишем для практики свой собственный сервис.

Вопрос первый, на который нужно ответить прежде всего - технология вывода информации посетителю и то, как эта информация хранится на сервере. Мы не будем использовать базу данных, хотя её использование дало бы нам некоторую гибкость и "изящество" при написании скрипта. При желании ты можешь легко модифицировать этот пример с применением базы MySQL.

Информацию (текст) гостевой книги будем хранить в обычном текстовом файле.

Учитывая, что мы уже можем собирать нашу страницу из фрагментов, сделаем следующее. Шаблон странички ("шапку" и "подвал") готовим отдельно и по своему вкусу, а текстовку гостевой дописываем из внешнего файла.

Наш файл "гостевой книги" приобретает следующий вид.

guestbook.php:

<html>
<body>
<? include "header.php"; ?>  //  "шапка" 
<? include "gbdata.php"; ?>  //  "гостевая"
<? include "bottom.php"; ?>  //  "подвал"
</body>
</html>

Как всё просто ;) С 3-ей и 5-ой строчкой всё понятно, мы это делали и ранее. Вся "изюминка" заключается в файле gbdata.php.

И тут есть два подхода. Первый заключается в том, что gbdata.php - это скрипт, который обрабатывает "базу" сообщений и выводит их на экран пользователя. У меня изначально и было такое желание - написать такой скрипт обработки. Как всегда - изящно и красиво ;) Но потом - подумал. ;)

Наша "гостевая книга" состоит из двух блоков. Блок ввода информации в базу и блок вывода информации из базы на экран. Можно еще сказать и о третьем блоке - администрировании, но к этому мы подойдем чуть позже.

Ну так вот, зачем писать два блока? Пусть в базе находится информация уже пригодная для отображения на экране - т.е. по сути это уже готовый html-код. А "обязанность" готовить html-код мы возложим на блок ввода информации.

Таким образом строчку <? include "gbdata.php"; ?> мы заменяем на <? readfile ("gbdata.php"); ?>. Получилось ещё изящней ;)

Теперь вопрос - где его разместить на сайте? Еще раз повторю - не нужно держать файлы с доступом на запись в тех же директориях, где расположены и "исполняемые" файлы ("умный" хостер часто блокирует возможность такого размещения).

Поэтому делаем следующие действия.

 
=================================
=== for registered users only ===
=================================

Теперь моя страничка на сайте приобрела вид:

<html>
<body>
<? include "header.php"; ?>
<center>ЖАЛОБНАЯ КНИГА<br>ОТЗЫВОВ</center>
<p>
<form action="addmsg.php"><input type=submit value="Добавить отзыв"></form>
<hr> 
<? readfile "mydata/gbdata.txt"; ?>
<hr>
<form action="addmsg.php"><input type=submit value="Добавить отзыв"></form>
<? include "bottom.php"; ?>
</body>
</html>

Как это выглядит на практике - можно посмотреть на сайте в разделе "Ваши отзывы".

Если открыть исходный код страницы, то можно легко заметить, что центральная часть (записи гостевой книги) состоит из набора таблиц - по одной на каждую запись. Поэтому наш следующий шаг - создание прообраза этой таблицы в том виде, как мы это видим в рамках дизайна нашего сайта.

Пример такого шаблона можно увидеть ниже.

 
=================================
=== for registered users only ===
=================================

Теперь нам нужно "научить" блок приема информации формировать необходимый код. И сделать это вовсе не сложно.

Блок приема информации в свою очередь состоит из двух модулей: вывод формы для ввода сообщения и модуль обработки результатов.

Многие гостевые книги выводят форму для ввода на ту же страницу, где отображаются результаты. Можно и в данном примере поступить так же, дописав код вывода формы в файл guestbook.php вместо строчки с кнопкой "Добавить отзыв".

Мне такой подход не нравится из тех соображений, что не каждый, кто читает отзывы горит желанием писать. Но это - дело вкуса вебмастера, куда размещать форму ввода.

Итак, наш модуль вывода формы для заполнения выглядит следующим образом:
addmsg.php:

<html>
<head><title>Книга отзывов</title>
<? include "meta.php"; ?>
<STYLE><? include "210steps.css"; ?></STYLE>
</head>
<body>
<? include "header.php"; ?>
<center>
<div id=avto11><div id=avto2>Добавление отзыва</div></div>
<p>
<hr> 
<form action="addgbook.php">
<table width=450 border=0>
<tr>
<td align=right width=20><img src="/mygif/face1.gif" width="11" 
height="14" border="0" alt="Имя"></td>
<td align=right width=40>Имя:</td>
<td width=390><input type="text" size="25" name="name" value="" maxlength="30"></td></tr>
<tr>
<td align=right width=20><img src="/mygif/url.gif" width="18" 
height="18" border="0" alt="Сайт"></td>
<td align=right width=40>Сайт:</td>
<td><input type="text" size="30" name="url" maxlength="50" 
value=""></td></tr>
<tr>
<td align=right width=20><img src="/mygif/email.gif" width="18" height="15" 
border="0" alt="E-mail"></td>
<td align=right width=40 nowrap>Email:</td>
<td><input type="text" size="30" name="email" value="" maxlength="50"></td></tr>
<tr>
<td align=right width=20><img src="/mygif/icq.gif" width="17" height="18" border="0" alt="Icq"/></td>
<td align=right width=40>Icq:</td>
<td><input type="text" size="10" name="icq" value="" maxlength="10"></td></tr>
<tr>
<td align=right width=20><img src="/mygif/home.gif" width="17" height="18" border="0" alt="Город"/></td>
<td align=right width=40>Icq:</td>
<td><input type="text" size="20" name="city" value="" maxlength="20"></td></tr>
<tr>
<td align=right width=20><img src="mygif/msg.gif" width="15" 
height="18" border="0" alt="Сообщение"></td>
<td align=left width=430 colspan=2>Сообщение:</td></tr>
<tr>
<td colspan="3" width=450><textarea name="msg" rows="15"cols="70"></textarea></td></tr>
<tr><td colspan="3" align="right"><input type="submit" value="Отправить отзыв"></td></tr>
</table></form>
<p> 
<hr>
</center>
<br><br>
<? include "bottom.php"; ?>
</body>
</html>

Здесь вроде всё понятно и особых комментариев не требуется.

А вот следующий модуль требует некоторых пояснений прежде, чем мы начнём воплощать его в жизнь.

Многие авторы подобных скриптов включают в этот модуль "фишки" в виде регистрации посетителя, недопускании пустых полей, антимат, блокировку по IP и прочее.

Мой взгляд на эти вещи такой. Во-первых, посетитель может написать в книгу один отзыв и больше никогда не появится на сайте. Зачем ему регистрация? К тому же, из предыдущих уроков, мы легко можем узнать пришел к нам новый посетитель или это зарегистрированный в нашей базе клиент. А в этом случае поля имя, емайл, сайт, ICQ и город мы можем заполнить автоматически, поскольку у нас есть запись обо всём этом в нашей базе. Как это сделать мы расстмотим в другом примере - где регистрация нам потребуется обязательно. В данном же случае нам важно одно - ввел посетитель свое сообщение или нет. Что касается антимата - то с ухищрениями злоумышлеников бороться весьма проблематично. В частности, известная комбинация из трех букв (не считая падежей и склонений) может быть набрана 15-ю способами. И это не считая других слов. Если даже и написать такой универсальный модуль - то время проверки может занять слишком много времени. Проще следить за своей книгой и вовремя удалять такие сообщения. Что касается блокировки по IP - то это вообще абсурд. Ну заблокируют меня, к примеру, с моим динамическим IP-шником, а вместе со мной и всех клиентов моего провайдера, кто выйдет в Интернет по этому подключению. Смысл в чём?

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

Все необходимые комментарии приведены ниже в исходном коде.
addgbook.php:

 
=================================
=== for registered users only ===
=================================

Здесь необходимо отметить еще одну деталь. Как видно из текста программы идет проверка длины поля на максимальную длину. Казалось бы, зачем это делать, если у нас в форме уже и так стоит ограничитель максимальной длины? Но дело в том, что

 
=================================
=== for registered users only ===
=================================
В связи с этим, желательно принять дополнительные меры по борьбе с роботами и спамом. Поскольку этот блок относительно универсален и может применяться не только в этой гостевой книге, а и в любом другом документе, где предусмотрена "обратная связь" - исходный код этого блока вынесен в отдельный раздел (см. оглавление). При желании его можно легко добавить в пример выше.

Еще один момент, который требует пояснения. Что делать, когда гостевая книга станет неприлично большой? Разбивать на страницы - напрашивается ответ. Можно, конечно, разместить этот скрипт на сайт и забыть про него. Сообщения о добавлении новых записей мы получаем на емайл и знаем что творится в этом разделе на сайте. Можно было бы автоматически разбивать страницы после определенного количества записей. Но для этого придется вернуть на место строчку <? include "gbdata.php"; ?> и в этом файле разместить скрипт, который и будет автоматически разбивать на отдельные страницы по 10 (20,30 и т.п.) записей. Я не сделал этого в данном примере вот почему.

Во-первых, в любом случае в ближайшем обозримом будущем я буду довольно регулярно возвращаться на свой сайт. И мне не составить никакого труда разбить эту страничку на две, когда размер превысит 3-4 экрана. Во-вторых, для такого подхода желательно было бы немного переделать базу сообщений (хотя можно оставить и так, как есть). Но самое главное заключается в том, что мы идем от простого к сложному. На этом примере поняли принцип работы, на следующем - добавим "фишки". Более "навороченный" пример этого скрипта можно посмотреть в разделе "Вопросы и ответы" (см.оглавление).

Теперь, что касается администрирования. Я не стал делать этот модуль по той причине, что не смог надумать более-менее оправданную ситуацию, когда этот скрипт может потребоваться. Есть только две ситуации, когда потребуется наше вмешательство - разбить на страницы и удалить "плохое" сообщение. Но это несложно сделать и ручками ;) если же у тебя все-таки возникнет желание написать такой модуль администрирования, то можно посмотреть как это реализовано в разделе "Вопросы и ответы" и сделать по аналогии.

написать письмо написать письмо автору
мой статус ICQ - (не)доступен сейчас
ICQ: 13662936
© -= Валерий Баринов =-
Vladivostok, 2005

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: inet.webbuild.210steps
Отписаться

В избранное