Skip to content

Модерация (PRO)

Очередь объектов, ждущих проверки: неопубликованные строки таблиц, помеченных флагом Модерация. Модератор видит их одним списком — значком с числом в верхней панели менеджера и виджетом на дашборде.

Включается в два приёма

  1. Системная настройка pageblocks_moderation — выключатель всей ветки. По умолчанию выключена.
  2. Галочка «Модерация» у таблицы — в конструкторе таблиц.

Порядок обязателен: пока настройка выключена, второго шага не существует вовсе.

Отсюда почти все «у меня этого нет в менеджере»

Выключенная настройка не прячет одну кнопку — она убирает ветку целиком: галочки в форме таблицы нет, значка в панели и виджета на дашборде нет, отметки не ставятся, очередь пуста. Ничего при этом не ломается и не сообщается, поэтому со стороны выглядит как отсутствующая возможность. См. Системные настройки.

Колонка 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():

php
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 пишется предупреждение с именем миграции. Падения не будет: ронять страницу из-за неприменённой миграции — плохой обмен.

© PageBlocks 2019-present