Все комментарии накапливаются в хайлоадблоках. Они создаются при инсталляции модуля и при удалении модуля остаются нетронутыми.
Урл страницы — уникальный и универсальный идентификатор страницы. Логика использования такого подхода описана в логике привязки обсуждения к адресу, механизм получения реального урла страницы — в секции GET-ключи настроек модуля.
Урлы (ветки обсуждений) накапливаются в хайлоадблоке «RCM::Урлы (главные узлы)». Комментарии накапливаются в хайлоадблоке «RCM::Комментарии», привязка к ветке обсуждения — по полю UF_URL_ID
Любое редактирование и модерация комментариев производится прямо на странице. Это тем более рекомендовано, поскольку через операции в публичном разделе отслеживаются события, отвечающие за поддержание кешированных данных в актульном состоянии. Редактирование сообщений через административный раздел — скорее исключение, чем правило. В любом случае, нюансы возникают только в вопросах актуальности кеша, который можно сбросить через инструменты сброса кеша (как в публичной части так и в админке).
Не редки случаи, когда системе уведомлений о новых комментариях нужно выйти за рамки модуля. Например, уведомлять автора публикации (зарегистрированного пользователя) или рассылать уведомления о новом комментарии по списку специальных адресов (организовать подписку на обсуждение). Для того, чтобы сделать это возможным, модуль отслеживает специальные наружные параметры. Их следует определить в виде input полей типа hidden в любом месте страницы. Предназначение поля определяется значением его id-аттрибута .
Типичная ситуация: на странице с обсуждением размещается компонент, отрабатывающий типовое действие, например: публикацию новости или статьи или карточку товара. Нет проблем в вывод компонента добавить публикацию input:hidden полей. Такие поля будут найдены и обработаны механизмом модуля.
Главный заголовок, характеризующий страницу, на которой размещено обсуждение. Уникальность модуля, заключающаяся в том, что его можно разместить на абсолютно любой странице, не позволяет технически верно определить и характеризовать страницу, на которой размещено обсуждение, иначе как по адресу страницы. Однако адрес страницы в уведомлении администратору и модератору — недостаточный ориентир. Для того, чтобы модераторам в уведомлении дать чёткий ориентир, характеризующий страницу, с которой создано уведомление, предусмотрен данный параметр. Как правило он содержит название новости или название товара или объявления.
Пример использования:
<input type="hidden"
id="tape_general_title"
value="Объявление: Продам двухкомнатную квартиру">
Слово, которое будет использовано в почтовом уведомлении при построении фразы: «Оставлен комментарий на вашу ***...» Если этот параметр не определён, в уведомлении будет использовано слово «публикацию». Примеры замены слова: на вашу новость, на вашу подписку, на вашу статью.
Пример использования:
<input type="hidden"
id="tape_user_text"
value="рецензию">
Код зарегистрированного пользователя (например, автора статьи или подписавшегося на слежение за обсуждением статьи / новости / товара). Несколько пользователей указываются через запятую без пробела. У указанного пользователя будет прочитан электронный адрес и отправлено уведомление про новый комментарий в обсуждении. Данный параметр дополняет параметр tape_user_email
Пример использования:
<input type="hidden"
id="tape_user_id"
value="13456,20056">
Электронный адрес (например, автора статьи или подписавшегося на слежение за обсуждением статьи / новости / товара). Несколько адресов указываются через запятую без пробела. Данный параметр дополняет параметр tape_user_id
Пример использования:
<input type="hidden"
id="tape_user_email"
value="info@burlaka.studio,alexeygfi@gmail.com">
Наиболее частой задачей, связанной со взаимодействием между модулем комментариев и битрикс-системой, является получение счётчика комментариев по обсуждению на определённой странице. Типичная ситуация: запущен раздел новостей, на детальной странице каждой из которых открыто обсуждение с помощью модуля комментариев. Необходимо при добавлении/изменении комментариев обновлять счётчик в карточке новости, чтобы вывести индикатор количества комментариев под новостью.
Согласно ключевой логике привязки обсуждения к урлу страницы, в качестве идентификатора конкретного обсуждения, система комментариев хранит урл страницы. Урл — главный узел обсуждения на странице, — хранится в хайлоадблоке «RCM::Урлы (главные узлы)», счётчик комментариев хранится в поле UF_COMMENTS_INSIDE. Каждое изменение структуры обсуждения (новый комментарий, редактирование, удаление, деактивация, рецензирование) приводит, кроме всего прочего, к инициализации событий изменения узла: OnBeforeUrlUpdate и OnAfterUrlUpdate. Особенность и удобство в том, что до указанных событий дело доходит тогда, когда нужно действительно внести изменения в параметры урла. Если стоит задача «пробросить» в элемент/раздел инфоблока счётчик комментариев, рекомендуется подписаться на одно из данных события и обработать входящие данные.
Каждая новость (статья, товар) — это, как правило, элемент инфоблока. Чтобы обновить индикатор комментариев, необходимо знать:
ID элемента
Как правило, адрес детальной страницы задаётся шаблоном в настройках инфоблока и содержит один из уникальных идентификаторов: либо код новости (ID элемента), либо символьный код (поле CODE).
Некоторые примеры урлов для элемента со значением
ID= 76
:
Примеры урлов с использованием символьного кода элемента
CODE= 'hot_weather'
:
Зная урл детальной страницы новости, с помощью регулярных выражений не составит труда получить его уникальный идентификатор. Таким образом определяется ID новости. Если в урле используется символьный код, ID новости определяется в результате поиска элемента по символьному коду.
Код свойства для хранения счётчика комментариев
В качестве свойства элемента инфоблока, в котором хранится значение счётчика комментариев, «традиционно» используется свойство FORUM_MESSAGE_CNT типа «строка». Оно было задано разработчиками Битрикса при введении в эксплуатацию модуля форумов. Рекомендуется использовать именно его. Если в свойствах элементов инфоблока, на страницах которых проводится обсуждение, нет данного свойства — его следует создать.
Чтобы реализовать задачу, нужно подписаться на событие. В примере ниже мы подписываемся на событие OnBeforeUrlUpdate.
$eventManager= \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler(
'burlakastudio.realcommenter',
'OnBeforeUrlUpdate',
[ 'COMMENTS_LOOKUP', 'catch_counter' ]
);
В результате, если модулем будет выброшено событие OnBeforeUrlUpdate, вызовется функция catch_counter класса COMMENTS_LOOKUP.
Как могла бы выглядеть функция, реагирующая на событие:
class COMMENTS_LOOKUP {
function catch_counter( \Bitrix\Main\Event $event ) {
$record_Fields= $event->getParameter( 'record_Fields' );
// Количество комментариев на урле
$comments_counter= $record_Fields[ 'UF_COMMENTS_INSIDE' ];
// На каком урле нас вызвали
$request= \Bitrix\Main\Context::getCurrent()->getRequest();
$url= $request->getRequestedPage();
// Определяем ID элемента по урлу
(...)
// Обновляем счётчик у элемента, ID которого мы определили
(...)
}
}