Пишем скрипт гостевой книги. Часть 2
С предкодинговой подготовкой мы закончили. Теперь перейдём собственно к процессу создания гостевой книги. Самое приятное, что ожидает Вас в этой части — это то, что результаты будут появляться постепенно, но первые будут видны сразу. То есть, их можно будет увидеть и даже пощупать. Мышью.
Для начала мы напишем каптчу. Это будет простой скрипт, который будет брать уже приготовленную картинку в качестве фона и наносить на неё случайное число не менее приготовленным шрифтом. Хранить число (для проверки) будем в сессии.
Вот листинг сей незамысловатой программы:
<?
session_start(); // начинаем сессию
$num = rand (0, 999999); // генерируем случайное число
$_SESSION ['num'] = $num; // записываем его в сессию$img = imagecreatefromjpeg (“base.jpg”); // создаём изображение на основе фона
imagettftext ($img, 36, 1, 1, 70, 70, “FONT.TTF”, $num); // пишем на него число
// FONT.TTF измените на имя файла с шрифтомю Или измените имя файла шрифта на FONT.TTF =Pheader (“Content-Type: image/jpeg”); // даём браузеру понять, что мы отправляем картинку
imagejpeg ($img); // отправляем её
?>
Попробуйте скрипт на работоспособность. Залейте его на сервер и откройте через браузер. Он должен показать или предложить сохранить картинку. А на картинке должно быть написано случайное число.
Вроде всё работает, так что идём дальше.
Теперь напишем главный файл. Или, лучше даже, Файл. Файл, который будет выводить записи гостевой книги. Но, перед этим, то, о чём я чуть не забыл. О формате хранения записей в гостевой. А они, то бишь записи, буду храниться в PHP-файлах. Файлы будут выглядеть примерно так:
<?
$m_name = “Имя пользователя”;
$m_mail = “mylo_usera@domen.zona”;
$m_icq = “12345″;
$message = <<< EOD
А здесь собственно сообщение. Синтаксис heredoc позволяет не экранировать кавычки, что очень удобно для зранения подобных данных.
EOD;
$adm_reply = “Ответ админа”;
?>
Имена файлов будут иметь вид номер.php. Чем больше номер, тем новее сообщение. Можете сделать такое «сообщение» в папке messages (ах да, храниться они будут именно там). Но в скрипте будет фича, при которой отсутствие сообщений обрабатывается и выводится информация по этому поводу. Так что ради этого Вы можете и не создавать тестовое «сообщение».
Ну а теперь о index.php. Он просто будет выводить сообщения, используя парочку хитростей для разделения на страницы (хитрости состоят в том, что до них, быть может, сложно догадаться). О них Вы можете узнать поподробнее в прокомментированном листинге.
<?
include (“settings.php”); // инклюдим настройки
$d = dir (“./messages/”); // открываем директорию с сообщениями
// читаем её
while (false !== ($entry = $d->read()))
{
// отлавливая все файлы вида номер.php
if (preg_match (“/[0-9].php/”, $entry))
{
// и занося их номер в массив
$msgs[] = str_replace (“.php”, “”, $entry);
}
}
// если таковых файлов не обнаружено
if (!isset ($msgs))
{
// загружаем шаблон для отображения системного сообщения
$content = file_get_contents (“./templates/” . $guest_template . “/template_systemmsg.html”);
// и записываем в него сообщение об отсутствии записей. Его и будем выводить
$content = str_replace (“%SYSTEM_MSG%”, “На данный момент сообщений нет. Вы можете статьи первым в гостевой книге, отправив своё сообщение.”, $content);
}
// если записи всё же есть
else
{
$content = “”;
// считаем сообщения
$count = count ($msgs);
// подсчитываем количество страниц в гостевой книге
for ($i = 0; $i < $count / 10; $i++)
{
$pgcount = $i + 1;
}
// начинать будем с самого свежего сообщения
$start = 0;
// или нет?
// если в скрипт была передана переменная page,
// а это значит, кто начинать будем не с самого свежего сообщения
if (isset ($_GET ['page']))
{
// чекаем входные данные на валидность
// если не валидны, просто показываем самые свежие сообщения
$pgid = $_GET ['page'];
if (!preg_match (“/[0-9]/”, $pgid)) header (“Location: ./”);
if ($pgid > $pgcount) header (“Location: ./”);
$start = ($pgid – 1) * 10;
}
sort ($msgs, SORT_NUMERIC); // сортируем массив msgs
$end = min ($start + 10, $count); // будем смотреть либо 10 сообщений, либо сколько хватит
$i = 1; // это ни о чём
// а теперь будем выводить сообщения
for ($i = $start; $i < $end; $i++)
{
include (“./messages/” . $msgs[count($msgs) - 1 - $i] . “.php”); // загружаем сообщение
$block = file_get_contents (“./templates/” . $guest_template . “/template_block.html”); // загружаем шаблон
$block = str_replace (“%BLOCK_NUMBER%”, $count – $i, $block); // парсим один из тегов. Далее — по аналогии
$bbcodes = array (“b”, “B”, “i”, “I”, “u”, “U”); // список разрешённых bb-кодов
foreach ($bbcodes as $code)
{
// заменяем коды на теги
$message = str_replace (“[" . $code . "]“, “<” . $code . “>”, $message);
$message = str_replace (“[/" . $code . "]“, “</” . $code . “>”, $message);
}
$block = str_replace (“%BLOCK_TEXT%”, $message, $block); // вывод сообщения
$contact = “Сообщение оставил <strong>” . $m_name . “</strong>”; // вывод контактной инфы
if (!empty ($m_mail) && $show_emails)
{
$mail = str_replace (“@”, ” at “, $m_mail);
$mail = str_replace (“.”, ” dot “, $mail);
$contact = $contact . “, email: ” . $mail;
}
if (!empty ($m_icq) && $show_uins)
{
$contact = $contact . “, icq: ” . $m_icq;
}
$block = str_replace (“%CONTACTS%”, $contact, $block);
// вывод ответа админа
if (!empty ($adm_reply))
{
$reply = file_get_contents (“./templates/” . $guest_template . “/template_reply.html”);
$reply = str_replace (“%REPLY_TEXT%”, $adm_reply, $reply);
$block = str_replace (“%BLOCK_REPLY%”, $reply, $block);
}
else
{
$block = str_replace (“%BLOCK_REPLY%”, “”, $block);
}
$content = $content . $block; // добавляем текущее сообщение к остальным
}
// а теперь будем выставлять ссылки на страницы
// здесь всё сложно =P
if ($count > 10)
{
$pages = “”;
for ($i = 0; $i < $pgcount; $i++)
{
$pages = $pages . “<a href=\”?page=” . ($i + 1) . “\”>[" . ($count - ($i * 10)) . "—" . max (($count - ($i * 10) - 9), 1) . "]</a> ”;
}
$block_pages = file_get_contents (“./templates/” . $guest_template . “/template_pageselect.html”);
$block_pages = str_replace (“%PAGES_LINKS%”, $pages, $block_pages);
}
}
$page = file_get_contents (“./templates/” . $guest_template . “/template.html”); // загружаем шаблон
$page = str_replace (“%GUEST_TITLE%”, $guest_title, $page); // выставляем значения вместо тегов
$page = str_replace (“%GUEST_SUBTITLE%”, $guest_subtitle, $page);
$page = str_replace (“%GUEST_KEYWORDS%”, $guest_keywords, $page);
$page = str_replace (“%GUEST_DESCRIPTION%”, $guest_description, $page);
$page = str_replace (“%GUEST_MESSAGES%”, $content, $page);
if (isset ($block_pages)) $page = str_replace (“%GUEST_PAGES%”, $block_pages, $page);
else $page = str_replace (“%GUEST_PAGES%”, “”, $page);
echo $page; // выводим страницу на экран браузера
?>
Отлично, гостевая книга почти работает. Только сообщение своё записать никак нельзя. Вот над этим мы сейчас и поработаем.




Добавить комментарий