Блог на сайте - записи, черновики, комментарии и права
Блог на сайте нужен там, где статьи пишет автор, а читатели их обсуждают. Штатный модуль блогов даёт эту связку без инфоблоков, но живёт по своим правилам, и первое из них видно уже на этапе установки.
Решение
Группа блогов и блог автора
Заводим структуру в административном разделе:
Настройки → Настройки модулей → Блоги # лимиты, права, 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, а редиректы и лишние шаги при авторизации ломают публикацию совсем.
Что выбрать под блог компании: модуль блогов или инфоблок?
Модуль блогов даёт готовые записи, комментарии, теги и черновики. Инфоблок гибче по полям и выводу, но комментарии к нему подключают отдельно на движке форума.
Смежное
- Сообщества на сайте - оглавление подтемы
- Блоги, форумы, опросы и медиабиблиотека - концепт раздела про контентные модули
- Комментарии и отзывы к контенту - комментарии к элементам инфоблока на движке форума
- Группы пользователей - откуда берутся идентификаторы групп в правах записи
- Права не применяются - если права выставлены, а доступ не изменился
- Шаблон чужого компонента - как править вывод блога, не трогая ядро
- Правки шаблона не видны - когда изменённый шаблон блога не доезжает до витрины
- Пользовательское поле - свои поля для записи и её вывода
- Опрос на сайте - соседний контентный модуль с той же процедурной моделью
- Форум на сайте: группы, права участников, темы и модерация - форум как отдельный раздел обсуждений
- Медиабиблиотека и видео: коллекции, права, плеер - общее хранилище файлов для записей