Реализация гостевой книги, комментариев к статьям, новостям и т.п.


Гостевая книга легко реализуется из пары макросов $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]$ и редактировать, удалять или добавлять сообщения через админзону.