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

Статьи

Скрипт форума на PHP своими руками. Часть 2

Ну что же, продолжим. Следующая функция, котоую мы рассмотрим - getForum(). Функция возвращает список тем форума. Уникальный идентификатор форума передается методом GET.

<?php
// Функция возвращает список тем форума; ID форума передается методом GET
function getForum( &$pageTitle )
{
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Получаем информацию о форуме
  
$query "SELECT name FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка тем форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
$forum mysql_result$res0);
  
// Заголовок страницы (содержимое тега title)
  
$pageTitle $pageTitle.' / '.$forum;
  
// Выводим название форума
  
$html '<h1>'.$forum.'</h1>'."\n";

  
// Панель навигации
  
$html $html.'<div class="navDiv">'."\n";
  
$html $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'">Список форумов</a>&nbsp;&gt;'."\n";
  
$html $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
          
$_GET['idForum'].'">'.$forum.'</a>'."\n";
  
$html $html.'</div>'."\n";
  
  
// Ссылка "Начать новую тему" - только для зарегистрированных пользователей
  
if ( isset( $_SESSION['user'] ) ) {
    
$addTheme '<a href="'.$_SERVER['PHP_SELF'].'?action=addThemeForm&idForum='.
                
$_GET['idForum'].'"><img src="./images/post.gif"  
                alt="Начать новую тему" /></a>'
."\n";
  }
  
// Выбираем из БД количество тем форума - это нужно для 
  // построения постраничной навигации
  
$query "SELECT COUNT(*) FROM ".TABLE_THEMES." WHERE id_forum=".$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка тем форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
$total mysql_result$res0);
  
  if ( 
$total == ) {
  if ( isset( 
$_SESSION['user'] ) ) 
    return 
$html.$addTheme;
  else 
    return 
$html.'<p>В этом форуме пока нет сообщений</p>'."\n";
  }
  
  
// Число страниц списка тем форума (постраничная навигация)
  
$cntPages ceil$total THEMES_PER_PAGE );
  
  
// Проверяем передан ли номер текущей страницы (постраничная навигация)
  
if ( isset($_GET['page']) ) {
    
$page = (int)$_GET['page'];
    if ( 
$page $page 1;
  } else {
    
$page 1;
  }

  if ( 
$page $cntPages $page $cntPages;
  
// Начальная позиция (постраничная навигация)
  
$start = ( $page ) * THEMES_PER_PAGE;

  
// Строим постраничную навигацию, если это необходимо
  
if ( $cntPages ) {
    
// Функция возвращает html меню для постраничной навигации
    
$pages pageIterator$page$cntPages$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
                           
$_GET['idForum'] );           
  }
             
  
// Постраничную навигацию и ссылку "Начать новую тему" объединяем в один блок,
  // который выводится вверху и внизу страницы
  
if ( isset( $pages ) or isset( $addTheme ) ) {
    
$pagesAddTheme '<table width="100%" cellpadding="0" cellspacing="0">'."\n";
    
$pagesAddTheme $pagesAddTheme.'<tr valign="middle">'."\n";
    if ( isset( 
$pages ) ) $pagesAddTheme $pagesAddTheme.'<td>'.$pages.'</td>'."\n";
    if ( isset( 
$addTheme ) ) $pagesAddTheme $pagesAddTheme.'<td align="right">'.$addTheme.'</td>'."\n";
    
$pagesAddTheme $pagesAddTheme.'</tr>'."\n";
    
$pagesAddTheme $pagesAddTheme.'</table>'."\n";
  }
  
  
// Постраничная навигация и ссылка "Начать новую тему"
  
if ( isset( $pagesAddTheme ) ) $html $html.$pagesAddTheme;
          
  
// Получаем список тем форума, сортирируя их по последнему сообщению
  
$query "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), '') 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="
.$_GET['idForum']."
            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 "
.$start.", ".THEMES_PER_PAGE;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка тем форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  if ( 
mysql_num_rows$res ) > ) {
    
$html $html.'<table class="showTable">'."\n";
    
$html $html.'<tr>'."\n";
    
$html $html.'<th>&nbsp;</th>';
    
$html $html.'<th width="50%">Темы</th>';
    
$html $html.'<th>Автор</th>';
    
$html $html.'<th>Добавлена</th>';
    
$html $html.'<th>Ответов</th>';
    
$html $html.'<th>Последнее&nbsp;сообщение</th>'."\n";
    if ( isset( 
$_SESSION['user'] ) and $_SESSION['user']['status'] != 'user' ) {
      
$html $html.'<th>Правка</th>'."\n";
      
$html $html.'<th>Блк.</th>'."\n";
      
$html $html.'<th>Удл.</th>'."\n";
    }
      
    
$html $html.'</tr>'."\n";
    while ( 
$theme mysql_fetch_row$res ) ) {
      
$html $html.'<tr>'."\n";
      if ( isset( 
$_SESSION['user'] ) ) { // это для зарегистрированного пользователя
        // Если есть новые сообщения (посты) - только для зарегистрированных пользователей
        
if ( isset( $_SESSION['newThemes'] ) and in_array$theme[0], $_SESSION['newThemes'] ) ) {
          if ( 
$theme[3] == // тема открыта
            
$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] == // тема открыта
            
$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] == // тема открыта
          
$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='.
              
$_GET['idForum'].'&id_theme='.$theme[0].'">'.$theme[1].'</a>';
      
$html $html.'</td>';
      
$html $html.'<td align="center">'."\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";  
      
// Ссылки "Редактировать", "Закрыть"/"Открыть" и "Удалить" - 
      // только для администратора и модератора
      
if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] != 'user' ) {
      
$html $html.'<td align="center" nowrap="nowrap">';
      
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=editThemeForm&idForum='.
              
$_GET['idForum'].'&id_theme='.$theme[0].'"><img src="./images/icon_edit.gif"
              alt="Править" title="Править" /></a>'
;
      
$html $html.'</td>'."\n";
      
$html $html.'<td align="center" nowrap="nowrap">';
      if ( 
$theme[3] == ) { // заблокировать тему
        
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=lockTheme&idForum='.
                
$_GET['idForum'].'&id_theme='.$theme[0].'"><img src="./images/topic_lock.gif"
                alt="Закрыть" title="Закрыть" /></a>'
;
      } else { 
// разблокировать тему
        
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=unlockTheme&idForum='.
                
$_GET['idForum'].'&id_theme='.$theme[0].'"><img src="./images/topic_unlock.gif"
                alt="Открыть" title="Открыть" /></a>'
;
      }
      
$html $html.'</td>'."\n";
      
$html $html.'<td align="center" nowrap="nowrap">';
      
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=deleteTheme&idForum='.
              
$_GET['idForum'].'&id_theme='.$theme[0].'"><img src="./images/icon_delete.gif"
              alt="Удалить" title="Удалить" /></a>'
;
      
$html $html.'</td>'."\n";
      
      }
      
$html $html.'</tr>'."\n";
    }
    
$html $html.'</table>'."\n";
    
    
// Постраничная навигация и ссылка "Начать новую тему"
    
if ( isset( $pagesAddTheme ) ) $html $html.$pagesAddTheme;
  
  }
  return 
$html;
}
?>

Собственно говоря, исходные коды подробно закомментированы, так что их чтение не должно вызвать затруднений. Как видите, ссылки "Редактировать тему", "Закрыть"/"Открыть" и "Удалить тему" доступны только для администратора и модератора. Интерес представляет лишь вызов функции pageIterator(), которая предназначена для построения постраничной навигации списка тем форума:

<?php
// Функция возвращает html меню для постраничной навигации
function pageIterator$page$cntPages$url )
{

  
$html '<div class="pagesDiv">&nbsp;Страницы: ';
  
// Проверяем нужна ли стрелка "В начало"
  
if ( $page )
    
$startpage '<a class="pages" href="'.$url.'&page=1"><<</a> ... ';
  else
    
$startpage '';
  
// Проверяем нужна ли стрелка "В конец"
  
if ( $page < ($cntPages 2) )
    
$endpage ' ... <a class="pages" href="'.$url.'&page='.$cntPages.'">>></a>';
  else
    
$endpage '';

  
// Находим две ближайшие станицы с обоих краев, если они есть
  
if ( $page )
    
$page2left ' <a class="pages" href="'.$url.'&page='.($page 2).'">'.($page 2).'</a> | ';
  else
    
$page2left '';
  if ( 
$page )
    
$page1left ' <a class="pages" href="'.$url.'&page='.($page 1).'">'.($page 1).'</a> | ';
  else
    
$page1left '';
  if ( 
$page <= $cntPages )
    
$page2right ' | <a class="pages" href="'.$url.'&page='.($page 2).'">'.($page 2).'</a>';
  else
    
$page2right '';
  if ( 
$page <= $cntPages )
    
$page1right ' | <a class="pages" href="'.$url.'&page='.($page 1).'">'.($page 1).'</a>';
  else
    
$page1right '';

  
// Выводим меню
  
$html $html.$startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.
          
$page1right.$page2right.$endpage."\n";

  
$html $html.'</div>'."\n";

  return 
$html;
}
?>

Разобрались? Тогда продолжим. Функция getTheme() возвращает список сообщений (постов) темы. Уникальный идентификатор темы передается методом GET. Функция getTheme() очень похожа на рассмотренную выше функцию getForum(). Различие лишь в том, что функция getForum() возвращает список тем форума, а функция getTheme() - список сообщений (постов) темы. Как видите, здесь также используется вызов функции pageIterator() для построения постраничной навигации.

<?php
// Функция возвращает список сообщений(постов) темы; ID темы передается методом GET
function getTheme( &$pageTitle )
{
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  } 
  
// Если не передан ID темы - функция вызвана по ошибке
  
if ( !isset( $_GET['id_theme'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
$id_theme = (int)$_GET['id_theme'];
  if ( 
$id_theme ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }  
  
  
// Получаем из БД информацию о теме
  
$query "SELECT name, locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка сообщений темы';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue
                             
'action=showForum&idForum='.$_GET['idForum'] );
  }
  
// Если запрошенной темы не существует - возвращаемся на форум
  
if ( mysql_num_rows$res ) == 
    return 
showInfoMessage'Запрошенная тема не найдена''action=showForum&idForum='.$_GET['idForum'] );
  
  list( 
$theme$locked ) = mysql_fetch_row$res );
  
// Заголовок страницы (содержимое тега title)
  
$pageTitle $pageTitle.' / '.$theme;
  
// Название темы
  
$html '<h1>'.$theme.'</h1>'."\n";

  
// Получаем информацию о форуме - это нужно для построения панели навигации
  
$query "SELECT name FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка сообщений темы';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.
                             
$_GET['idForum'] );
  }
  
// Панель навигации
  
$html $html.'<div class="navDiv">'."\n";
  
$html $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'">Список форумов</a>&nbsp;&gt;'."\n";
  
$html $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
          
$_GET['idForum'].'">'.mysql_result$res0).'</a>&nbsp;&gt;'."\n";
  
$html $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
          
$_GET['idForum'].'&id_theme='.$id_theme.'">'.$theme.'</a>'."\n";
  
$html $html.'</div>'."\n";
  
  
// Выбираем из БД количество сообщений - это нужно для 
  // построения постраничной навигации
  
$query "SELECT COUNT(*) FROM ".TABLE_POSTS." WHERE id_theme=".$id_theme;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка сообщений темы';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue
                             
'action=showForum&idForum='.$_GET['idForum'] );
  }
  
$total mysql_result$res0);
  
// Не может быть темы, в которой нет сообщений (постов) - надо ее удалить
  
if ( $total == ) {
    
$q "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
    
$r mysql_query$q );
    if ( !
$r ) {
      
$msg 'Ошибка при получении списка сообщений темы';
      
$err 'Ошибка при выполнении запроса: <br/>'.
             
$q.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
             
'(Файл '__FILE__ .', строка '__LINE__ .')';
      return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
    }
    return 
showInfoMessage'Запрошенная тема не найдена''action=showForum&idForum='.$_GET['idForum'] );    
  }

  
// Число страниц списка сообщений (постов) темы (постраничная навигация)
  
$cntPages ceil$total POSTS_PER_PAGE );
  
  
// Проверяем передан ли номер текущей страницы (постраничная навигация)
  
if ( isset($_GET['page']) ) {
    
$page = (int)$_GET['page'];
    if ( 
$page $page 1;
  } else {
    
$page $cntPages;
  }

  if ( 
$page $cntPages $page $cntPages;
  
// Начальная позиция (постраничная навигация)
  
$start = ( $page ) * POSTS_PER_PAGE;

  
// Строим постраничную навигацию, если это необходимо
  
if ( $cntPages ) {
    
// Функция возвращает html меню для постраничной навигации
    
$pages pageIterator$page$cntPages$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
                           
$_GET['idForum'].'&id_theme='.$id_theme );           
  } else {
    
$pages '&nbsp;';
  }
  
  
// Получаем из БД список сообщений (постов) темы
  
$query "SELECT a.id_post, a.name, a.id_author, a.time, a.putfile, a.locked, a.id_theme, 
                   DATE_FORMAT(a.edittime, '%d.%m.%Y') AS edittime, a.id_editor, 
                   IFNULL(b.name, '"
.NOT_REGISTERED_USER."') AS author, b.posts, b.url, 
                   DATE_FORMAT(b.puttime, '%d.%m.%Y') AS regtime, b.status AS status,
                   IFNULL(c.name, '') AS editor, IFNULL(c.status, '') AS editor_status    
            FROM "
.TABLE_POSTS." a LEFT JOIN ".TABLE_USERS." b
            ON a.id_author=b.id_author    
            LEFT JOIN "
.TABLE_USERS." c
            ON a.id_editor=c.id_author            
            WHERE id_theme="
.$id_theme." ORDER BY time ASC 
            LIMIT "
.$start.", ".POSTS_PER_PAGE;
    
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка сообщений темы';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue
                             
'action=showForum&idForum='.$_GET['idForum'] );
  }
  if ( 
mysql_num_rows$res ) == ) {
    
// Не может быть темы, в которой нет сообщений (постов) - надо ее удалить
    
$q "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
    
$r mysql_query$q );
    if ( !
$r ) {
      
$msg 'Ошибка при получении списка сообщений темы';
      
$err 'Ошибка при выполнении запроса: <br/>'.
             
$q.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
             
'(Файл '__FILE__ .', строка '__LINE__ .')';
      return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
    }
    return 
showInfoMessage'Запрошенная тема не найдена''action=showForum&idForum='.$_GET['idForum'] );    
  }
  
// Ссылка "Ответить" (если тема закрыта - выводим сообщение "Тема закрыта")
  
if ( $locked == )
    
$addPost '<a href="'.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.$_GET['idForum'].
               
'&id_theme='.$id_theme.'"><img src="./images/reply.gif"
               alt="Ответить" title="Ответить" /></a>'
."\n";
  else
    
$addPost '<img src="./images/reply_locked.gif"
               alt="Тема закрыта" title="Тема закрыта" />'
."\n";  
             
  
// Постраничную навигацию и ссылку "Ответить" объединяем в один блок,
  // который выводится вверху и внизу страницы
  
$pagesAddPost '<table width="100%" cellpadding="0" cellspacing="0">'."\n";
  
$pagesAddPost $pagesAddPost.'<tr valign="middle">'."\n";
  
$pagesAddPost $pagesAddPost.'<td>'.$pages.'</td>'."\n";
  
$pagesAddPost $pagesAddPost.'<td align="right">'.$addPost.'</td>'."\n";
  
$pagesAddPost $pagesAddPost.'</tr>'."\n";
  
$pagesAddPost $pagesAddPost.'</table>'."\n"
  
  
$html $html.$pagesAddPost;
  
// Сообщения (посты) темы; каждое сообщение - отдельная таблица      
  
while ( $post mysql_fetch_array$res ) ) {
    
$html $html.'<table class="postTable">'."\n";
    
$html $html.'<tr class="postTop">'."\n";
    
$html $html.'<td width="120"><span class="postAuthor" onClick="javascript:putName(\''.
             
$post['author'].'\')" onMouseOver="this.className=\'postAuthorOver\'"
             onMouseOut="this.className=\'postAuthor\'">'
.$post['author'].
             
'</span><br/><img src="./images/null.gif" alt="" width="120" height="1" /></td>'."\n";
    
$html $html.'<td width="45%"><span class="details">&nbsp;Добавлено '.$post['time'].'</span></td>'."\n";
    
$html $html.'<td width="45%" align="right">';
    
// Если тема не заблокирована - выводим ссылку "Ответить с цитатой"
    
if ( $locked == ) {
      
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.$_GET['idForum'].
              
'&id_theme='.$id_theme.'"><img src="./images/icon_quote.gif"
               alt="Ответить с цитатой" title="Ответить с цитатой" border="0" /></a>&nbsp;&nbsp;'
;
    }
    
// Определяем, нужно ли выводить ссылку "Редактировать"
    
if ( hasRightEditPost$post ) ) {
      
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.$_GET['idForum'].
              
'&id_theme='.$id_theme.'&id_post='.$post['id_post'].'"><img src="./images/icon_edit.gif"
              alt="Править" title="Править" border="0" /></a>&nbsp;&nbsp;'
;
    }
    
// Определяем, нужно ли выводить ссылку "Удалить"
    
if ( hasRightDeletePost$post ) ) {
      
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=deletePost&idForum='.$_GET['idForum'].
              
'&id_theme='.$id_theme.'&id_post='.$post['id_post'].'"><img src="./images/icon_delete.gif"
              alt="Удалить" title="Удалить" border="0" /></a>'
;
    }
    
$html $html.'</td>'."\n";
    
$html $html.'</tr>'."\n";
    
$html $html.'<tr class="postMiddle">'."\n";
    
$html $html.'<td>'."\n";
    
// Если автор сообщения (поста) - зарегистрированный пользователь
    
if ( $post['id_author'] ) {
      
// Аватар
      
if ( is_file'./photo/'.$post['id_author'] ) ) {
        
$html $html.'<img src="./photo/'.$post['id_author'].'" alt="'.$post['author'].'" 
                title="'
.$post['author'].'" /><br/>'."\n";
      } else {
        
$html $html.'<img src="./images/null.gif" alt="" width="100" height="100" 
                style="border:1px solid #CCCCCC" /><br/>'
."\n";
      }
      
// Статус пользователя
      
$status = array( 'user' => 'Пользователь',
                       
'moderator' => 'Модератор',
                       
'admin' => 'Администратор' );
      if ( 
$post['status'] == 'admin' 
        
$html $html.'<span class="adminStatus">'.$status[$post['status']].'</span><br/>'."\n";
      if ( 
$post['status'] == 'moderator' 
        
$html $html.'<span class="moderStatus">'.$status[$post['status']].'</span><br/>'."\n";
      
/*
      if ( $post['status'] == 'user' ) 
        $html = $html.'<span class="userStatus">'.$status[$post['status']].'</span><br/>'."\n";
      */
      // Рейтинг пользователя (по количеству сообщений)
      
$stars '';
      
$rating $post['posts'];
      while( 
$rating ) {
        if ( 
$rating 50 )
          
$img 'stars0.gif';
        else if ( 
$rating >= 50 and $rating 100 )
          
$img 'stars1.gif';
        else if ( 
$rating >= 100 and $rating 150 )
          
$img 'stars2.gif';
        else if ( 
$rating >= 150 and $rating 200 )
          
$img 'stars3.gif';
        else if ( 
$rating >= 200 and $rating 250 )
          
$img 'stars4.gif';
        else if ( 
$rating >= 250 and $rating 300 )
          
$img 'stars5.gif';
        else if ( 
$rating >= 300 and $rating 350 )
          
$img 'stars6.gif';
        else if ( 
$rating >= 350 and $rating 400 )
          
$img 'stars7.gif';
        else if ( 
$rating >= 400 and $rating 450 )
          
$img 'stars8.gif';
        else if ( 
$rating >= 450 and $rating 500 )
          
$img 'stars9.gif';
        else
          
$img 'stars10.gif';
        
$rating $rating 500;
        
$stars $stars.'<img src="./images/'.$img.'" alt="" /><br/>';
      }
      
$html $html.$stars.'<br/>'."\n";
      
// Количество сообщений
      
$html $html.'<span class="details">Сообщений:&nbsp;'.$post['posts'].'</span><br/>'."\n";
      
// Дата регистрации
       
$html $html.'<span class="details">Зарегистрирован: '.$post['regtime'].'</span><br/>'."\n";

      
// Если автор сообщения сейчас "на сайте" 
      
if ( isset( $_SESSION['usersOnLine'] )  ) {
        if ( 
in_array$post['id_author'], $_SESSION['usersOnLine'] ) ) 
          
$html $html.'<span class="details">Просматривает форум</span><br/>'."\n";
        else
          
$html $html.'<span class="details">Покинул форум</span><br/>'."\n";
      }
       
    } else { 
// Если автор сообщения - незарегистрированный пользователь
      
$html $html.'<img src="./images/null.gif" alt="" width="100" height="100" 
              style="border:1px solid #CCCCCC" /><br/>'
."\n";    
    }
    
    
$html $html.'<br/><span class="quoteAuthor" onClick=quoteSelection(\''.$post['author'].'\');
            onMouseOver="catchSelection(); this.className=\'quoteAuthorOver\'" 
            onMouseOut="this.className=\'quoteAuthor\'">Цитировать</span>'
;
    
    
$html $html.'</td>'."\n";
    
$html $html.'<td colspan="2">'."\n"
    
$html $html.print_page$post['name'] )."\n";
    
// Если есть прикреплённый файл - формируем ссылку на него
    
if( !empty( $post['putfile'] ) and is_file'./files/'.$post['putfile'] ) ) {
      
$html $html.'<div align="right"><img src="./images/file.gif" alt="Открыть файл" 
              title="Открыть файл" align="absmiddle" />&nbsp;<a target="_blank" 
              href="./files/'
.$post['putfile'].'">'.
              ( 
getFileSize'./files/'.$post['putfile'] ) ).' Кб</a></div>'."\n";
    }      
    
$html $html.'</td>'."\n";
      
    
$html $html.'</tr>'."\n";
    
$html $html.'<tr class="postBottom">'."\n";
    
$html $html.'<td><a class="navigation" href="#top">Наверх</a></td>'."\n";
    
// Если автор сообщения (поста) - зарегистрированный пользователь
    
if ( $post['id_author'] ) {
      
$html $html.'<td>'."\n";
      
$html $html.'&nbsp;<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
              
$post['id_author'].'"><img src="./images/icon_profile.gif"
              alt="Посмотреть профиль" title="Посмотреть профиль" /></a>'
;
      
$html $html.'&nbsp;&nbsp;'."\n";
      if ( isset( 
$_SESSION['user'] ) ) {
        
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=sendMailForm&idUser='.
                
$post['id_author'].'"><img src="./images/icon_email.gif"
                alt="Написать письмо" title="Написать письмо" /></a>'
;
        
$html $html.'&nbsp;&nbsp;'."\n";
        
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=sendMsgForm&idUser='.
                
$post['id_author'].'"><img src="./images/icon_pm.gif" 
                alt="Личное сообщение" title="Личное сообщение" /></a>'
;
        
$html $html.'&nbsp;&nbsp;'."\n";
      }
      if ( !empty( 
$post['url'] ) ) {
      
$html $html.'<a href="'.$post['url'].'"><img src="./images/icon_www.gif"
              alt="Сайт автора" title="Сайт автора" target="_blank" /></a>'
;
      }
      
$html $html.'</td>'."\n";      
    } else {
      
$html $html.'<td><span class="details"><img src="./images/null.gif" alt="" width="1" 
              height="20" align="absmiddle" />Незарегистрированный пользователь</span></td>'
."\n";
    }
    
// Если сообщение редактировалось...
    
if ( !empty( $post['editor'] ) ) {
      
$html $html.'<td align="right">';
      if ( 
$post['id_author'] == $post['id_editor'] ) {
        
$html $html.'<span class="editedByUser">Отредактировано автором '.$post['edittime'].'</span>'."\n";
      } else { 
        if ( 
$post['editor_status'] == 'admin' )
          
$html $html.'<span class="editedByAdmin">Отредактировано администратором '.
                  
$post['editor'].' '.$post['edittime'].'</span>'."\n";
        if ( 
$post['editor_status'] == 'moderator' )
          
$html $html.'<span class="editedByModer">Отредактировано модератором '.
                  
$post['editor'].' '.$post['edittime'].'</span>'."\n";
       if ( 
$post['editor_status'] == 'user' )
           
$html $html.'<span class="editedByUser">Отредактировано '.
                   
$post['editor'].' '.$post['edittime'].'</span>'."\n";
      }      
      
$html $html.'</td>'."\n";
    } else {
      
$html $html.'<td>&nbsp;</td>'."\n";
    }
    
$html $html.'</tr>'."\n";
    
$html $html.'</table>'."\n";    
  }
  
  
// Постраничная навигация и ссылка "Ответить"
  
$html $html.$pagesAddPost;
  
  
// Если тема не закрыта - выводим форму для быстрого ответа
  
if ( $locked == $html $html.getQuickReplyForm$id_theme );
  
  
// Если страницу темы запросил зарегистрированный пользователь, значит он ее просмотрит
  
if ( isset( $_SESSION['user'] ) and isset( $_SESSION['newThemes'] ) ) {
    if ( 
count$_SESSION['newThemes'] ) > 
      if ( 
in_array$id_theme$_SESSION['newThemes'] ) ) unset( $_SESSION['newThemes'][$id_theme] );
    else
      unset( 
$_SESSION['newThemes'] );
  }
  
  return 
$html;
}
?>

Продолжение следует...