テーマコンポーネント vs プラグイン:違いは何か

@tshenry さん、ありがとうございます。グループオーナーのコードが私の環境で機能しなかった理由はよくわかりません。おそらく、プラグインのセットアップ方法に起因するものだと思います。

AJAX アプローチは「MVP(最低限の実用製品)」として機能することを確認しました。余談ですが、[forum-url]/groups.json に API リクエストを送信することで、サイト内のすべてのグループを取得でき、そこからループ処理を行うことができるはずです。そのため、複数の呼び出しを行う必要はありません。

以下の点についてお伺いしたいのですが:

– AJAX/JSON API アプローチにおいて、特定のページにユーザーが移動した時のみ関数を実行させる方法はご存知でしょうか?現在、カスタマイズダッシュボードの </head> セクションに AJAX コードを配置すると動作しますが、サイトが読み込まれるたびに実行されてしまいます(グループインデックスページが読み込まれた時のみ実行させたいのです)。

– 私の場合、AJAX を使用している理由は、グループオーナーを表示するだけでなく、私が追加しようとしているいくつかの新しいグループ属性も表示する必要があるためです。これらは、取得して表示しようとしているグループのカスタムフィールドのようなものです。現時点では(Discourse のコードベースの仕組みをまだ学習中であるため)、MVP 版として、これらのデータを Discourse 以外の別のデータベースに保存し、そこから取得してグループインデックスページに追加する方法をとっています。

もちろん、よりクリーンな解決策としては、Discourse のデータベース内のグループにこれらのカスタム属性を追加し、それらを呼び出す方法があります。ここで必要な作業の種類を見極めたいと考えています。これには、多くの Discourse ファイル(コントローラー、モデル、テンプレートなど)の書き直しが必要になるでしょうか?

機会があれば、これを小さな GitHub リポジトリにアップロードします。

それが所有者データへのアクセスを提供するとは思いませんが、何か見落としているかもしれません。

ご質問への回答です:

  1. 以前リンクしたテーマコンポーネントは、Ajax 呼び出しが /latest またはホームページでのみ実行されるようにするための似た処理を行っています。そのアイデアをベースに構築することをお勧めします:discourse-featured-topics/common/head_tag.html at ddf3d7e003423e2e5f83446a80cab78d51f09e2d · awesomerobot/discourse-featured-topics · GitHub

    また、まだ確認されていない場合は、Developing Discourse Themes & Theme Components をぜひご覧ください。

  2. カスタムユーザーフィールド のような「カスタムグループフィールド」という組み込みの概念は存在しません。それを機能させるために必要なすべての要素を追加するプラグインを開発する必要があると思います。

その通りです。見落としていました。現在、それは別のデータベースに保存しており、AJAX(およびその他の仕組み)で呼び出しています。

素晴らしいアイデアですね。あのリポジトリの if ((url == "/") || (url == "/latest") ) の実装を見ました。似たようなアプローチが取れそうです。

はい、そのガイドをはじめ、見つけられる限りの他のガイドも読みました。素晴らしいガイドですが、そのガイド(や meta の他の記事)の内容を実際のこのようなカスタマイズに落とし込むのは難しいと感じています。これらのカスタマイズを行うには、Discourse のコードベースにおいてテンプレート、コントローラー、モデルがどのように連携しているかを深く理解する必要があるようです。

余談

Ember はパフォーマンスの高いアプリ構築には優れたシステムですが、異なるファイル間の関係を把握するのは難しいと感じています。例えば、Github リポジトリ内のビューから適切なテンプレートを見つけても、そのテンプレートが他のどのテンプレートとリンクしているか、あるいはどのコントローラーやモデルが関連しているかはほとんど分かりません。不可能ではありませんが、時間がかかり、これらのカスタマイズを行うにはそれらの関係を理解している必要があります。

一方、Angular では、ビューコンポーネントの部品が通常、html、typescript、css ファイルとして一緒にグループ化されており、他の関連ファイルもこれらのファイル内で明確にマークされています(使用されているサービスは typescript ファイルで、挿入される他のコンポーネントは html ファイルで明確に示されています)。Discourse の Ember 構造ではそのような仕組みにはなっていないようですが(その構造を否定するわけではありません。非常に安定しており、パフォーマンスも極めて高いアプリです)、慣れるまで時間がかかります。

そのため、Discourse の構成要素がどのように連携しているかを理解しようとしつつ、同じ結果を得るために AJAX などの手法を使っています。