templates = имя-директории-на-сервере
Место расположения используемого набора шаблонов. Может быть (но не
- обязано) быть за пределами DocumentRoot.
+ обязано) быть за пределами DocumentRoot. Правда, в последнем случае
+ необходимо перенести в другое место библиотеки javascript и
+ графические элементы, которые в стандартном наборе шаблонов хранятся
+ там же, где и сами шаблоны
+
+templatesurl = url
+ Ссылка которую надо использовать для доступа к директории templates
+ по http. Используется в тех случаях, когда скрипт не может
+ автоматически правильно вычислить ссылку на каталог templates по
+ известной ему информации об URL forum-а.
userdir = имя-директории-на-сервере
- Место, куда складываются аватары пользователей
+ Место, куда складываются аватары пользователей. Должна быть в пределах
+ DocumentRoot
userurl = url
- Имя под которым эта директория видна по http
+ Имя под которым эта директория видна по http (если скрипт не может
+ этого правильно вычислить сам)
-passwd = имя-файла-на-сервере
+datadir = имя-директории на сервере
- Место расположения базы информации о пользователях. Должно быть
- имя файла в недоступной по http директории (за пределами DocumentRoot
+ Место расположения базы информации о пользователях, сессиях и другой
+ служебной информации, которая не должна уходить за пределы сервера.
+ Должно быть недоступной по http директорией (за пределами DocumentRoot
или в крайнем случае, запрещенной для доступа через .htaccess) к
которой cgi-скрипты имеют доступ на запись.
-sessions= имя-файла-на-сервере
-
- База активных пользовательских сессий. Те же требования
-
authperiod - время жизни пользовательской сессии.
Формат число единица измерения, где единица измерения может быть
m (минута)
проверки его сессии (постинг комментария, редактирование профиля)
его сессия продлевается на authperiod. По умолчанию 86400.
+replies_per_page - число реплик на странице форума.
+ По умолчанию 50
+
+forbid_tags=список-html-тэгов, запрещенных в сообщении.
+
+
+
форм с определенными именами. Скрипты форума вставляют в эти файлы
информацию руководствуясь классами элементов и именами полей форм.
+Во всех шаблонах производится правка относительных URL в элементах
+img src, a href, link href, form action.
+В URL начинающихся со слова templates заменяются на значение templateurl
+из конфигурации форума, URL, начинающиеся со слова users - на userurl,
+со слова forum - на путь к скрипту форума. Остальные относительные (т.е.
+не начинающиеся c http: или / url дополняются путем к корневому каталогу
+форума. Cсылки вида forum?параметры будут заменены на
+url-скрипта/url-страницы?параметры
+
Шаблоны страниц:
1. Страница темы
Клиент-сайд скрипт должен уметь скрывать кнопку move, если пользователь
не является модератором, а также кнопки edit и delete, если
пользователь не является автором сообщения, т.е. значение куки
- forum_author не совпадает с содержимым скрытого поля author
+ sluser не совпадает с содержимым скрытого поля author
+
+ Для того чтобы узнать является ли текущий пользователь модератором
+ данного форума, нужно запросить с сервера (через XmlHttpRequest)
+ файл .moderators лежащий рядом с текущим файлом и далее вверх по
+ иерархии. Эти файлы представляют собой простые текстовые файлы с именем
+ пользователя в каждой строке.
+ В корне форума имеется аналогичный файл .admins.
- Для того чтобы определить, является ли пользователь модератором данной
- страницы, нужно включить в html следующий элемент
- <script src="/cgi-bin/forum/<url текущей страницы>?getrights=1"></script>
- Полученый по этой url скрипт выставляет две глобальные переменные
- moderator
- и administrator в значение true, если пользователь имеет соответствущие
- права на данную тему и false, если не имеет.
- Кроме того этот скрипт выставляет глобальную переменную author, которая
- имеет значение идентификатора автора, что избавляет client-side cкрипт
- от самостоятельного анализа cookies.
+ Можно также запросить файл .banned.
- Манипулирование формами должно производиться из обработчика body onLoad
- чтобы скрипт getrights успел загрузиться.
+ Все эти действия являются необязательными. Если на клиентской стороне
+ они не будут выполнены и у пользователя появится возможность нажать на
+ кнопку выполнения операции, на которую у него нет прав, операция будет
+ заблокирована на сервере.
- Если кука FORUM_AUTHOR или глобальная переменная author не определены,
+
+
+ Если кука sluser не определена,
то желательно также скрыть кнопку reply и ссылку с классом mreply.
Кроме того на странице могут присутствовать элементы a с классами
В случае если во введенных данных произошла ошибка, сообщение об ошибке
скрипт вписывает в элемент с классом error вместо его innerHtml
+Во всем шаблоне формы производится подстановка информации о текущем
+пользователе, аналогично тому, как она производится в элементе с классом
+message в шаблоне темы.
+
Как правило, все скрипты получают следующую информацию
1. Поле с именем операции и произвольным непустым значением
Возможные операции
Встраивание служебных форм непосредственно в страницы форума
Форма, содержащая вышеперечиленные поля, имеющая метод POST и имеющая в поле
- action="/cgi-bin/forum/<url страницы, где она размещена)
+ action="forum/<url страницы, где она размещена)
может быть встроена непосредственно в страницу темы или списка
тем/списка форумов. Желательно чтобы она делалась видимой только при
нажатии кнопки. Отправка этой формы приводит к выполнению необходимого
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Ошибка</TITLE>
+</HEAD><BODY bgcolor="#ccffcc">
+<H3>Тестовый форум Still Life</h3>
+<h1>Произошла неустранимая ошибка</h1>
+<div class="error"></div>
+</BODY>
+</HTML>
--- /dev/null
+// Библиотека стандартных функций, используемых в формах форумного
+// скрипта
+//
+
+// Запрещает поле password в текущей форме если значение value текущего
+// элемента не пусто. Используется в качестве обработчика onChange
+// для поля openid_site. Пример использования
+// <select name="openid_site" onChange="selectSite(this)">
+
+function selectSite( element) {
+ var form = element.form;
+ var password_field = form["password"];
+ if (element.value != "") {
+ password_field.disabled=1;
+ } else {
+ password_field.disabled=0;
+ }
+}
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Still Life - Форум</TITLE>
+<script language="JavaScript" src="templates/page.js">
+<script language="JavaScript" src="templates/common.js">
+</script>
+</HEAD><BODY bgcolor="#ccffcc">
+<a class="userurl" href="forum?register=1">Зарегистрироваться</a> <a
+class="login" href="forum?login=1">Войти</a>
+<a class="moderator" href="forum?newtopic=1">Создать тему</a>
+<a class="moderator" href="forum?newforum=1">Создать форум</a>
+<H3>Тестовый форум Still Life</h3>
+<div id="loginform" style="visibility: hidden; display: none;"
+<form action="forum" method="POST">
+<table border=0>
+<tr><td>Имя пользователя:</td><td><input type=text name="user" size=30>
+</td></tr>
+<tr><td>Сайт на котором вы зарегистрированы</td><td> <select
+name="openid_site" onChange="selectSite(this)">
+<option selected value="">Этот сайт</option>
+<option value="http://livejournal.com/users/%s">LiveJournal.com</option>
+<option value="http://diary.ru/~%s">Diary.ru</option>
+<option value="http://lj.rossija.org/users/%s">LJ.Rossija.org</option>
+<option value="http://%s">Другой Open-ID сайт</option>
+</select></td></tr>
+<tr><td>Пароль:</td><td><input type="password" name="password"
+size=20></td></tr>
+<tr><td></td><td><input type="checkbox" name="bindip" value="1"> Только с этого IP-адреса
+</td><tr>
+<tr><td colspan=2 align=right"><input type=submit name="login"
+value="Вoйти">
+</table>
+</form>
+</div>
+<div class="message">
+<h2 class="subject">Корень форума</h2>
+<span class="date"></span>
+<div class="text"></div>
+
+<div class="forumlist">
+<h2>Подфорумы</h2>
+<div class="forum" style="background-color: #ffddcc; padding: 10px; margin: 10px;">
+<p>
+<a href="#" class=subject>Название форума</a> Создан: <span class="date"></span><br>
+<div class="text">аннотация форума</div>
+
+<form class="foruminfo" action="forum" method="POST">
+<input name=id type="hidden">
+<input type="submit" name="edit" value="Редакт">
+<input type="submit" name="move" value="Переместить">
+<input type="submit" name="delete" value="Удалить">
+<input type="submit" name="setrights" value="Доступ">
+</form>
+</p>
+</div>
+</div>
+<div class="topiclist">
+<h2>Темы</h2>
+<div class="topic" style="background-color: #ffffcc; padding: 10px;
+margin: 5px;" >
+<p>
+<a href="#" class=subject>Название темы</a> Создана: <span class="date"></span><br>
+<div class="text">аннотация темы</div>
+
+<form class="foruminfo" action="forum" method="POST">
+<input name=id type="hidden">
+<input type="submit" name="edit" value="Редакт">
+<input type="submit" name="move" value="Переместить">
+<input type="submit" name="delete" value="Удалить">
+<input type="submit" name="reply" value="Высказаться">
+</form>
+</p>
+
+</div>
+</BODY>
+</HTML>
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Still Life - Вход</TITLE>
+<script language="JavaScript" src="templates/form.js">
+</script>
+</HEAD><BODY bgcolor="#ccffcc">
+<H3>Тестовый форум Still Life</h3>
+<form method="POST" action="forum" name="login">
+<a class="author" href="forum?register=1">Зарегистрироватьcя</a>
+<table border=0>
+<tr><td>Имя пользователя:</td><td><input type=text name="user" size=30>
+</td></tr>
+<tr><td>Сайт на котором вы зарегистрированы</td><td> <select
+name="openid_site" onChange="selectSite(this)">
+<option selected value="">Этот сайт</option>
+<option value="http://livejournal.com/users/%s">LiveJournal.com</option>
+<option value="http://diary.ru/~%s">Diary.ru</option>
+<option value="http://lj.rossija.org/users/%s">LJ.Rossija.org</option>
+<option value="http://%s">Другой Open-ID сайт</option>
+</select></td></tr>
+<tr><td>Пароль:</td><td><input type="password" name="password"
+size=20></td></tr>
+<tr><td></td><td><input type="checkbox" name="bindip" value="1"> Только с этого IP-адреса
+</td><tr>
+<tr><td colspan=2 class="error"></td></tr>
+<tr><td colspan=2 align=right"><input type=submit name="login"
+value="Вoйти">
+</table>
+
+</form>
+
+</BODY>
+</HTML>
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Still Life - регистрация пользователя</TITLE>
+<script src="templates/form.js"></script>
+</HEAD><BODY bgcolor="#ccffcc">
+<H3>Тестовый форум Still Life</h3>
+<div style="border: 1px;">
+<form method="POST" name="login" action="forum">
+Имя: <input type=text name="user" size=30>
+<select name="openid_site" onchange="selectSite(this)">
+<option selected value="">Этот сайт</option>
+<option value="http://livejournal.com/users/%s">LiveJournal.com</option>
+<option value="http://diary.ru/~%s">Diary.ru</option>
+<option value="http://lj.rossija.org/users/%s">LJ.Rossija.org</option>
+<option value="http://%s">Другой Open-ID сайт</option>
+</select>
+<input type=submit name=login value="Войти"><br>
+Пароль: <input type="password" name="password">
+<input type="checkbox" name="bindip" value="1"> Только с этого IP-адреса
+</form>
+</div>
+
+<h1>Регистрация нового пользователя</h1>
+<div class="error"></div>
+<form name="register" method="POST" action="forum" enctype="multipart/form-data">
+<table border=0>
+<tr><td>Имя</td><td><input name="user" size="32"></td></tr>
+<tr><td rowspan=2>Пароль</td><td><input name="pass1" type="password"></td></tr>
+<tr><td><input name="pass2" type="password"></td></tr>
+<tr><td>Адрес E-Mail</td><td><input name="email" size="40"></td></tr>
+<tr><td>Комментарий</td><td><textarea name="comment" rows=5
+cols=60></textarea></td></tr>
+<tr><td rowspan=2>Аватар</td><td>URL: <input name="avatar"
+size=50></td></tr>
+<tr><td>Или загрузить: <input type=file name="avatarfile"></td></tr>
+<tr><td colspan=2 align=center"><input type=submit name="register"
+value="Зарегистрирваться">
+</table>
+
+</form>
+
+</BODY>
+</HTML>
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Still Life - Высказаться</TITLE>
+</HEAD><BODY bgcolor="#ccffcc">
+<script src="templates/form.js"></script>
+<H3>Тестовый форум Still Life</h3>
+<form method="POST" name="reply" action="forum">
+<input type="hidden" name="id" value="">
+<table border=0>
+<tr><td rowspan=2>Пользователь:</td><td> <a class="author" href="forum?register=1">Зарегистрироваться</a><br></td></tr>
+<tr><td><input type=text name="user" size=30>
+<select name="openid_site" onchange="selectSite(this)">
+<option selected value="">Этот сайт</option>
+<option value="http://livejournal.com/users/%s">LiveJournal.com</option>
+<option value="http://diary.ru/~%s">Diary.ru</option>
+<option value="http://lj.rossija.org/users/%s">LJ.Rossija.org</option>
+<option value="http://%s">Другой Open-ID сайт</option>
+</select></td></tr>
+<tr> <td rowspan=2>Пароль:</td><td><input type="password" name
+="password"></td></tr>
+<tr><td><input type="checkbox" name="bindip" value="1"> Только с этого IP-адреса
+</td><tr>
+<tr><td colspan=2 class="error"></td></tr>
+<tr><td>Тема: </td><td><input name="subject" size="40"></td></tr>
+<tr><td>Текст:</td><td><textarea name="comment" rows=10
+cols=72></textarea></td></tr>
+<tr><td>Формат:</td><td><select name="format"><option value="text"
+selected>Без разметки</option>
+<option value="bbcode">BBCode</option>
+<option value="html">Html</option></select</td></tr>
+<tr><td>Картинка</td> <td><input type=file name="avatarfile"></td></tr>
+<tr><td colspan=2 align=right"><input type=submit name="reply"
+value="Высказаться">
+</table>
+
+</form>
+
+</BODY>
+</HTML>
--- /dev/null
+<HTML><HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+<TITLE>Still Life - Форум</TITLE>
+<script language="JavaScript" src="templates/page.js">
+<script language="JavaScript" src="templates/common.js">
+</script>
+</HEAD><BODY bgcolor="#ccffcc">
+<a class="userurl" href="forum?register=1">Зарегистрироваться</a> <a
+class="login" href="forum?login=1">Войти</a>
+<a class="moderator" href="forum?newtopic=1">Создать тему</a>
+<a class="moderator" href="forum?newforum=1">Создать форум</a>
+<H3>Тестовый форум Still Life</h3>
+<div id="loginform" style="visibility: hidden; display: none;"
+<form action="forum" method="POST">
+<table border=0>
+<tr><td>Имя пользователя:</td><td><input type=text name="user" size=30>
+</td></tr>
+<tr><td>Сайт на котором вы зарегистрированы</td><td> <select
+name="openid_site" onChange="selectSite(this)">
+<option selected value="">Этот сайт</option>
+<option value="http://livejournal.com/users/%s">LiveJournal.com</option>
+<option value="http://diary.ru/~%s">Diary.ru</option>
+<option value="http://lj.rossija.org/users/%s">LJ.Rossija.org</option>
+<option value="http://%s">Другой Open-ID сайт</option>
+</select></td></tr>
+<tr><td>Пароль:</td><td><input type="password" name="password"
+size=20></td></tr>
+<tr><td></td><td><input type="checkbox" name="bindip" value="1"> Только с этого IP-адреса
+</td><tr>
+<tr><td colspan=2 align=right"><input type=submit name="login"
+value="Вoйти">
+</table>
+</form>
+</div>
+<h2 class="title">Корень форума</h2>
+<div class="message" style="background-color: #ffffcc;">
+<table>
+<tr><td>
+<span class="date"></span>
+<div class="text"></div>
+
+<div class="forumlist">
+<h2>Подфорумы</h2>
+<div class="forum" style="background-color: #ffddcc; padding: 10px; margin: 10px;">
+<p>
+<a href="#" class=subject>Название форума</a> Создан: <span class="date"></span><br>
+<div class="text">аннотация форума</div>
+
+<form class="foruminfo" action="forum" method="POST">
+<input name=id type="hidden">
+<input type="submit" name="edit" value="Редакт">
+<input type="submit" name="move" value="Переместить">
+<input type="submit" name="delete" value="Удалить">
+<input type="submit" name="setrights" value="Доступ">
+</form>
+</p>
+</div>
+</div>
+<div class="topiclist">
+<h2>Темы</h2>
+<div class="topic" style="background-color: #ffffcc; padding: 10px;
+margin: 5px;" >
+<p>
+<a href="#" class=subject>Название темы</a> Создана: <span class="date"></span><br>
+<div class="text">аннотация темы</div>
+
+<form class="foruminfo" action="forum" method="POST">
+<input name=id type="hidden">
+<input type="submit" name="edit" value="Редакт">
+<input type="submit" name="move" value="Переместить">
+<input type="submit" name="delete" value="Удалить">
+<input type="submit" name="reply" value="Высказаться">
+</form>
+</p>
+
+</div>
+</BODY>
+</HTML>