Я перехожу от устаревшего api.modifyClass("model:composer", ...).
В моей текущей переопределённой реализации Composer#save условно изменяется поведение сохранения, но в остальных случаях необходимо вызывать super.save(opts).
Я вижу новые API addModelMethod / addModelCallback, но не могу найти в ядре пример использования addModelMethod для переопределения существующего метода с сохранением доступа к исходной реализации.
Предназначен ли addModelMethod для переопределения существующих методов модели таким образом? Если да, как плагин должен делегировать вызов исходной реализации save()?
Или существует другая точка расширения, которую следует использовать для этого случая с Composer?
Думаю, это зависит от того, что именно вы хотите сделать, переопределяя метод сохранения…
Если вы хотите предотвратить сохранение на основе какого-либо условия, вы можете использовать наш преобразователь значенийcomposer-service-cannot-submit-post
Если вы хотите выполнить какое-то действие после создания поста, есть api.onAppEvent("post:created")
Если вы добавляете поле, есть api.serializeOnCreate
Спасибо! Я уже использую composer-service-cannot-submit-post — он обрабатывает проверку на уровне сервиса. Но метод save() модели композера также проверяет cantSubmitPost, который включает условие missingReplyCharacters > 0, поэтому пустое тело сообщения всё равно блокируется там.
onAppEvent("post:created") срабатывает слишком поздно, потому что сообщение так и не создаётся, а serializeOnCreate лишь добавляет поля в запрос, поэтому он не помогает с валидацией длины тела сообщения.
Таким образом, остаётся проблема обхода проверки missingReplyCharacters / cantSubmitPost для первого сообщения. Есть ли поддерживаемая точка расширения для этого?
Лучшим решением было бы добавить новый хук в ядро Discourse, который позволит вам реализовать нужную функциональность поддерживаемым способом. Как вам такой вариант:
Спасибо, Дэвид! Я протестировал трансформер composer-minimum-post-length, и он работает — темы с пустым содержимым успешно создаются.
Однако я заметил одну вещь: редактор по-прежнему выводит сообщение «Сообщение не может быть пустым», так как в composer-editor валидация содержит жёстко заданную проверку replyLength < 1, которая не учитывает minimumPostLength.
Можно ли так же, чтобы эта проверка учитывала трансформер, или пропускалась, когда minimumPostLength равно 0?