Полноценные комментарии D7 под Битрикс
 

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

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

Обсуждения

Все комментарии накапливаются в хайлоадблоках. Они создаются при инсталляции модуля и при удалении модуля остаются нетронутыми.

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

Урлы (ветки обсуждений) накапливаются в хайлоадблоке «RCM::Урлы (главные узлы)». Комментарии накапливаются в хайлоадблоке «RCM::Комментарии», привязка к ветке обсуждения — по полю UF_URL_ID

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

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

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

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

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

tape_general_title

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

Пример использования:

<input  type="hidden"
	id="tape_general_title"
	value="Объявление: Продам двухкомнатную квартиру">

tape_user_text

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

Пример использования:

<input  type="hidden"
	id="tape_user_text"
	value="рецензию">

tape_user_id

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

Пример использования:

<input  type="hidden"
	id="tape_user_id"
	value="13456,20056">

tape_user_email

Электронный адрес (например, автора статьи или подписавшегося на слежение за обсуждением статьи / новости / товара). Несколько адресов указываются через запятую без пробела. Данный параметр дополняет параметр 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 элемента

Как правило, адрес детальной страницы задаётся шаблоном в настройках инфоблока и содержит один из уникальных идентификаторов: либо код новости (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 типа «строка». Оно было задано разработчиками Битрикса при введении в эксплуатацию модуля форумов. Рекомендуется использовать именно его. Если в свойствах элементов инфоблока, на страницах которых проводится обсуждение, нет данного свойства — его следует создать.

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

Чтобы реализовать задачу, нужно подписаться на событие. В примере ниже мы подписываемся на событие 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 которого мы определили
		(...)
	}
}