Я тут немного отвлекся - потребовалось срочно написать гостевую книгу.
Сегодняшний выпуск и посвящен этому вопросу. Я не знаю пока, где эта
информация будет размещена в структуре книги и какой по счету это шаг -
но, поскольку раздел закончен, положим его на сайт, а там - посмотрим.
Гостевая книга
Сегодня мы создадим небольшую гостевую книгу.
Готовых скриптов на эту тему в сети можно найти немало.
Обычно все они сопровождаются инструкцией по установке и особых
проблем возникнуть не должно. Разбирать достоинства и/или недостатки
этих скриптов - не входит в мои планы. Ты можешь выбрать любой из них
или воспользоваться тем, что (как правило) предоставил твой хостер.
Однако, у нас учебный курс - вот мы и напишем для практики свой собственный
сервис.
Вопрос первый, на который нужно ответить прежде всего - технология
вывода информации посетителю и то, как эта информация хранится на сервере.
Мы не будем использовать базу данных, хотя её использование дало бы нам
некоторую гибкость и "изящество" при написании скрипта. При желании ты можешь
легко модифицировать этот пример с применением базы 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 ===
=================================
Как это выглядит на практике - можно посмотреть на сайте в разделе
"Ваши отзывы".
Если открыть исходный код страницы, то можно легко заметить, что
центральная часть (записи гостевой книги) состоит из набора таблиц -
по одной на каждую запись. Поэтому наш следующий шаг - создание
прообраза этой таблицы в том виде, как мы это видим в рамках дизайна
нашего сайта.
Пример такого шаблона можно увидеть ниже.
=================================
=== for registered users only ===
=================================
Теперь нам нужно "научить" блок приема информации формировать необходимый
код. И сделать это вовсе не сложно.
Блок приема информации в свою очередь состоит из двух модулей: вывод формы
для ввода сообщения и модуль обработки результатов.
Многие гостевые книги выводят форму для ввода на ту же страницу, где
отображаются результаты. Можно и в данном примере поступить так же,
дописав код вывода формы в файл guestbook.php вместо строчки с кнопкой
"Добавить отзыв".
Мне такой подход не нравится из тех соображений, что не каждый, кто
читает отзывы горит желанием писать. Но это - дело вкуса вебмастера,
куда размещать форму ввода.
Итак, наш модуль вывода формы для заполнения выглядит следующим
образом:
addmsg.php:
Здесь вроде всё понятно и особых комментариев не требуется.
А вот следующий модуль требует некоторых пояснений прежде, чем мы начнём
воплощать его в жизнь.
Многие авторы подобных скриптов включают в этот модуль "фишки" в виде
регистрации посетителя, недопускании пустых полей, антимат, блокировку
по IP и прочее.
Мой взгляд на эти вещи такой. Во-первых, посетитель может написать
в книгу один отзыв и больше никогда не появится на сайте. Зачем ему
регистрация? К тому же, из предыдущих уроков, мы легко можем узнать
пришел к нам новый посетитель или это зарегистрированный в нашей базе
клиент. А в этом случае поля имя, емайл, сайт, ICQ и город мы можем
заполнить автоматически, поскольку у нас есть запись обо всём этом в нашей
базе. Как это сделать мы расстмотим в другом примере - где регистрация
нам потребуется обязательно. В данном же случае нам важно одно - ввел
посетитель свое сообщение или нет. Что касается антимата - то с ухищрениями
злоумышлеников бороться весьма проблематично. В частности, известная
комбинация из трех букв (не считая падежей и склонений) может быть
набрана 15-ю способами. И это не считая других слов. Если даже и написать
такой универсальный модуль - то время проверки может занять слишком
много времени. Проще следить за своей книгой и вовремя удалять такие
сообщения. Что касается блокировки по IP - то это вообще абсурд. Ну
заблокируют меня, к примеру, с моим динамическим IP-шником, а вместе
со мной и всех клиентов моего провайдера, кто выйдет в Интернет по
этому подключению. Смысл в чём?
С учетом этого наш модуль должен определить - пустое сообщение или нет и
в зависимости от этого либо снова перейти на страничку просмотра записей,
либо внести новую запись в базу. При этом надо не забыть отправить сообщение
себе на емайл. Все остальные поля - допускаются пустыми. Единтственное,
что мы сделаем в этом случае - в поле "имя" впишем "гость".
Все необходимые комментарии приведены ниже в исходном коде.
addgbook.php:
=================================
=== for registered users only ===
=================================
Здесь необходимо отметить еще одну деталь. Как видно из текста программы
идет проверка длины поля на максимальную длину. Казалось бы, зачем это
делать, если у нас в форме уже и так стоит ограничитель максимальной
длины? Но дело в том, что
=================================
=== for registered users only ===
=================================
В связи с этим, желательно принять дополнительные меры по борьбе с
роботами и спамом. Поскольку этот блок относительно универсален и может
применяться не только в этой гостевой книге, а и в любом другом документе,
где предусмотрена "обратная связь" - исходный код этого блока вынесен
в отдельный раздел (см. оглавление). При желании его можно легко добавить
в пример выше.
Еще один момент, который требует пояснения. Что делать, когда гостевая
книга станет неприлично большой? Разбивать на страницы - напрашивается ответ.
Можно, конечно, разместить этот скрипт на сайт и забыть про него. Сообщения
о добавлении новых записей мы получаем на емайл и знаем что творится в
этом разделе на сайте. Можно было бы автоматически разбивать страницы
после определенного количества записей. Но для этого придется вернуть
на место строчку <? include "gbdata.php"; ?> и в этом файле
разместить скрипт, который и будет автоматически разбивать на отдельные
страницы по 10 (20,30 и т.п.) записей. Я не сделал этого в данном примере
вот почему.
Во-первых, в любом случае в ближайшем обозримом будущем я буду довольно
регулярно возвращаться на свой сайт. И мне не составить никакого труда
разбить эту страничку на две, когда размер превысит 3-4 экрана. Во-вторых,
для такого подхода желательно было бы немного переделать базу сообщений
(хотя можно оставить и так, как есть). Но самое главное заключается в том,
что мы идем от простого к сложному. На этом примере поняли принцип работы,
на следующем - добавим "фишки". Более "навороченный" пример этого скрипта
можно посмотреть в разделе "Вопросы и ответы" (см.оглавление).
Теперь, что касается администрирования. Я не стал делать этот модуль
по той причине, что не смог надумать более-менее оправданную ситуацию,
когда этот скрипт может потребоваться. Есть только две ситуации, когда
потребуется наше вмешательство - разбить на страницы и удалить "плохое"
сообщение. Но это несложно сделать и ручками ;) если же у тебя все-таки
возникнет желание написать такой модуль администрирования, то можно
посмотреть как это реализовано в разделе "Вопросы и ответы"
и сделать по аналогии.