Модуль комментариев под Битрикс
 

Документация

Технические детали

Инфоблоки обсуждений

Все комментарии накапливаются в инфоблоках. Тип инфоблоков, зарезервированный под модуль: «iopen_tapes». Разделы первого уровня — урлы страниц, на которых уже начато обсуждение (есть минимум одно сообщение). Урлы публикуются с указанием конечного (исполняемого) файла, например:

/news/45/index.php
/news/detail.php?ID=78
/topic/section.php?ID=235

Урл страницы — уникальный и универсальный идентификатор страницы. Логика использования такого подхода описана в логике привязки обсуждения к адресу, механизм получения реального урла страницы — в секции GET-ключи настроек модуля.

Доступ к инструментам редактирования и модерирования имеют пользователи, у которых в настройках инфоблока установлен уровень доступа минимум «Изменение».

Любое редактирование и модерация производится прямо на странице. Это тем более рекомендовано, поскольку через операции в публичном разделе отслеживаются события, отвечающие за поддержание кешированных данных в актульном состоянии. В резерве имеются мысли по поводу регистрации своих обработчиков событий для отслеживания редактирования разделов через административный раздел, но их востребованность крайне мала, а нагрузка на каждый хит довольно большая. Редактирование сообщений через административный раздел — скорее исключение, чем правило. В любом случае, нюансы возникают только в вопросах актуальности кеша, а его легко очистить с помощью специальных параметров в урле.

При создании инфоблоков и настройке разделов, модулем создаются пользовательские поля разделов:

UF_TAPER_FAXIMILLE

Подпись автора сообщения. При открытии формы добавления сообщения, подпись берётся из авторизованных данных либо из куки. Если пользователь ещё ни разу не принимал участие на конкретном сайте, поле подписи пустое. После первого сообщения подпись сохраняется в куки и в следующий раз поле с подписью будет заполнено.


UF_EMAIL

Электронный адрес автора сообщения. При открытии формы добавления сообщения, электронный адрес берётся из авторизованных данных либо из куки. Если пользователь ещё ни разу не принимал участие на конкретном сайте, поле с электронным адресом пустое. После первого сообщения подпись сохраняется в куки и в следующий раз поле с подписью будет заполнено. Если в сообщении указан электронный адрес, автору сообщения будут приходить уведомления про комментарии в его ветке.


UF_URL_PARENT

Код самого первого раздела в текущей ветке — родительского раздела первого ровня (в его названии хранится информация про урл страницы, на котором размещено обсуждение). Данная связка полезна при построении списка последних комментариев, когда нужно «собрать» урл к комментарию. Урл к каждому конкретному комментарию строится по формуле:
URL#tape_text_ID, где URL берём из поля NAME самого первого родительского раздела в этой ветке, а ID — код комментария (ID раздела в инфоблоке).


UF_FILES_IN_COMMENT

Список путей к прикреплённым изображениям. Указывается путь к файлу на сервере. Это свойство типа текст — ему отдан приоритет перед свойством «Файл», поскольку имея дело с обычной строкой не нужно обращаться к базе данных чтобы узнать путь к файлу.


UF_REQUEST_INFO

Поле, в которое записываются данные из запроса: "REMOTE_ADDR", "HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "HTTP_USER_AGENT", "HTTP_REFERER", "HTTP_COOKIE", "SERVER_PORT", "REQUEST_URI". При активном спаме можно заблокировать пользователя, ориентируясь на данные из этого свойства.


UF_USER_ID, UF_USER_LOGIN

Если комментарий оставлен авторизованным пользователем, в данные поля сохраняются соответственно его код и логин. В основном используется при построении ссылки на личную страницу пользователя. В публичной части механизм активируется соответствующим параметром компонента. Шаблон ссылки на страницу пользователя задаётся в настройках модуля.

Инлоад-формы и аякс

Инлоад формы — ещё один инструмент, разработанный нами под Битрикс и интегрированный в модуль. Это система, позволяющая через аякс-запросы подгрузить форму, при необходимости — с уже актуальными и подготовленными данными (например, для редактирования сообщения), а также стили и скрипты, сопровождающие форму.

При обращении через аякс происходит проверка на соответствие данных запроса доменному имени, установленному в настройках модуля. Если доменное имя в настройках модуля не установлено, будет отображено предупреждение об угрозе безопасности. Если доменное имя запроса будет отличаться о доменного имени, установленного в настройках — в обработке запроса будет отказано. Это настройка безопасности позволяет отсечь прямые запросы к исполняющим аякс-файлам и запросы, отправленные с других доменов.

В модуле предусмотрен параметр, который позволяет переключиться на работу с кастомизированной инлоад-формой. Если вы решили внести изменения в инлоад-форму, скопируйте файлы *.css, *.js, *fld из раздела /bitrix/templates/.default/itape/inload/ в другую папку и укажите в параметрах модуля путь к этой папке.

Все js-скрипты самодостаточны в рамках модуля и не требуют дополнительных классов. Для регистрации событий, как то: window.onload, window.onresize, window.onscroll используются штатные классы Битрикса: jsUtils и jsEvent. Если вдруг этих классов нет, события регистрируются напрямую.

Связь с окружением

Не редки случаи, когда системе уведомлений о новых комментариях нужно выйти за рамки модуля. Например, уведомлять автора публикации (зарегистрированного пользователя) или рассылать уведомления о новом комментарии по списку специальных адресов (организовать подписку на обсуждение). Для того, чтобы сделать это возможным, модуль отслеживает специальные наружные параметры. Их следует определить в виде input полей типа hidden в любом месте страницы.

Зачастую, перед обсуждением размещается компонент, отрабатывающий типовое действие, например: публикацию новости и нет проблем в вывод компонента добавить публикацию input:hidden полей.


Список ключей наружного окружения:

tape_general_title

Главный заголовок, характеризующий страницу, на которой размещено обсуждение. Уникальность модуля, заключающаяся в том, что его можно разместить на абсолютно любой странице, не позволяет технически верно определить и характеризовать страницу, на которой размещено обсуждение, иначе как по адресу страницы. Однако адрес страницы в уведомлении администратору и модератору — недостаточный ориентир. Для того, чтобы модераторам в уведомлении дать чёткий ориентир, характеризующий страницу, с которой создано уведомление, предусмотрен данный параметр. Как правило он содержит название новости или название товара или объявления. Например: "Новость: Высадка на Маркс", "Объявление: Продам двухкомнатную квартиру", "Товар: Фрезеровальный станок по дереву".


tape_user_id

Код зарегистрированного пользователя. Несколько пользователей указываются через запятую без пробела. У указанного пользователя будет прочитан электронный адрес и отправлено уведомление про новый комментарий в обсуждении. Данный параметр дополняет параметр tape_user_email


tape_user_email

Электронный адрес, который подписан на уведомление обсуждения. Несколько адресов указываются через запятую без пробела. Данный параметр дополняет параметр tape_user_id


tape_user_text

Слово, которое будет использовано в почтовом уведомлении при построении фразы: «Оставлен комментарий на вашу публикацию...» Если этот параметр не определён, в уведомлении будет использовано слово «публикацию». Примеры замены слова: на вашу новость, на вашу подписку, на вашу статью.


Примеры определения наружных ключей в HTML:

<input type= 'hidden' id= 'tape_user_id' value= '7,8,9,13' />
<input type= 'hidden' id= 'tape_user_text' value= 'подписку' />


Счётчик комментариев

Наиболее частой задачей, связанной со взаимодействием между модулем комментариев и битрикс-системой, является получение счётчика комментариев по обсуждению на определённой странице. Типичная ситуация: запущен раздел новостей, на детальной странице каждой из которых открыто обсуждение с помощью модуля комментариев. Необходимо при добавлении/изменении комментариев обновлять счётчик в карточке новости.

Ситуация со стороны модуля

Согласно ключевой логике привязки обсуждения к урлу страницы, в качестве идентификатора конкретного обсуждения, система комментариев хранит значение адреса страницы. Для того, чтобы стало возможным отслеживание счётчиков комментариев в обсуждениях, модулем инициируется событие onAfterCounterUpdate. Данное событие возникает в тот момент, когда обновляется счётчик определённого обсуждения: добавление и удаление комментариев, заморозка и разморозка веток. Именно это событие следует отслеживать.

По событию модуль передаёт массив с ключами:

  • IBLOCK_ID — код инфоблока обсуждения;
  • URL — урл страницы, в обсуждении которой изменился счётчик;
  • COUNTER — значение счётчика комментариев.

Ситуация со стороны других инфоблоков

Каждая новость — это элемент инфоблока. Чтобы обновить индикатор комментариев, необходимо знать:

  • ID элемента;
  • код свойства, в котором хранится значение счётчика комментариев;
  • число комментариев, оставленных на странице данного элемента.

ID элемента

Как правило, адрес детальной страницы задаётся шаблоном в настройках инфоблока и содержит один из уникальных идентификаторов: либо код новости (ID элемента), либо символьный код (поле CODE).

Некоторые примеры урлов для элемента со значением ID= 76:

  • /news/detail.php?ID=76
  • /catalogue/detail.php?SECTION_ID=34&ID=76
  • /catalogue/tractor/76.php
  • /topic/news/city/design/76/

Примеры урлов с использованием символьного кода элемента CODE= 'hot_weather':

  • /news/detail.php?CODE=hot_weather
  • /catalogue/detail.php?SECTION_ID=34&CODE=hot_weather
  • /catalogue/tractor/hot_weather.php
  • /topic/news/city/design/hot_weather/

Зная урл детальной страницы новости, с помощью регулярных выражений не составит труда получить его уникальный идентификатор. Таким образом определяется ID новости. Если в урле используется символьный код, ID новости определяется в результате поиска элемента по символьному коду.


Код свойства для хранения счётчика комментариев

В качестве свойства элемента инфоблока, в котором хранится значение счётчика комментариев, «традиционно» используется свойство FORUM_MESSAGE_CNT типа «строка». Оно было задано разработчиками Битрикса при введении в эксплуатацию модуля форумов. Рекомендуется использовать именно его. Если свойствах элементов инфоблока, на страницах которых проводится обсуждение, нет данного свойства — его следует создать.

Связка — реакция на событие

Итак, модуль будет генерить событие onAfterCounterUpdate обновления счётчика в определённом обсуждении в том случае, если мы инициируем отслеживание этого события. Отслеживание события проводится в файле
/bitrix/php_interface/init.php

Вот пример строки, которая инициирует отслеживание:

AddEventHandler(
"alexeygfi.realcommenter",
"onAfterCounterUpdate",
Array(
"realhandler",
"counter_update"
),
10
);
где:
  • alexeygfi.realcommenter — модуль, чьё событие мы будем ожидать
  • onAfterCounterUpdate — какое событие отслеживаем
  • realhandler — класс, который содержит функцию-обработчик
  • counter_update — функция-обработчик.

Функция-обработчик будет вызвана в ответ на событие, в качестве аргументов ей будет передан указатель на массив, передаваемый модулем.

Пример функции-обработчика. Может быть определена прямо в файле init.php. Блок определения ID элемента (выделен полужирным шрифтом) следует переписать согласно шаблона урла, используемого в вашем инфоблоке:

class realhandler {
function counter_update ( &$arFields ) {

if ( !$arFields[ 'URL' ] || !isset( $arFields[ 'COUNTER' ] ) ) {
return;
}

//Определяем по урлу ID элемента, которому обновим свойство FORUM_MESSAGE_CNT
if ( preg_match( "!\/(\d*)\$/!i", $arFields[ 'URL' ], $matches ) ) {
$topic_id= $matches[ 1 ];
CIBlockElement::SetPropertyValueCode( $topic_id, 'FORUM_MESSAGE_CNT', $arFields[ 'COUNTER' ] );
}


} // end of function
} //end of realhandler