Комментарии и отзывы к контенту - форум как движок, модерация
Добавляем комментарии к новостям, статьям и товарам: форум в роли движка отзывов, два способа подключения, модерация и права участников.
Механика
Комментарии к элементам не заводятся отдельной установкой модуля комментариев, потому что такого модуля в поставке нет. За хранение сообщений, права участников и модерацию отвечает модуль форума, знакомый по обычным обсуждениям.
Отзывы к элементу инфоблока включаются прямо параметрами комплексного компонента новостей в режиме детального просмотра. Отдельный компонент при таком способе ставить не нужно, потому что комплексный подключит форму отзывов сам.
Форум под отзывы создают заранее и настраивают ему права, иначе указывать в параметрах будет попросту нечего. Шаблон компонента обязан рисовать участок с отзывами, иначе включённые параметры не изменят страницу совсем.
Второй способ подключения - отдельный компонент комментариев, который живёт вне комплексного и получает элемент параметрами. Он подходит там, где элементы выводятся своим кодом или требуется собственный порядок вывода сообщений.
Тема форума под каждый элемент создаётся сама при первом сохранённом комментарии посетителя сайта. Заводить темы руками не требуется, а название темы платформа берёт из названия самого элемента.
Модерация ведётся обычной страницей форума с отбором нужного форума, потому что отдельного интерфейса модерации в платформе нет. Права на комментирование - это права форума для гостей, зарегистрированных пользователей и модераторов.
Голосование за элемент работает на своём модуле, включается отдельным параметром и хранит данные отдельно. Отзывы о товаре со звёздами и средней оценкой обычно собирают своей сущностью, а не сообщениями форума.
Шаги
- Определить заранее, что нужно проекту: комментарии, отзывы с оценкой или обсуждение.
- Создать форум под комментарии и настроить права доступа для нужных групп.
- Включить отзывы параметрами детального просмотра и указать идентификатор готового форума.
- Проверить на странице элемента, что шаблон компонента рисует блок отзывов.
- Для нестандартных мест вывода поставить отдельный компонент комментариев с элементом.
- Завести страницу модерации на компоненте форума с отбором по форуму.
Код
Проверяем, что форум под комментарии готов:
\Bitrix\Main\Loader::includeModule('forum');$forum = \CForumNew::GetByID($forumId); // форум создают заранее, рукамиprintf("форум=%s активен=%s\n", $forum['NAME'], $forum['ACTIVE']);// неактивный форум и форум без прав выглядят на сайте одинаково: блока нетПроверка форума занимает секунду и снимает половину вопросов о пропавшем блоке комментариев. Неактивный форум и форум без прав для нужных групп на витрине неотличимы: формы не видно ни в одном из случаев.
Включаем отзывы параметрами комплексного компонента:
$APPLICATION->IncludeComponent('bitrix:news', '', [ 'USE_REVIEW' => 'Y', // разрешить отзывы на детальной странице 'FORUM_ID' => $forumId, // тот самый форум, созданный заранее 'USE_RATING' => 'Y', // голосование живёт на собственном модуле 'SHOW_RATING' => 'Y', // вывод оценки рядом с названием элемента]);Комплексный компонент сам подключает форму отзывов на детальной странице элемента. Ставить рядом с ним ещё один компонент комментариев не нужно и вредно: посетитель увидит два независимых списка сообщений.
Подключаем отдельный компонент комментариев:
$APPLICATION->IncludeComponent('bitrix:forum.topic.reviews', '', [ 'FORUM_ID' => $forumId, 'IBLOCK_TYPE' => 'content', 'IBLOCK_ID' => $iblockId, 'ELEMENT_ID' => $elementId, // тема форума заведётся при первом отзыве 'URL_TEMPLATES_READ' => '', // ссылки на разделы форума витрине не нужны]);Отдельный компонент нужен там, где элемент выводится собственным кодом шаблона. Он получает идентификатор элемента и сам находит или создаёт под него тему форума при первом сохранённом сообщении посетителя.
Считаем комментарии элемента для счётчика в списке:
$res = \CForumMessage::GetList([], ['FORUM_ID' => $forumId, 'PARAM2' => $elementId]);printf("сообщений: %d\n", $res->SelectedRowsCount());// счётчик в списке элементов собирают одним запросом на страницу, не в циклеЧисло комментариев рядом с заголовком - обычное требование редакции к списку новостей. Считать его отдельным запросом на каждый элемент дорого, поэтому счётчики собирают одним запросом сразу на всю страницу списка.
Включаем премодерацию у форума комментариев:
\CForumNew::Update($forumId, [ 'MODERATION' => 'Y', // сообщение видно после подтверждения 'ALLOW_HTML' => 'N', // теги от посетителей витрине не нужны 'ALLOW_UPLOAD' => 'N', // вложения в комментариях чаще всего лишние]);// те же поля правятся в настройках форума в административном разделеПремодерация - обычное требование для витрины, где комментарии видят все посетители. Она включается настройкой форума, а не параметром компонента, и поэтому действует сразу на оба способа подключения комментариев.
Заводим страницу модерации на компоненте форума:
$APPLICATION->IncludeComponent('bitrix:forum', '', [ 'SHOW_FORUMS' => 'SELECTED', 'FORUMS' => [$forumId], // страница модерации по одному форуму]);// отдельного раздела модерации комментариев в платформе нет вообщеМодерация ведётся обычной страницей форума с отбором по нужному форуму. Модератору выдают права на этот форум, и дальше он работает с комментариями витрины как с любыми другими сообщениями обсуждений.
Ловим новый комментарий своим обработчиком события:
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'forum', 'onAfterMessageAdd', static function ($id, $arFields) use ($forumId) { if ((int)$arFields['FORUM_ID'] !== $forumId) { return; } // здесь шлют письмо редактору или ставят задачу на проверку текста });Событие добавления сообщения - штатная точка для уведомления о новом отзыве. Тяжёлую работу вроде проверки текста внешним сервисом из обработчика выносят в очередь, чтобы посетитель не ждал ответа чужого сервера.
Ограничения
Комментарии живут в таблицах форума, а не внутри инфоблока с элементами. Перенос элементов между инфоблоками и сайтами эту связь автоматически не сохраняет, потому что она построена на идентификаторе элемента.
Оценка со звёздами - это не комментарий и хранится отдельно от текста сообщения. Товарные отзывы с рейтингом обычно собирают своей сущностью, где оценка и текст лежат в одной записи и попадают в фильтр.
Интерфейс форума не выглядит как современные комментарии на витрине магазина. Вёрстку приходится переделывать шаблоном компонента, а заметная часть возможностей форума на странице товара оказывается лишней.
Модерация требует короткого обучения редакции перед запуском раздела. Она ведётся в интерфейсе форума, и без объяснения сотрудники ищут новые комментарии в разделе с новостями и не находят их там.
Поиск по сайту находит комментарии как сообщения форума, а не как часть новости. Для витрины это иногда неожиданно, и такие результаты либо оформляют отдельно, либо исключают из выдачи настройками поискового компонента.
Типичные проблемы
Параметры отзывов включены, а блока на странице нет.
Шаблон компонента не рисует участок с отзывами. Параметры включают механизм, но вывод остаётся за шаблоном.
Комментарии не сохраняются у гостей.
У форума нет прав на добавление сообщений для неавторизованных. Права комментирования - это права самого форума.
На странице два разных списка комментариев.
Отзывы включены параметрами компонента и рядом стоит отдельный компонент комментариев. Оставляют что-то одно.
После переноса элементов комментарии потерялись.
Связь темы форума с элементом идёт по идентификатору. При переносе с новыми идентификаторами связь рвётся.
Редакция не находит, где модерировать комментарии.
Модерация ведётся страницей форума, а не разделом контента. Такую страницу заводят заранее и показывают сотрудникам.
Частые вопросы
Нужен ли отдельный модуль для комментариев?
Нет, движком служит форум из поставки. Отдельная установка не требуется, но форум под комментарии создают и настраивают заранее.
Чем отзывы отличаются от комментариев?
Технически ничем: и то, и другое - сообщения форума. Разница в названии блока и в том, включаются они параметрами компонента или отдельным компонентом.
Как сделать отзывы со звёздами для товаров?
Отдельной сущностью с оценкой и текстом или готовым решением. Форумные сообщения оценку не хранят, а средняя оценка товара нужна и в списке, и в фильтре.
Можно ли скрыть комментарии до проверки?
Да, настройкой премодерации у форума. Тогда сообщение появляется на сайте только после подтверждения модератором.
Где хранятся сами комментарии?
В таблицах модуля форума, привязанные к теме элемента. Инфоблок о них ничего не знает, и выборки элементов их не возвращают.
Смежное
- Обратная связь и заявки - оглавление подтемы
- Форма обратной связи: веб-форма, письма, свой обработчик - соседний способ собрать обратную связь
- Спам через формы сайта: капча, скрытое поле, ограничение частоты - защита формы комментария
- Отзывы о товаре: хранение, модерация, средняя оценка - отзывы с оценкой своей сущностью
- Права не применяются: разбор причин - права форума и групп
- Шаблон чужого компонента: копия вместо правки исходника - переделка вёрстки блока
- Опрос на сайте: голосование, результаты, повторное участие - голосование как отдельный модуль
- Модули и решения в 1С-Битрикс - устройство модулей целиком
- Форум на сайте: группы, права участников, темы и модерация - тот же движок как самостоятельный раздел