Гостевая книга легко реализуется из пары макросов $News[]$ и $Form[]$. Для безопасной реализации потребуется макрос $Replace[]$, который доступен начиная с пакета Selection.
Подобный функционал также подходит для реализации комментариев к статьям, товарам. Как пример рассмотрим как сделан и работает блок комментариев к товарам на сайте http://www.cellafon.ru.
В примере могут быть незначительные ошибки по коду, поскольку приводится он для учебных целей. Код приводится исключительно для понимания принципа сборки.
Принцип работы на примере комментариев к элементам каталога
Работать будет все примитивно: мы разместим на странице с товаром ленту комментариев, а под ней форму для добавления отзывов. Добавляются сообщения пользователями, они записываются в определенную таблицу. Поскольку макрос Form будет записывать в таблицу кроме полей формы также идентификаторы товара и категории из URL (параметры iid/sid), то в таблице у нас получится набор комментариев с полями iid/sid тех товаров, к которым они привязаны. По ним можно будет фильтровать комментарии для вывода на странице только тех, которые относятся к данному товару.
Код вывода комментариев (положить в дизайн вывода конкретного товара/новости/категории и т.п.):
$News[source: guestbook; design: guestbook; filter: iid=6D4D6C8CFDCE46C78AF0D2B9568A7FE7, state=on; sort: created, desc, auto; items_per_page: 10]$
Данный код при нахождении на странице с каким-то товаром выводит из таблицы guestbook те записи, у которых в поле iid будет найдено значение равное идентификатору текущего товара (берется из параметра iid в URL).
Под этим блоком (или где нужно по дизайну) добавляем макрос Form:
$Form[html: GuestbookForm; savetodb: guestbook; redirect_after: add_message_result; email_label: email_guestbook]$
Одновременно с добавлением комментария в таблицу guestbook.dat, админу сайта отправляется письмо по email (метка email_guestbook) и пользователя переводят на страницу с псевдонимом add_message_result. Форма имеет нужный разработчику дизайн и перечень полей. Также, в ней можно реализовать Javascript валидаторы для проверки на заполненность полей и другие возможности.
Код дизайна вывода записей в гостевой (news_design.xml):
<newsdesign id="guestbook">
<header>
<![CDATA[
<HR size=1>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH=100%>]]>
</header>
<delimiter>
<![CDATA[
<TR><TD colspan=2><HR size=1></TD></TR>
]]>
</delimiter>
<item>
<![CDATA[
<tr>
<td valign=top>
<B>$Attribute:created$ <SPAN style="font-size: 11pt"><a href="mailto:$Attribute:email$">$Attribute:name$</A></B></SPAN>
<P>
$Dehtmlize[$Attribute:message$]$
</td>
</tr>
]]>
</item>
<footer>
<![CDATA[
</TABLE>
<HR size=1>
$Text[source: "<SPAN style="font-size: 10pt"><P align=right>Страницы: </P></SPAN>"; condition: $NotEmpty[]$]$
]]>
</footer>
</newsdesign>
Этот дизайн используется в нашем вышеописанном $News[]$, выводит перечень комментариев в простейшей форме. Макрос DeHTMLize позволяет отфильтровать все HTML тэги кроме <BR> непосредственно при выводе на страницу. Более сложные варианты фильтрации можно реализовать макросом Replace, который поддерживает как простые поиск и замену, так и регулярные выражения в нотации языка Perl.
Пример простой формы добавления отзыва о товаре без валидации и капчи (в примере файл Templates/GuestbookForm.html):
<H1>Добавить отзыв о товаре</H1>
<FORM action="" method=POST>
<TABLE class=system cellSpacing=0 cellPadding=5 border=0>
<TR>
<TD align=right>Как Вас зовут</TD>
<TD><INPUT name=name></TD></TR>
<TR>
<TD align=right>Email</TD>
<TD><INPUT name=email></TD></TR>
<TR>
<TD align=right>Сообщение</TD>
<TD><TEXTAREA name=message rows=8 cols=60></TEXTAREA></TD></TR>
<TR>
<TD> </TD>
<TD><input type="submit" value="» Отправить"></TD></TR></FORM></TABLE>
Сущность для записи:
<entity id="guestbookitem" name="Комментарий">
<field id="created" type="locked" sortas="datetime[hh:mm:ss DD.MM.YYYY]" name="Дата"/>
<field id="state" type="checkbox" name="Опубликована"/>
<field id="name" type="string" sortas="literal" name="Имя"/>
<field id="email" type="string" sortas="literal" name="Email"/>
<field id="message" type="text" sortas="literal" name="Сообщение"/>
</entity>
Справочник с сообщениями выводится через $News[]$ обычным образом. При выводе с помощью макроса $Replace[]$ мы сначала модифицируем HTML тэги, чтобы на сайт нельзя было опубликовать какую-нибудь гадость, а затем "разрешаем обратно" тэг <B>, чтобы пользователям он был доступен. Перечень разрешенных тэгов, естественно, можно расширить произвольным образом.
Для удобства модерирования его можно подключить в админзоне через $ListEditor[table: guestbook; entity: guestbook_item]$ и редактировать, удалять или добавлять сообщения через админзону.