Перейти к содержимому

Блог на сайте - записи, черновики, комментарии и права

Блог на сайте нужен там, где статьи пишет автор, а читатели их обсуждают. Штатный модуль блогов даёт эту связку без инфоблоков, но живёт по своим правилам, и первое из них видно уже на этапе установки.

Решение

Группа блогов и блог автора

Заводим структуру в административном разделе:

Настройки → Настройки модулей → Блоги # лимиты, права, SEO, шаблоны путей
Сервисы → Блоги → Группы блогов # минимум одна группа, иначе список пуст
Сервисы → Блоги → Блоги # блог автора внутри выбранной группы
Сервисы → Блоги → Комментарии # страница модерации комментариев

Порядок здесь не украшение, а требование модуля: компонент блогов без единой группы отдаёт пустой список. Один пользователь ведёт ровно один блог, и второй блог тому же автору завести нельзя.

Проверяем блог автора из кода:

\Bitrix\Main\Loader::includeModule('blog');
$blog = \CBlog::GetByOwnerID($userId); // один пользователь - один блог
if (!$blog) {
throw new \RuntimeException('блога у автора нет, писать записи некуда');
}

Сообщение «Блог не найден» на публичной части означает ровно это: пользователь заведён, а блога у него нет. Модуль блогов процедурный и работает без ORM, поэтому выборка возвращает обычный массив полей.

Вывод блога на публичной части

Ставим комплексный компонент на страницу:

Компонент: bitrix:blog # список блогов, страница записи, комментарии
Условие: заведена хотя бы одна группа блогов
Параметры: шаблоны путей к блогу, записи и автору
Форма: галки согласия на обработку персональных данных

Компонент комплексный: он сам разбирает адрес страницы и рисует список, запись и ленту комментариев. Ставить рядом отдельный компонент списка или комментариев не нужно и даже вредно: посетитель увидит дубли.

Запись, черновик и публикация

Создаём запись сразу опубликованной:

$postId = \CBlogPost::Add([
'BLOG_ID' => $blog['ID'],
'AUTHOR_ID' => $userId,
'TITLE' => 'Как мы считали остатки',
'DETAIL_TEXT' => $text,
'DETAIL_TEXT_TYPE' => 'html', // альтернатива - простой текст
'PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH,
'ENABLE_COMMENTS' => 'Y',
]);

Черновик отличается от готовой записи только статусом публикации: он сохраняется в базе, но в публичную ленту не попадает. Адрес записи модуль собирает из заголовка на латинице, поэтому заголовок сразу определяет ссылку.

Публикуем черновик и читаем ошибку:

if (!\CBlogPost::Update($postId, ['PUBLISH_STATUS' => BLOG_PUBLISH_STATUS_PUBLISH])) {
echo $APPLICATION->GetException()->GetString(); // текст ошибки живёт здесь
}

Классы блога не возвращают объект результата, как это делает D7: о неудаче говорят false и исключение приложения. Проверять результат надо после каждой записи и каждой правки, иначе ошибка потеряется молча.

Комментарии, права и картинки

Ограничиваем чтение и комментирование записи:

\CBlogPost::Update($postId, [
'ENABLE_COMMENTS' => 'Y',
'PERMS_POST' => [2 => BLOG_PERMS_READ], // 2 - все пользователи
'PERMS_COMMENT' => [1 => BLOG_PERMS_WRITE], // 1 - администраторы
]);

Ключ массива - идентификатор группы пользователей, значение - уровень доступа. Закрытый блог собирается тем же способом: чтение оставляют одной группе, а остальным не выдают ничего.

Права блога двухуровневые, и верхнюю границу задаёт не владелец. Администратор выставляет максимальные права групп в настройках модуля, а владелец блога выбирает свои уже внутри этого потолка. Комментарии модерируются отдельной страницей административного раздела, очереди на публичной части у модуля нет.

Проверяем настройки изображений и прав:

Настройки модулей → Блоги → Права на доступ
Максимальные права на сообщения для групп пользователей блога
Проверять права для изображений # без флага картинка видна всем
Вкладка настроек: предельные размеры аватара и картинки записи

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

Типичные проблемы

Список блогов на странице пустой.

Не заведено ни одной группы блогов, а компоненту нужна хотя бы одна. Сами блоги при этом созданы и видны в административном разделе, поэтому причину ищут не там.

«Блог не найден» у части пользователей.

Блог автору не создан: модуль установлен, группы совпадают, а записи писать некуда. Блог заводят по одному разу на каждого пользователя, вручную в админке или из кода.

Галка визуального редактора стоит, а редактора в форме нет.

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

Картинка закрытой записи открывается по прямому адресу.

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

Call to undefined method CBlogPost::NotifyMail().

Шаблон или компонент остался от прошлой сборки и зовёт метод, которого в модуле уже нет. Всплывает после частичного обновления платформы, когда файлы компонента в публичной части остались старыми.

Частые вопросы

Как запретить комментирование в блоге?

У отдельной записи - полем ENABLE_COMMENTS со значением N. Для всего блога комментирование закрывают правами: группе просто не выдают уровень записи в PERMS_COMMENT.

Можно ли завести пользователю несколько блогов?

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

Как добавить свои поля к записи блога?

Пользовательскими полями сущности записи. Ни в форме, ни на витрине они не появятся сами: поле выводит шаблон компонента, поэтому шаблон придётся править.

Можно ли публиковать записи из внешнего блог-клиента?

Да, через MetaWeblog API поверх XML-RPC. Медиафайлы клиент всё равно грузит по FTP, а редиректы и лишние шаги при авторизации ломают публикацию совсем.

Что выбрать под блог компании: модуль блогов или инфоблок?

Модуль блогов даёт готовые записи, комментарии, теги и черновики. Инфоблок гибче по полям и выводу, но комментарии к нему подключают отдельно на движке форума.

Смежное

Первоисточник