Описание шаблонов форума Шаблоны форума представляют собой обыкновенные 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. Страница темы title - в элемент с таким классом помещается заголовок темы. Тот же самый заголовок помещается в элемент в <head> Например <h1 class="title">Тема форума</H1> message На странице темы должен присутствовать блоковый элемент с классом message. Подстановка конкретного сообщения производится внутрь этого элемента. При появлении в теме следующего сообщения этот элемент копируется и копия вставляется сразу после предыдущего. Элементу приписывается атрибут id, содержащий уникальный идентификатор данного сообщения Внутри элемента с классом message должны содержаться следующие элементы manchor - якорь на который будут формироваться ссылки на это сообщение. Атрибут name заменяется на идентификтаор этого сообщения mlink - ссылка на это сообщение. Атрибут href заменяется на author - ник автора сообщения. innerHtml заменяется на ник автора Следует учитывать что в случае openId авторизации в этот элемент будет помещен элемент a со ссылкой на домашнюю страницу mdate - дата публикации сообщения innerHtml заменяется на дату avatar - элемент img атрибут src которого заменияется на аватар автора, или на templates/1x1.gif если у автора нет аватара. ap-status - статус автора на форуме innerHtml заменяется на статус ap-comment - комментарий к нику, введенный автором при регистрации. innerHtml заменяется на комментарий И прочие классы с префиксом ap-, innerHtml которых заменяеняется на соответствущие поля из профайла автора. Если поле имеет в имени подчерк, допустимо вместо подчерка использовать дефис "-" в названии класа. msubject - тема сообщения. Заменяется innerHtml mtext - текст сообщения. innerHtml заменяется на отформатированный текст mreply - ссылка на скрипт ответа. Атрибут href будет заменен на корректную url. Элемент id заменяется на reply<идентификатор сообщения> Например: <div class="message" id="0001"> <a name="00001" class="manchor"></a> <h2 class="msubject>Тема сообщения</h2> Автор <span class="mauthor">В Пупкин</span> (<span class="acomment">Пользователь форума</acomment>, <span class"astatus">Модератор</span>) <img align=left class=avatar src="/forum/users/v_pupkin.jpg"> <div class="mtext"> Текст сообщения с <b>выделениями</b> </div> <a href="/forum/f1/topic1.html#0001" class="mlink">ссылка на это сообщение</a> <a href="/cgi-bin/forum/f1/topic1.html?reply=reply&id=0001" сlass="mreply">ответить</a> <form class="actions" name="fa0001" action="/cgi-bin/forum/f1/topic1.html"> <!-- .... см ниже .... --> <input type="hidden" name="id" value="0001"> <input type="hidden" name="author" value="В. Пупкин"> <input type="submit" name="edit" value="Редактировать"> <input type="submit" name="delete" value="Удалить"> <input type="submit" name="move" value="Переместить в другую тему"> </form> </div> Кроме того, в элементе c классом message должна присутствовать форма с классом actions. В ней должны присутсвовать следующие поля 1. Скрытое поле id 2. Скрытое поле author 3. Кнопка edit 4. Кнопка delete 5. Кнопка move 6. Кнопка reply (заменяет собой ссылку с классом mreply) Клиент-сайд скрипт должен уметь скрывать кнопку move, если пользователь не является модератором, а также кнопки edit и delete, если пользователь не является модератором или автором сообщения(т.е. значение куки sluser не совпадает с содержимым скрытого поля author) Определять какие кнопки и ссылки являются ссылками на форумный скрипт и должны скрываться и показываться в зависимости от прав доступа, следует по атрибуту href ссылки и атрибуту action формы в сочетании с атрибутом name у соответствующей кнопки. (кнопкой считаются input type=submit и input type=image). В разделе head у шаблона должны присутствовать тэги link вида 1. <link href="forum" rel="forum-script"> По общим правилам подстановки серверный скрипт при обработке шаблона заменит href этого элемента на собственную url. Соответственно формы с action равной этой URL следует рассматривать как подлежащие обработке и искать в них кнопки с именами, соответствующими именам операций. И ссылки с href=эта url?параметры В ссылке следует искать параметр вида имя-операции. 2. <link href="forum" rel="forum-user-list"> Содержимое href этого скрипта может быть использовано client-side скриптом для формирования ссылки на страничку локального пользователя форума (в случае если имя пользователя начинается с http:://, это OpenID-пользователь и его страничка находстия по URL, совпрадающей с именем пользователя. Если кука sluser не определена, то желательно также скрыть кнопку reply и ссылку с классом mreply, если только в шаблоне формы reply не предусмотрены поля, позволяющие залогиниться в момент отправки реплики. Для получения информации о правах текущего пользователя в форуме нужно запросить (через XMLHttpRequest) файл perms.txt из текущей директории (где расположена текущая страница) и выше по иерархии вплоть до корня форма. Корнем форума является директория, где расположен файл .forum (не обязательно доступный для чтения по http. Ответ сервера 403 как и ответ 200 надо рассматривать как "файл найден") Кроме того на странице могут присутствовать элементы a с классами next и prev. В случае если тема разрослась более чем на одну страницу, их href-атрибуты заменяются на ссылки на предыдущую следующую страницу. Если тема состоит из одной страницы, ссылки будут вести на неё же. Как вариант, можно использовать классы bnext и bprev. Если нет предыдущей/следующей страницы, элементы a с такими классами будут заменены на span. Страница списка тем (головная страница форума) Может иметь элемент с классом annotation, описывающий форум в целом (его создатель, вводный текст и т.д. устроенный внутри аналогично элементу списка форумов (см ниже). Если в шаблоне присутствует элемент meta name="description", то туда помещается текстовое представление аннотации форума. Если в шаблоне присутствуют элементы с классом top-page, то они будут сохранены только на головной странице форума, а при создании подфорумов будут из их оглавлений удаляться. Шаблоном описания конкретной темы является элемент с классом topic, Содержащий элемент с классом title (название темы, должно быть ссылкой), abstract (аннотация темы) author (ссылка), date (дата создания темы), tlink (якорь для ссылок на элемент списка тем ), last-updated и msgcount. Внутри элемента с классом topic должна присутствовать форма с кнопками edit delete move setrights и скрытым полем id. Кнопку setrights следует показывать только пользователю с правами администратора. элемент с классом topic должен быть заключен в элемент с классом topiclist. При отсутствии тем на странице элементу с классом topiclist сервер приписывает атрибут style="display: none;". При добавлении новой темы элемент с классом topic копируется и вставляется непосредственно за предыдущим Кроме этого, cтраница должна иметь ссылку на форумный скрипт с параметром newtopic=1 или форму с именем topicinfo и кнопкой submit с именем newtopic Список подфорумов устроен аналогично списку тем. Элемент списка форумов должен иметь класс forum, а форма/ссылка для создания нового форума соотвесттвенно имя/класс newforum, а объемлющий элемент, который скрывается при отсутствии подфорумов - класс forumlist В шаблоне элемента списка форумов может присутствовать элемент img с классом logo. Если такой элемент обнаружен, то при наличии в директории форума файла logo с расширением png, jpg или gif, в src пропиcывается ссылка на этот файл. Иначе прописывается ссылка на templates/1x1.gif Допускается также ситуация когда на одной странице присутствует и список форумов, и список тем. (В этом случае если физически отсутствуют либо те, либо другие, соответствующему элементу-шаблону выставляется style="display: none"); Кроме этого на всех страницах рекомендуется иметь элемент-ссылку, который отображает текущее имя пользователя. Этот элемент должен конфигурироваться client-side cкриптом и показывать либо текст "Зарегистрироваться" и аналогичный и вести на /cgi-bin/forum/<адрес текущей страницы?login=1 либо имя пользователя и вести на /cgi-bin/forum/<aдрес текущей страницы?user=1 Шаблоны служебных страниц (т.е. форм регистрации, логина и т.д.) Служебные страницы форума (т.е. формы, выводимые скриптами) также оформляются с помощью HTML-шаблонов. Если страница выдается в результате POST-запроса уже содержащего требуемые данные, значения соответствующих элементов ввода заменяются на эти данные. В случае если во введенных данных произошла ошибка, сообщение об ошибке скрипт вписывает в элемент с классом error вместо его innerHtml Во всем шаблоне формы производится подстановка информации о текущем пользователе, аналогично тому, как она производится в элементе с классом message в шаблоне темы. Как правило, все скрипты получают следующую информацию 1. Поле с именем операции и произвольным непустым значением Возможные операции reply edit delete move newtopic newforum getrights login register userlist profile setrights 2. Поле id с идентификатором комментария/темы/форума Это поле должно быть обязательно проброшено через форму как скрытое поле. 3. Поле returnto - url куда направить пользователя после успешного завершения операции. Если эта форма присутствует в шаблоне, но скрипт вызывается без соответствующего значения в url или postdata, это поле заполняется значением заголовка referer http-запроса. Обработка форматированного (размеченного) текста: В некоторые поля форм (текст реплики, подпись пользователя) должен вводиться форматированный текст. Такому полю должно соответствовать поле с именим имя_format (например, полю text соотвествует поле text_format, полю signature - signature_format). Поле format может принимать одно из трех значений - html, bbcode и text. Если поле format имеет значение html, то содержимое соответствующего текстового поля рассматривается как html, подвергается чистке от небезопасных тэгов и сохраняется в таком виде. Если поле format имеет значение text, то спецсимволя эскейпятся, а переводы строки заменяются на теги <br>. Если поле имеет значение bbcode, то обрабатываются управляющие последовательности bbcode. Наличие URL в тексте проверяется независимо от формата. Скрипт входа в систему (операция login) Форма с именем login содержит поля name и password Может также содержать checkbox с именем bindip (привязка авторизационной куки к IP) При авторизации по OpenID используется поле openidsite. Его значение интерпретируется как шаблон для операции sprintf, который должен содержать один спецификатор формата %s, куда подставляется имя пользователя. Если поле openidsite имеет пустое значение, пользователь рассматривается как локальный. Если непустое, то как openid-пользователь. Кнопка submit называется login Форма регистрации нового пользователя (операция register, форма с именем register) Содержит поля user pass1 pass2 comment Может также содержать любые дополнительные поля информации о пользователе. Они будут сохранены в списке пользователей и могут потом выводиться в шаблонах рядом с информацией об авторе. Скрытое поле required содержит список полей, которые обязательно требуются при регистрации. Поля user, pass1 и pass2 туда включать не следует. Скрытое поле ignore содержит список полей, которые НЕ НУЖНО сохранять в качестве информации о пользователе. Поля user, pass1, pass2 и bindip туда включать не нужно. Так же если в форме присутствуют поля avatar и avatarfile, поле avatarfile будет автоматически включено в этот список, а поле avatar при наличии зааплоаженного файла будет заменено на URL к этому файлу. Параметр restricted_userinfo в конфигурационном файле форума позволяет задать список полей, которые пользователь не имеет права редактировать сам, все равно в процессе регистрации или при редактировании профиля. Поля, которые, при их наличии, обрабатываются скриптом форума специальным образом 1. avatar/avatarfile - картинка пользователя. Поле avatarfile (зааплоаженная картинка) имеет приоритет над avatar (внешняя URL) В случае если задано avatarfile, в информации о пользователе сохраняется поле avatar с URL к этой картинке 2. signature - обычно поле с форматированным текстом. Дописывается в конец каждого созданного данным пользователем сообщения 3. email - если не пусто, то проверяется на корректность посредством модуля EMail::Valid 4. status - если имеет значение disabled, то данному пользователю запрещен вход на форум до тех пор, пока администратор форума не изменит статус. В случае, если требуется подтверждение регистрации модератором рекомендуется прописывать это поле в restricted_user_info и указывать в конфигурациии форума default_status = disabled, Скрипт отправки комментария Операция reply поля subject text (тэг textarea) text_format Можно также включать (динамически добавлять) поля file upload image1 image2 etc. кнопка submit называется reply. Данная форма может также включать поля формы login. Т.е. поддерживается аутентификация пользователя одновременно с отправкой комментария. В силу технических ограничений, одновременно с регистрацией по OpenID невозможен upload файлов и отправка комментариев длинной более 2-4Кб. Точный предел размера комментария зависит от длины URL форума и пределов размера URL, установленных при компиляции веб-сервера форума и веб-сервера openid-сервера. Скрипт создания новой темы или нового форума поля subject text text_format urlname. При создании форума еще может присутствовать file upload field logo. Зааплоаженный туда файл помещается в директрию форума с именем logo и расширением соответствующим расширению исходного файла. В последнее поле следует запретить ввод символов нелатинского алфавита '/' и '?' Cкрипт просмотра списка пользователей (опция userlist) Элемент с классом user содержит элементы с классами, имена которых соответствуют именам свойств пользователей. Если внутри элемента присутствует элемент с классом formoder или foradmin, то при просмотре страницы пользователем, не имеющим соответствующих прав, этот кусок выкусывается на сервере. Должен присутствовать элемент именем profile имеющий тип a. Его атрибут href заменяется на ссылку на скрипт редактирования профайла. Форм этот шаблон вообще не содержит Скрипт раздачи прав модерирования (setrights) Дает права модераторов на определенный форум/тему, или права администраторов. В результате заполнения формы поле с именем moderators должно содержать список модераторов для данной темы (соответствующей url страницы в pathinfo) поле с именем administrators список всех администраторов данного сайта. Скрипт редактирования свойств пользователя. Аналогичен скрипту регистрации, но администратору еще видно поле status. (пользователю - тоже видно, но input или select заменяется на обычный текст) Может присутствовать кнопка resetpassword (показывается только администраторам) Встраивание служебных форм непосредственно в страницы форума Форма, содержащая вышеперечиленные поля, имеющая метод POST и имеющая в поле action="forum/<url страницы, где она размещена) может быть встроена непосредственно в страницу темы или списка тем/списка форумов. Желательно чтобы она делалась видимой только при нажатии кнопки. Отправка этой формы приводит к выполнению необходимого действия без показа страницы скрипта. Служебные шаблоны Шаблон с именем error.html используется для выдачи фатальных ошибок скрипта. (когда нет возможности показать форму). Он должен содержать элемент с классом error, innerHTML которого будет заменен на сообщение об ошибке.