Модерация (PRO)
Очередь объектов, ждущих проверки: неопубликованные строки таблиц, помеченных флагом Модерация. Модератор видит их одним списком — значком с числом в верхней панели менеджера и виджетом на дашборде.
Включается в два приёма
- Системная настройка
pageblocks_moderation— выключатель всей ветки. По умолчанию выключена. - Галочка «Модерация» у таблицы — в конструкторе таблиц.
Порядок обязателен: пока настройка выключена, второго шага не существует вовсе.
Отсюда почти все «у меня этого нет в менеджере»
Выключенная настройка не прячет одну кнопку — она убирает ветку целиком: галочки в форме таблицы нет, значка в панели и виджета на дашборде нет, отметки не ставятся, очередь пуста. Ничего при этом не ломается и не сообщается, поэтому со стороны выглядит как отсутствующая возможность. См. Системные настройки.
Колонка moderation_at
Отмеченная таблица при сохранении конструктора получает колонку moderation_at (datetime, NULL, сразу за published_at) — её заводит компонент сам, писать миграцию не нужно. Снятая галочка колонку не убирает: данные удалять молча компонент не станет.
Индекса по ней нет, и это решение, а не недосмотр
Колонка почти целиком NULL, отбор очереди опирается на published_at, а на импортированной таблице в сотни тысяч строк построение индекса растянуло бы сохранение формы на минуты.
Что попадает в очередь
Строка попадает, когда выполнено всё сразу:
| Условие | Где это |
|---|---|
| Таблица помечена Модерация | pb_tables.moderated |
| У таблицы своя модель | Строки общей pb_table_data в очередь не попадают |
| Таблица опубликована и не удалена | published_at / deleted_at таблицы |
| Строка не опубликована | published_at IS NULL |
| У строки есть отметка | moderation_at не пуст |
| Строка не удалена | deleted_at IS NULL |
Условие «своя модель» стоит прочесть внимательно: таблица, которая хранит строки в общей pb_table_data, не модерируется даже с отмеченной галочкой. Очередь работает по таблицам со своей моделью и миграцией.
Отметку ставит ваш код
Компонент не решает за вас, что отправлять на проверку: сам по себе он строк не помечает. Отметку ставит прикладной код в момент создания объекта — фасадом ModerationQueue::stamp():
use Boshnik\PageBlocks\Support\ModerationQueue;
$city = PbCity::create(ModerationQueue::stamp((new PbCity)->getTable()) + [
'name' => $request->get('name'),
'country_id' => (int) $request->get('country_id'),
]);stamp() возвращает ['moderation_at' => now()] — или пустой массив, если модерация выключена настройкой либо колонки в таблице нет. Поэтому один и тот же контроллер работает и на площадке с модерацией, и без неё: лишнего поля в сохранение не попадёт и падения «Unknown column» не будет.
Одобрение — это публикация
Кнопок «одобрить» и «отклонить» в очереди нет, и это не пропуск. Клик по записи открывает объект тем же окном, что и глобальный поиск: модератор смотрит строку целиком, правит и публикует. Заполненный published_at убирает её из очереди — отбор идёт именно по нему.
Почему отметка и публикация разведены
moderation_at отвечает на «когда это отправили на проверку», published_at — на «видно ли это на сайте». Разделение намеренное: правку уже одобренной строки можно снова отправить на проверку, не убирая её тем временем с сайта.
Обратная сторона того же: сама по себе модерация ничего не прячет. Строка с отметкой — обычная строка, и если ваш шаблон выводит неопубликованные, посетитель их увидит. «Пока не показывать» делает published_at, а не очередь.
Где смотреть очередь
- Значок в верхней панели менеджера — с бейджем числа ожидающих (больше сотни показывается как
99+). - Виджет на дашборде — «Объекты, ожидающие модерации», тот же список.
Данные приходят двумя точками — mgr/pb/moderation для списка и mgr/pb/moderation/count для бейджа; обе требуют авторизации в менеджере и платной сборки.
Запись в списке называет таблицу, заголовок, родителя, автора и короткое описание из полей, чтобы модератору не приходилось открывать строку ради понимания, что это:
| Что показано | Откуда берётся |
|---|---|
| Заголовок | Первое непустое из pagetitle, name, title, subject; нет таких колонок — первое текстовое поле конструктора |
| Описание | До пяти пар «поле: значение»; файлы, галереи, вложенные таблицы и псевдонимы пропускаются, значения списков заменяются подписями |
| Автор | Первое непустое из author_id, user_id, created_by, author, user. Пользователь удалён — показывается #id, автора не записали вовсе — место пустое |
| Дата | Момент постановки в очередь, а не создания |
Сортировка — по дате постановки: объявление позапрошлого года, отправленное на проверку сегодня, стоит первым.
Объём и срок
Из каждой таблицы берутся 50 самых свежих строк очереди.
Параметр days ограничивает выдачу сверху по дате постановки: 0 (по умолчанию) — без ограничения, максимум 90. Ограничивать обычно незачем — отметку ставят поимённо, и объект, который ждёт проверки вторую неделю, из очереди пропадать не должен.
Таблица без колонки: окно в три дня
Если колонки moderation_at у таблицы нет — база старше включения модерации, а конструктор с тех пор не сохраняли, — компонент не падает, а переходит на запасное правило: неопубликованные строки, созданные за последние три дня. Переданный days это окно заменяет.
Поэтому на такой таблице очередь ведёт себя странно
Без колонки нет записи о том, когда строку отправили на проверку, — есть только когда её создали. Строка выпадает из очереди по возрасту, а не по решению модератора. Это защита от того, чтобы показать весь архив неопубликованного разом, а не режим работы: сохраните таблицу в конструкторе при включённой настройке — колонка заведётся, и отбор станет точным.
Очередь пуста, хотя всё включено
Колонка pb_tables.moderated приезжает миграцией ядра 10000000000019_add_moderated_to_pb_tables, а миграции ядра применяются руками. Пока её нет, очередь всегда пуста — и в лог MODX пишется предупреждение с именем миграции. Падения не будет: ронять страницу из-за неприменённой миграции — плохой обмен.