save()をオーバーライドする際のmodifyClass("model:composer")の推奨代替手段

非推奨の api.modifyClass("model:composer", ...) から移行しています。

現在の Composer#save のオーバーライドは保存動作を条件付きで変更しますが、それ以外の場合は super.save(opts) を呼び出す必要があります。

新しい addModelMethod / addModelCallback API は確認しましたが、コア内で addModelMethod を使用して既存のメソッドをオーバーライドしつつ、元の実装へのアクセスを維持する例を見つけることができませんでした。

addModelMethod は、このように既存のモデルメソッドをオーバーライドすることを意図していますか?もしそうであれば、プラグインは元の save() 実装にどのように委譲すべきでしょうか?

あるいは、この Composer のユースケースには別の拡張ポイントを使用すべきでしょうか?

save メソッドを上書きして何を実現したいかによっても異なるでしょうね。

特定の条件に基づいて保存を防止したい場合は、composer-service-cannot-submit-post 値トランスフォーマー を使用できます。

投稿が作成された後に何かを実行したい場合は、api.onAppEvent("post:created") が利用できます。

フィールドを追加したい場合は、api.serializeOnCreate を使用します。

これらのいずれかが、あなたが求めているものに近いでしょうか?

ありがとうございます!composer-service-cannot-submit-post はすでに使用しています。これはサービスレベルのチェックを処理してくれます。ただし、composer モデルの save()cantSubmitPost をチェックしており、これには missingReplyCharacters > 0 が含まれるため、空の本文はここでブロックされてしまいます。

onAppEvent("post:created") では手遅れで、投稿は作成されません。また、serializeOnCreate はリクエストにフィールドを追加するだけなので、本文の長さの検証には役立ちません。

したがって、残っている問題は、最初の投稿に対して missingReplyCharacters / cantSubmitPost をバイパスすることです。これに対応するサポートされている拡張ポイント(extension point)はありますか?

参考までに、現在のイニシャライザーのコードです:

@david 、ここではどのアプローチが最適かについて、ご意見があればぜひ聞かせてください。

ベストな方法は、Discourseのコアに新しいフックを追加して、サポートされている方法で必要なことを実現できるようにすることです。例えば、次のようなものはどうでしょう:

そうすることで、プラグインは以下のように動作します。

api.registerValueTransformer(
  "composer-minimum-post-length",
  ({ value, context: { composer } }) => {
    if (
      composer.siteSettings.discourse_optional_topic_body_enabled &&
      composer.topicFirstPost
    ) {
      return 0;
    }

    return value; // コアロジックを維持
  }
);

この方法があなたのユースケースで機能するかどうかを教えてもらえますか?もし問題なければ、PRをドラフトから解除して、レビュー/マージを進められます。

Davidさん、ありがとうございます!composer-minimum-post-length トランスフォーマーをテストしてみましたが、正常に動作しています。本文が空のトピックも正常に作成されました。

1点気づいたことがありますが、composer-editorvalidation には minimumPostLength を使用しないハードコードされた replyLength < 1 チェックがあるため、エディターにはまだ 「投稿は空にできません」 というエラーが表示されます。

このチェックもトランスフォーマーを尊重するようにするか、minimumPostLength0 の場合はスキップするようにすることは可能でしょうか?

いいですね。PRに追加しました :+1:

今では完璧に動作しています。@davidさん、この機能を追加してくれて本当にありがとうございます!:raising_hands: