Скрипт форума на PHP своими руками. Часть 1
В этой серии статей я постараюсь рассказать, как написать форум самому. Возможности этого форума довольно ограничены - но я и не ставил целью написать полнофункциональный форум, вроде IPB, а лишь реализовать основные функции, чтобы форум имел право именоваться форумом.
Прошу простить моих читателей за стиль изложения - боюсь, журналист из меня неважный. Да и в программировании я еще новичок - так что многие моменты в реализации форума могут быть спорны с точки зрения более опытных коллег. Но мне хотелось попробовать свои силы в новом проекте и приобрести новый опыт.
Итак, приступим.
Все операции на форуме - показ темы, добавление нового сообщения (поста), просмотр профиля участника выполняются одним скриптом index.php. Чтобы знать, какое действие выполняет посетитель форума, методом GET передается параметр action. Вот и первая часть скрипта index.php
<?php
// Параметры соединения с сервером БД
require 'config/connect.php';
// Файл конфигурации
require 'config/config.php';
// Вспомогательные функции
require 'functions/functions.php';
// Соединяемся с сервером БД
mysql_connect ( DB_LOCATION, DB_USER, DB_PASSWORD );
mysql_query( 'SET NAMES cp1251' );
mysql_select_db ( DB_NAME );
session_start();
// Содержимое html-тега title
$pageTitle = FORUM_TITLE;
if ( !isset( $_GET['action'] ) ) $_GET['action'] = 'showMainPage';
$actions = array( 'showMainPage',
'showForum',
'showTheme',
'addForumForm',
'addForum',
'editForumForm',
'updateForum',
'forumUp',
'forumDown',
'deleteForum',
'addThemeForm',
'addTheme',
'editThemeForm',
'updateTheme',
'deleteTheme',
'lockTheme',
'unlockTheme',
'addPostForm',
'addPost',
'quickReply',
'editPostForm',
'updatePost',
'deletePost',
'loginForm',
'login',
'logout',
'addNewUserForm',
'addNewUser',
'activateUser',
'newPasswordForm',
'sendNewPassword',
'activatePassword',
'editUserForm',
'updateUser',
'editUserFormByAdmin',
'updateUserByAdmin',
'showUsersList',
'showUserInfo',
'sendMsgForm',
'sendMessage',
'deleteMsg',
'showMsgBox',
'showInBox',
'showOutBox',
'showMsg',
'sendMailForm',
'sendMail',
'searchForm',
'searchResult' );
if ( !in_array( $_GET['action'], $actions ) ) $_GET['action'] = 'showMainPage';
switch ( $_GET['action'] )
{
case 'showMainPage': // главная страница форума
$content = getMainPage( $pageTitle );
break;
case 'showForum': // список тем форума
$content = getForum( $pageTitle );
break;
case 'showTheme': // список сообщений темы
$content = getTheme( $pageTitle );
break;
case 'addForumForm': // форма для добавления нового форума
$content = getAddForumForm();
break;
case 'addForum': // добавить новый форум
$content = addForum();
break;
case 'editForumForm': // форма для редактирования форума
$content = getEditForumForm();
break;
case 'updateForum': // обновить запись в таблице БД TABLE_FORUMS
$content = updateForum();
break;
case 'forumUp':
$content = forumUp(); // переместить форум "вверх"
break;
case 'forumDown':
$content = forumDown(); // переместить форум "вниз"
break;
case 'deleteForum': // удалить запись в таблице БД TABLE_FORUMS
$content = deleteForum();
break;
case 'addThemeForm': // форма для добавления новой темы
$content = getAddThemeForm();
break;
case 'addTheme': // добавить новую тему
$content = addTheme();
break;
case 'editThemeForm': // форма для редактирования темы
$content = getEditThemeForm();
break;
case 'updateTheme': // обновить запись в таблице БД TABLE_THEMES
$content = updateTheme();
break;
case 'deleteTheme': // удалить тему
$content = deleteTheme();
break;
case 'lockTheme': // закрыть тему
$content = lockTheme();
break;
case 'unlockTheme': // открыть тему
$content = unlockTheme();
break;
case 'addPostForm': // форма для добавления нового сообщения (поста)
$content = getAddPostForm();
break;
case 'addPost': // добавить новую запись в таблицу БД TABLE_POSTS
$content = addPost();
break;
case 'quickReply': // добавить новую запись в таблицу БД TABLE_POSTS
$content = quickReply();
break;
case 'editPostForm': // форма для редактирования сообщения (поста)
$content = getEditPostForm();
break;
case 'updatePost': // обновить запись в таблице БД TABLE_POSTS
$content = updatePost();
break;
case 'deletePost': // удалить запись в таблице БД TABLE_POSTS
$content = deletePost();
break;
case 'loginForm': // форма для входа на форум (авторизация)
$content = getLoginForm();
break;
case 'login': // вход на форум (авторизация)
$content = login();
break;
case 'logout': // выход
$content = logout();
break;
case 'addNewUserForm': // форма для регистрации нового пользователя
$content = getAddNewUserForm();
break;
case 'addNewUser': // добавить нового пользователя
$content = addNewUser();
break;
case 'activateUser': // активация учетной записи нового пользователя
$content = activateUser();
break;
case 'newPasswordForm': // форма для получения нового пароля
$content = newPasswordForm();
break;
case 'sendNewPassword': // выслать пользователю новый пароль
$content = sendNewPassword();
break;
case 'activatePassword': // активация нового пароля
$content = activatePassword();
break;
case 'editUserForm': // форма для редактирования профиля
$content = getEditUserForm();
break;
case 'updateUser': // обновить данные о пользователе
$content = updateUser();
break;
case 'editUserFormByAdmin': // форма редактирования профиля (для администратора)
$content = getEditUserFormByAdmin();
break;
case 'updateUserByAdmin': // обновить данные о пользователе (для администратора)
$content = updateUserByAdmin();
break;
case 'showUsersList': // список пользователей форума
$content = getUsersList();
break;
case 'showUserInfo': // информация о пользователе (profile)
$content = showUserInfo();
break;
case 'sendMsgForm': // форма для отправки личного сообщения
$content = getSendMsgForm();
break;
case 'sendMessage': // отправить личное сообщение
$content = sendMessage();
break;
case 'deleteMsg': // удалить личное сообщение
$content = deleteMessage();
break;
case 'showMsg': // показать сообщение
$content = getMessage();
break;
case 'showInBox': // папка "Входящие"
$content = getInMsgBox();
break;
case 'showOutBox': // папка "Исходящие"
$content = getOutMsgBox();
break;
case 'sendMailForm': // форма для отправки письма пользователю
$content = getSendMailForm();
break;
case 'sendMail': // отправка письма
$content = sendMail();
break;
case 'searchForm': // форма для поиска по форуму
$content = searchForm();
break;
case 'searchResult': // результаты поиска по форуму
$content = searchResult();
break;
default:
$content = getMainPage();
}
$menu = getMainMenu();
$html = file_get_contents( './templates/default.html' );
$html = str_replace( '{title}', $pageTitle, $html );
$html = str_replace( '{description}', FORUM_DESCRIPTION, $html );
$html = str_replace( '{menu}', $menu, $html );
$html = str_replace( '{content}', $content, $html );
echo $html;
?>
Из комментариев должно быть ясно, что для каждого из возможных значений переменной $_GET['action'] вызывается соответствующая функция. Например, чтобы добавить новую тему, вызывается функция addPost(), а для просмотра информации об участнике форума - функция showUserInfo().
Теперь, когда мы определили для себя все возможные значения переменной $_GET['action'], нам осталось лишь реализовать все эти функции. Мы рассмотрим их все по порядку - так что к концу этой серии статей у вас будут все исходные коды форума, и вы сможете установить его, и протестировать у себя на локальном компьютере или на хостинге.
Но пережде чем приступить к рассмотрению функций, мы посмотрим на файл конфигурации config.php. Он содержит настройки форума.
<?php
// Названое форума
define ( 'FORUM_TITLE', 'Форум web-мастера' );
// Описание форума форума
define ( 'FORUM_DESCRIPTION', 'Форум для тех, кто делает сайты' );
// Названия таблиц в БД форума
define ( 'TABLE_FORUMS', 'forums' );
define ( 'TABLE_THEMES', 'themes' );
define ( 'TABLE_POSTS', 'posts' );
define ( 'TABLE_USERS', 'authors' );
define ( 'TABLE_MESSAGES', 'messages' );
// Максимальный размер файла вложения в байтах
define ( 'MAX_FILE_SIZE', 524288 );
// Максимальный размер файла аватара в байтах
define ( 'MAX_AVATAR_SIZE', 65536 );
// Минимальная длина пароля пользователя
define ( 'MIN_PASSWORD_LENGTH', 6 );
// Адрес электронной почты администратора; этот e-mail
// будет указан в поле FROM писем, которое один пользователь
// напишет другому; этот же e-mail будет указан в письмах
// с просьбой активировать учетную запись или пароль
// (в случае его утери)
define ( 'ADMIN_EMAIL', 'admin@mail.ru' );
// Под этим именем будет показано сообщение (пост)
// не зарегистрированного пользователя
define ( 'NOT_REGISTERED_USER', 'Посетитель' );
// Максимальная длина тела сообщения (поста)
define ( 'MAX_POST_LENGTH', 12288 );
// Максимальная длина тела личного сообщения, которое
// один пользователь форума может написать другому
define ( 'MAX_MESSAGE_LENGTH', 8192 );
// Максимальная длина тела письма, которое один пользователь форума
// может написать другому
define ( 'MAX_MAILBODY_LENGTH', 8192 );
// Задержка в секундах перед редиректом; когда пользователь выполняет
// какое-то действие (например, добавляет сообщение) ему выдается
// сообщение, что "Ваше сообщение было успешно добавлено" и делается
// редирект на нужную страницу
define ( 'REDIRECT_DELAY', 2 );
// Включает режим отладки - на экран выдаются сообщения об ошибках
define ( 'DEBUG_MODE', 1 );
// Время жизни cookies в днях; в cookies сохраняются логин и пароль пользователя,
// если была выбрана опция "Автоматически входить при каждом посещении"
define ( 'COOKIE_TIME', 30 );
// Максимальное количество личных сообщений в папках
// "Входящие" и "Исходящие"
define ( 'MAX_COUNT_MESSAGES', 50 );
// Время в минутах, в течение которого считается, что пользователь "on-line"
define ( 'TIME_ON_LINE', 5 );
// Количество пользователей на одну страницу
// в списке зарегистрированных пользователей
define ( 'USERS_PER_PAGE', 20 );
// Количество сообщений (постов) на одной странице
define ( 'POSTS_PER_PAGE', 5 );
// Количество тем на одной странице
define ( 'THEMES_PER_PAGE', 20 );
?>
Итак, первая функция - getMainPage() возвращает главную страницу форума. Главная страница выглядит как список всех форумов. Для каждого форума выводится список трех тем форума, в которых были новые сообщения.
<?php
// Функция возвращает html главной страница форума (список форумов)
function getMainPage( &$pageTitle )
{
$pageTitle = $pageTitle.' / Список форумов';
$query = "SELECT id_forum, name, description FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при получении списка форумов';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, '' );
}
$html = '<h1>Список форумов</h1>'."\n";
if ( mysql_num_rows( $res ) > 0 ) {
while ( $forum = mysql_fetch_array( $res ) ) {
$html = $html.'<table width="100%" cellpadding="0" cellspacing="0">'."\n";
$html = $html.'<tr>'."\n";
// Выводим название форума
$html = $html.'<td>';
$html = $html.'<div><a class="header" href="'.
$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
$forum['id_forum'].'">'.
$forum['name'].'</a></div>'."\n";
$html = $html.'<div style="font-size:smaller">'.$forum['description'].'</a></div>';
// Выводим краткое описание форума
$html = $html.'</td>'."\n";
// Ссылка "Править форум"
if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' ) {
$html = $html.'<td align="right"><a href="'.$_SERVER['PHP_SELF'].
'?action=editForumForm&idForum='.$forum['id_forum'].'"><img
src="./images/icon_edit.gif"
alt="Править" title="Править" /></a> '."\n";
$html = $html.'<a href="'.$_SERVER['PHP_SELF'].
'?action=deleteForum&idForum='.$forum['id_forum'].'"><img
src="./images/icon_delete.gif" alt="Удалить" title="Удалить" /></a></td>'."\n";
}
$html = $html.'</tr>'."\n";
$html = $html.'</table>'."\n";
// Выводим три темы форума, сортирируя их по последнему сообщению
$q = "SELECT a.id_theme, a.name, a.time, a.locked,
IFNULL(b.id_author, 0),
IFNULL(b.name, '".NOT_REGISTERED_USER."'),
(COUNT(*)-1), IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post
FROM ".TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
ON a.id_author=b.id_author
LEFT JOIN ".TABLE_POSTS." c
ON a.id_theme=c.id_theme
WHERE id_forum=".$forum['id_forum']."
GROUP BY a.id_theme, a.name, a.time,
IFNULL(b.id_author, 0),
IFNULL(b.name, '".NOT_REGISTERED_USER."')
ORDER BY last_post DESC
LIMIT 3";
$r = mysql_query( $q );
$html = $html.'<table class="showTable">'."\n";
$html = $html.'<tr>'."\n";
$html = $html.'<th width="23"><img src="./images/null.gif" width="23" height="1" alt="" /></th>'."\n";
$html = $html.'<th width="50%">Тема</th>'."\n";
$html = $html.'<th width="12%">Автор</th>'."\n";
$html = $html.'<th width="12%">Добавлена</th>'."\n";
$html = $html.'<th width="12%">Ответов</th>'."\n";
$html = $html.'<th width="12%">Последнее сообщение</th>'."\n";
$html = $html.'</tr>'."\n";
if ( mysql_num_rows( $r ) == 0 ) {
$html = $html.'<tr>'."\n";
$html = $html.'<td colspan="6">'."\n";
$html = $html.'В этом форуме пока нет сообщений';
$html = $html.'</td>'."\n";
$html = $html.'</tr>'."\n";
$html = $html.'</table>'."\n";
continue;
}
while ( $theme = mysql_fetch_row( $r ) ) {
$html = $html.'<tr>'."\n";
if ( isset( $_SESSION['user'] ) ) { // это для зарегистрированного пользователя
// Если есть новые сообщения (посты) - только для зарегистрированных пользователей
if ( isset( $_SESSION['newThemes'] ) and in_array( $theme[0], $_SESSION['newThemes'] ) ) {
if ( $theme[3] == 0 ) // тема открыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder_new.gif" width="19"
height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
else // тема закрыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock_new.gif" width="19"
height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
} else {
if ( $theme[3] == 0 ) // тема открыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
else // тема закрыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
}
} else { // это для не зарегистрированного пользователя
if ( $theme[3] == 0 ) // тема открыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
height="18" alt="" /></td>';
else // тема закрыта
$html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
height="18" alt="" /></td>';
}
// Название темы
$html = $html.'<td>';
$html = $html.'<a class="topictitle" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
$forum['id_forum'].'&id_theme='.$theme[0].'">'.$theme[1].'</a>';
$html = $html.'</td>';
$html = $html.'<td align="center" nowrap="nowrap">'."\n";
// Автор темы
if ( $theme[4] ) {
$html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
$theme[4].'">'.$theme[5].'</a>';
} else {
$html = $html.$theme[5];
}
$html = $html.'</td>';
// Дата добавления темы
$html = $html.'<td align="center" nowrap="nowrap">';
$html = $html.$theme[2];
$html = $html.'</td>'."\n";
// Количество ответов
$html = $html.'<td align="center" nowrap="nowrap">';
$html = $html.$theme[6];
$html = $html.'</td>'."\n";
// Дата последнего обновления
$html = $html.'<td align="center" nowrap="nowrap">';
$html = $html.$theme[7];
$html = $html.'</td>'."\n";
$html = $html.'</tr>'."\n";
}
$html = $html.'</table>'."\n";
}
} else {
$html = '<p>Не найдено ни одного форума</p>'."\n";
}
$html = $html.getUsersOnLine();
return $html;
}
?>
Интерес здесь представляет лишь запрос на выборку трех тем для каждого форума. Темы сортируются по последнему сообщению (посту). Как видите, здесь идет связывание трех таблиц БД: TABLE_THEMES, TABLE_USERS и TABLE_POSTS.
<?php
$q = "SELECT a.id_theme, a.name, a.time, a.locked,
IFNULL(b.id_author, 0),
IFNULL(b.name, '".NOT_REGISTERED_USER."'),
(COUNT(*)-1), IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post
FROM ".TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
ON a.id_author=b.id_author
LEFT JOIN ".TABLE_POSTS." c
ON a.id_theme=c.id_theme
WHERE id_forum=".$forum['id_forum']."
GROUP BY a.id_theme, a.name, a.time,
IFNULL(b.id_author, 0),
IFNULL(b.name, '".NOT_REGISTERED_USER."')
ORDER BY last_post DESC
LIMIT 3";
?>
Прежде чем продолжить наше повествавание, необходимо сделать небольшое лирическое отступление и рассказать о структуре базы данных форума. База данных содержит шесть таблиц.
Таблица TABLE_USERS содержит информацию о пользователях форума. Вот запрос на создание таблицы
CREATE TABLE `authors` (
`id_author` int(6) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '',
`passw` varchar(255) NOT NULL DEFAULT '',
`email` varchar(64) NOT NULL DEFAULT '',
`timezone` tinyint(2) NOT NULL DEFAULT '0',
`url` varchar(64) NOT NULL DEFAULT '',
`icq` varchar(12) NOT NULL DEFAULT '',
`about` tinytext NOT NULL,
`signature` tinytext NOT NULL,
`photo` varchar(32) NOT NULL DEFAULT '',
`puttime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_visit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`themes` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
`posts` int(10) UNSIGNED NOT NULL DEFAULT '0',
`status` enum('user','moderator','admin') NOT NULL DEFAULT 'user',
`activation` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id_author`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Поля таблицы TABLE_USERS:
- id_author - первичный ключ таблицы, снабженный механизмом auto_increment
- name - имя пользователя
- passw - пароль пользователя, зашифрованный с помощью алгоритма md5
- email - e-mail пользователя
- timezone - временная зона
- url - URL домашней странички
- icq - ICQ
- about - интересы
- signature - подпись
- photo - фото (аватар)
- puttime - время регистрации
- last_visit - время последнего посещения форума
- themes - количество тем, начатых пользователем
- posts - количество сообщений (постов)
- status - статус пользователя
- activation - поле для хранения кода активации
Таблица TABLE_FORUMS содержит информацию о всех форумах. Запрос на создание таблицы
CREATE TABLE `forums` (
`id_forum` int(6) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`description` mediumtext NOT NULL,
`pos` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_forum`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Поля таблицы TABLE_FORUMS:
- id_forum - первичный ключ таблицы
- name - название форума
- description - краткое описание форума
- pos - позиция в списке
Таблица TABLE_THEMES содержит информацию о темах форума. Запрос на создание таблицы
CREATE TABLE `themes` (
`id_theme` int(11) NOT NULL AUTO_INCREMENT,
`name` tinytext NOT NULL,
`author` tinytext NOT NULL,
`id_author` int(6) NOT NULL DEFAULT '0',
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`id_forum` int(2) NOT NULL DEFAULT '0',
`locked` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id_theme`),
FULLTEXT KEY `search` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Поля таблицы TABLE_THEMES:
- id_theme - первичный ключ таблицы
- name - название темы
- author - имя автора темы
- id_author - ID автора темы
- time - время создания темы
- id_forum - ID форума, которому принадлежит тема
- locked - если равно 1, значит тема закрыта (заблокирована)
Таблица TABLE_POSTS содержит информацию о сообщениях (постах) форума. Запрос на создание таблицы
CREATE TABLE `posts` (
`id_post` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`putfile` tinytext NOT NULL,
`author` tinytext NOT NULL,
`id_author` int(6) UNSIGNED NOT NULL DEFAULT '0',
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edittime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`id_editor` int(6) UNSIGNED NOT NULL DEFAULT '0',
`id_theme` int(11) NOT NULL DEFAULT '0',
`locked` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id_post`),
FULLTEXT KEY `search` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Поля таблицы TABLE_THEMES:
- id_post - первичный ключ таблицы
- name - сообщение (пост)
- putfile - имя файла вложения
- author - имя автора сообщения
- id_author - ID автора сообщения
- time - время создания сообщения
- edittime - время редактирования сообщения
- id_editor - ID пользователя, который редактировал сообщение
- id_theme - ID темы, которому принадлежит сообщение
- locked - если равно 1, значит сообщение заблокировано
Таблица TABLE_MESSAGES содержит сообщения, которымы могут обмениваться зарегистрированные аользователи форума. Запрос на создание таблицы
CREATE TABLE `messages` (
`id_msg` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`to_user` int(10) UNSIGNED NOT NULL DEFAULT '0',
`from_user` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sendtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`subject` varchar(255) NOT NULL DEFAULT '',
`message` text NOT NULL,
`id_rmv` int(10) UNSIGNED NOT NULL DEFAULT '0',
`viewed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_msg`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Поля таблицы TABLE_MESSAGES:
- id_msg - первичный ключ таблицы
- to_user - ID пользователя, котоый получит сообщение
- from_user - ID автора сообщения
- sendtime - время создания сообщения
- subject - тема сообщения
- message - сообщение
- id_rmv - ID пользователя, который удалил сообщение
- viewed - если равно 1, значит сообщение было просмотрено получателем
Ну вот, с базой данных форума мы разобрались, теперь давайте посмотрим вот на этот кусок кода и разберемся, что из себя представляет "файл шаблона форума":
<?php
........................................................
// Получаем в переменную содержимое файла шаблона форума
$html = file_get_contents( './templates/default.html' );
$html = str_replace( '{title}', $pageTitle, $html );
$html = str_replace( '{description}', FORUM_DESCRIPTION, $html );
$html = str_replace( '{menu}', $menu, $html );
$html = str_replace( '{content}', $content, $html );
........................................................
?>
Файл шаблона форума
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>{title}</title>
<meta http2-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="description" content="{description}">
<link rel="stylesheet" href="./style/style.css" type="text/css">
</head>
<body><a name="top"></a>
<table class="bodyTable">
<tr height="10%">
<td>
<!-- Здесь место для логотипа и рекламы -->
</td>
</tr>
<tr height="5%">
<td>
{menu}
</td>
</tr>
<tr height="80%" valign="top">
<td>
{content}
</td>
</tr>
<tr height="5%">
<td>
<!-- Здесь место для разных счетчиков посещаемости или рекламы -->
</td>
</tr>
</table>
</body>
</html>
Пожалуй, на сегодня это все. Продолжение следует...
|